我一直在尝试使用 LSTM Keras. 根据时间序列数据预测订单数量
我将样本数据与训练集分开包含282条记录,而测试集包含82条记录 . 我使用 look back window of 30 来预测测试数据的预测 .
但由于某种原因, predicted dataset contains only 40 记录与预期的测试数据中的71条记录相反 . 它背后的原因是什么?是导致问题的查找窗口?我觉得回头看窗户造成了这个问题 . 但我该如何纠正呢?
It is important to keep such a high look back window
def create_LSTM(trainX,testX,trainY,testY,look_back):
model = Sequential()
model.add(LSTM(6, input_shape=(1, look_back),activation= 'relu'))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='RMSProp')
model.fit(trainX, trainY, epochs=300, batch_size=4, verbose=1)
trainpredict = model.predict(trainX,batch_size=4)
testpredict = model.predict(testX,batch_size=4)
testpredict = np.array(testpredict).reshape(len(testpredict),1)
print(testpredict)
print(len(testpredict))
return trainpredict,testpredict
我正在使用以下函数为LSTM创建导致实际问题的数据 . 我怎么能纠正它?
def create_dataset(dataset, look_back=1):
dataX, dataY = [], []
for i in range(len(dataset)-look_back-1):
#for i in range(len(dataset)-look_back):
a = dataset[i:(i+look_back), 0]
dataX.append(a)
dataY.append(dataset[i + look_back, 0])
return np.array(dataX), np.array(dataY)
1 回答
create_dataset的问题
当你得到ndarray的一个元素时,你会失去与该元素相关的等级 . 这是因为如果您对该单个元素感兴趣,那么您不需要保留维
1
:因此,当您编写
a = dataset[i:(i + look_back), 0]
时,您将获取形状(samples, features)
的数据集并获得一块形状(look_back,)
. 将所有a添加到dataX
之后,它变成了形状(samples, look_back) = (len(dataset) - look_back - 1, look_back)
的ndarray . 但是,LSTM期待形状(samples, look_back, features)
,在您的情况下(samples, look_back, 1)
.如果将其更改为
a = dataset[i:(i + look_back)]
,则事情将开始起作用 . 但是,更好的解决方案是使用TimeseriesGenerator
:关于其他部分的进一步评论
model.add(LSTM(6, input_shape=(1, look_back),activation= 'relu'))
- 输入形状应符合(length, features)
. 在这种情况下,length == features
,事情会有效 . 如果你想要更大的look_back
,你需要将此代码更新为input_shape=(look_back, 1)
.testpredict = np.array(testpredict).reshape(len(testpredict), 1)
- 这是不必要的 . 如果您有一个输出Model#predict
已输出ndarray
,其形状已经是(samples, output_units) = (len(testX), 1)
.LSTM(activation='relu')
在处理非常大的序列时通常会导致不稳定 . 将它留在tanh
通常是个好主意 .