2017-09-04 1 views
0

Je travaille sur un projet de série temporelle en utilisant l'algorithme Long Short Memory.Je dois visualiser mes données prévisionnelles

J'ai besoin de prévoir la dernière colonne de out_meteo.csv en utilisant les autres colonnes comme caractéristiques. A la fin de l'algorithme, je ne peux pas tracer les valeurs correctes de mes données: Cela me donne des valeurs irréalistes et petites qui, je pense, sont liées aux attributs MinMaxScaler et inverse_transform.

est ici le code python i utilisé pour prévoir ma variable sans utiliser les autres fonctions (il fonctionne très bien)

import numpy 
import matplotlib.pyplot as plt 
from pandas import read_csv 
import math 
from keras.models import Sequential 
from keras.layers import Dense 
from keras.layers import LSTM 
from sklearn.preprocessing import MinMaxScaler 
from sklearn.metrics import mean_squared_error 

# convert an array of values into a dataset matrix 
def create_dataset(dataset, look_back=1): 
    dataX, dataY = [], [] 
    for i in range(len(dataset)-look_back-1): 
     a = dataset[i:(i+look_back), :] 
     dataX.append(a) 
     dataY.append(dataset[i + look_back, 0]) 
    return numpy.array(dataX), numpy.array(dataY) 

# fix random seed for reproducibility 
numpy.random.seed(7) 

# load the dataset 
dataframe = read_csv('out_meteo.csv', usecols=[5], engine='python', header=0) 
dataset = dataframe.values 
dataset = dataset.astype('float32') 

# normalize the dataset 
scaler = MinMaxScaler(feature_range=(0, 1)) 
dataset = scaler.fit_transform(dataset) 

# split into train and test sets 
train_size = int(len(dataset) * 0.7) 
test_size = len(dataset) - train_size 
train, test = dataset[0:train_size,:], dataset[train_size:len(dataset),:] 

# reshape into X=t and Y=t+1 
look_back = 3 
trainX, trainY = create_dataset(train, look_back) 
testX, testY = create_dataset(test, look_back) 

# reshape input to be [samples, time steps, features] 
trainX = numpy.reshape(trainX, (trainX.shape[0], 1, trainX.shape[1])) 
testX = numpy.reshape(testX, (testX.shape[0], 1, testX.shape[1])) 

# create and fit the LSTM network 
model = Sequential() 
model.add(LSTM(4, input_shape=(1, look_back))) 
model.add(Dense(1)) 
model.compile(loss='mean_squared_error', optimizer='adam') 
model.fit(trainX, trainY, epochs=15, batch_size=15, verbose=2) 

# make predictions 
trainPredict = model.predict(trainX) 
testPredict = model.predict(testX) 

# invert predictions 
trainPredict = scaler.inverse_transform(trainPredict) 
trainY = scaler.inverse_transform([trainY]) 
testPredict = scaler.inverse_transform(testPredict) 
testY = scaler.inverse_transform([testY]) 

# calculate root mean squared error 
trainScore = math.sqrt (mean_squared_error(trainY[0], trainPredict[:,:])) 
print('Train Score: %.2f RMSE' % (trainScore)) 
testScore = math.sqrt(mean_squared_error(testY[0], testPredict[:,:])) 
print('Test Score: %.2f RMSE' % (testScore)) 

# shift train predictions for plotting 
trainPredictPlot = numpy.empty_like(dataset) 
trainPredictPlot[:, :] = numpy.nan 
trainPredictPlot[look_back:len(trainPredict)+look_back, :] = trainPredict 

# shift test predictions for plotting 
testPredictPlot = numpy.empty_like(dataset) 
testPredictPlot[:, :] = numpy.nan 
testPredictPlot[len(trainPredict)+(look_back*2)+1:len(dataset)-1, :] = testPredict 
# plot baseline and predictions 
plt.plot(scaler.inverse_transform(dataset)) 
plt.plot(trainPredictPlot) 
plt.plot(testPredictPlot) 
plt.show() 

Je l'ai modifié pour lire toutes les caractéristiques (toutes mes colonnes csv) afin voici le dernier qui me donne une mauvaise parcelle

import numpy 
import matplotlib.pyplot as plt 
from pandas import read_csv 
import math 
from keras.models import Sequential 
from keras.layers import Dense 
from keras.layers import LSTM 
from sklearn.preprocessing import MinMaxScaler 
from sklearn.metrics import mean_squared_error 

# convert an array of values into a dataset matrix 
def create_dataset(dataset, look_back=1): 
    dataX, dataY = [], [] 
    for i in range(len(dataset)-look_back-1): 
     a = dataset[i:(i+look_back), :] 
     dataX.append(a) 
     dataY.append(dataset[i + look_back, 0]) 
    return numpy.array(dataX), numpy.array(dataY) 

# fix random seed for reproducibility 
numpy.random.seed(7) 

# load the dataset 
dataframe = read_csv('out_meteo.csv', usecols=[5], engine='python', header=0) 
dataset = dataframe.values 
dataset = dataset.astype('float32') 

# normalize the dataset 
scaler = MinMaxScaler(feature_range=(0, 1)) 
dataset = scaler.fit_transform(dataset) 

# split into train and test sets 
train_size = int(len(dataset) * 0.7) 
test_size = len(dataset) - train_size 
train, test = dataset[0:train_size,:], dataset[train_size:len(dataset),:] 

# reshape into X=t and Y=t+1 
look_back = 3 
trainX, trainY = create_dataset(train, look_back) 
testX, testY = create_dataset(test, look_back) 

# reshape input to be [samples, time steps, features] 
trainX = numpy.reshape(trainX, (trainX.shape[0], 1, trainX.shape[1])) 
testX = numpy.reshape(testX, (testX.shape[0], 1, testX.shape[1])) 

# create and fit the LSTM network 
model = Sequential() 
model.add(LSTM(4, input_shape=(1, look_back))) 
model.add(Dense(1)) 
model.compile(loss='mean_squared_error', optimizer='adam') 
model.fit(trainX, trainY, epochs=15, batch_size=15, verbose=2) 

# make predictions 
trainPredict = model.predict(trainX) 
testPredict = model.predict(testX) 

# invert predictions 
trainPredict = scaler.inverse_transform(trainPredict) 
trainY = scaler.inverse_transform([trainY]) 
testPredict = scaler.inverse_transform(testPredict) 
testY = scaler.inverse_transform([testY]) 

# calculate root mean squared error 
trainScore = math.sqrt (mean_squared_error(trainY[0], trainPredict[:,:])) 
print('Train Score: %.2f RMSE' % (trainScore)) 
testScore = math.sqrt(mean_squared_error(testY[0], testPredict[:,:])) 
print('Test Score: %.2f RMSE' % (testScore)) 

# shift train predictions for plotting 
trainPredictPlot = numpy.empty_like(dataset) 
trainPredictPlot[:, :] = numpy.nan 
trainPredictPlot[look_back:len(trainPredict)+look_back, :] = trainPredict 

# shift test predictions for plotting 
testPredictPlot = numpy.empty_like(dataset) 
testPredictPlot[:, :] = numpy.nan 
testPredictPlot[len(trainPredict)+(look_back*2)+1:len(dataset)-1, :] = testPredict 
# plot baseline and predictions 
plt.plot(scaler.inverse_transform(dataset)) 
plt.plot(trainPredictPlot) 
plt.plot(testPredictPlot) 
plt.show() 

Répondre

0

Vous n'avez pas besoin de mettre à l'échelle les valeurs Y pour une régression ANN. Appelez simplement votre balance après la fonction de retour en arrière.

look_back = 3 
trainX, trainY = create_dataset(train, look_back) 
testX, testY = create_dataset(test, look_back) 

scaler = MinMaxScaler(feature_range=(0, 1)) 
trainX = scaler.fit_transform(trainX) 
testX = scaler.transform(testX) 

puis tracer le réel vs le prédisaient

+0

merci pour votre réponse, j'ai modifié mon problème. le problème est plus lié à travailler avec plusieurs fonctionnalités et de tracer le résultat final –

+0

Très confus. Essayez-vous de tracer les fonctionnalités ou juste 'testY' et' testPredict'? Je dis de mettre à l'échelle les données juste avant le réseau, puis de les redimensionner après la formation – DJK