Keras中LSTM的时间序列预测

时间:2017-07-31 07:24:01

标签: python time-series keras lstm rnn

我是深度学习的初学者。我正在使用keras库实现LSTM,预测天气数据,我有训练和测试数据。删除一些变量后,我的输入数据具有以下形状。

('X_train', (117, 22))
('y_train', (117,))
('X_test', (13, 22))
('y_test', (13,))

现在,我将这些数据提供给下面的LSTM代码,但无法弄清楚输入形状,我遇到了麻烦。下面给出了我正在申请的LSTM的完整代码。

import os
print os.getcwd()
import pandas
import numpy
import matplotlib.pyplot as plt
import math
from sklearn.metrics import mean_squared_error


train = pandas.read_excel('./data/train.xlsx', sheetname = 'temp4')
print train.head()
print train.shape

test = pandas.read_excel('./data/test.xlsx', sheetname = 'temp4')
print test.head()
print test.shape

# lagsp has 7 misssing values in train data and rest is tha in all entries and also drop un-necessary variable
train = train.drop(['WEEK_NBR', 'DOS_YEAR', 'sorted row','lagsp'], axis = 1)
test = test.drop(['WEEK_NBR', 'DOS_YEAR', 'sorted row','lagsp'], axis = 1)

print train.shape
print test.shape

train = train.values
test = test.values

X_train = train[:,0:22]
y_train = train[:,22]

X_test = test[:,0:22]
y_test = test[:,22]

print("X_train", X_train.shape)
print("y_train", y_train.shape)
print("X_test", X_test.shape)
print("y_test", y_test.shape)




timesteps = X_train.shape[0]
features = X_train.shape[1]

X_train = X_train.reshape(1, timesteps, features)
X_test = X_test.reshape(1, X_test.shape[0], X_test.shape[1])



print 'timesteps', timesteps
print 'features', features



numpy.random.seed(7)


from keras.models import Sequential
from keras.layers import Dense, Dropout


###########################
#   RNN
###########################
from keras.layers.recurrent import LSTM

d = 0.2
rnn_model = Sequential()
rnn_model.add(LSTM(64, input_shape= (117,22), return_sequences=True))
rnn_model.add(Dropout(d))
rnn_model.add(Dense(16,kernel_initializer='uniform',activation='relu'))
rnn_model.add(Dense(1,kernel_initializer='uniform',activation='linear'))
rnn_model.compile(loss='mse',optimizer='rmsprop',metrics=['accuracy'])

#batch_input_shape=(batch_size, timesteps, data_dim)

rnn_model.fit(
    X_train,
    numpy.array(y_train),
    batch_size=10,
    epochs=10)

# make predictions
trainPredict_rnn = rnn_model.predict(X_train)
testPredict_rnn = rnn_model.predict(X_test)
# calculate root mean squared error
trainScore_rnn = math.sqrt(mean_squared_error(y_train, trainPredict_rnn))
print('Train Score: %.2f RMSE' % (trainScore_rnn))
testScore_rnn = math.sqrt(mean_squared_error(y_test, testPredict_rnn))
print('Test Score: %.2f RMSE' % (testScore_rnn))

# plot predictions

plt.figure(figsize=(20,10))
plt.plot(y_train) # blue # orange
plt.plot(trainPredict_rnn)
plt.show()

plt.plot(y_test) # blue # orange
plt.plot(testPredict_rnn)
plt.show()

这是错误,我正在运行代码,其中模型适合X_train和y_train,具有上面的输入形状。

Traceback (most recent call last):
  File "/home/shivampanchal/PycharmProjects/WeatherPrediction/try.py", line 81, in <module>
    epochs=10)
  File "/usr/local/lib/python2.7/dist-packages/keras/models.py", line 856, in fit
    initial_epoch=initial_epoch)
  File "/usr/local/lib/python2.7/dist-packages/keras/engine/training.py", line 1429, in fit
    batch_size=batch_size)
  File "/usr/local/lib/python2.7/dist-packages/keras/engine/training.py", line 1309, in _standardize_user_data
    exception_prefix='target')
  File "/usr/local/lib/python2.7/dist-packages/keras/engine/training.py", line 127, in _standardize_input_data
    str(array.shape))
ValueError: Error when checking target: expected dense_2 to have 3 dimensions, but got array with shape (117, 1)

1 个答案:

答案 0 :(得分:1)

X_train需要是三维的。在第一个图层中指定input_shape时,您正在指定(timesteps, features)。然后,在将实际数据传递到fit()时,您需要传入一个三维数组,其中每个样本的形状为(timesteps, features)

timesteps = X_train.shape[0]
features = X_train.shape[1]

X_train = X_train.reshape(1, timesteps, features)

但是,这会留下一个训练样本,我怀疑这是你想要的。如果不知道您的数据实际上是什么样子,很难获得进一步的帮助!您似乎更有可能希望将数据集分解为某些固定时间步长的序列。此外,您还需要对X_test应用类似的转换。