使用LSTM预测时间序列的多个前向时间步长

Luc*_*ito 16 time-series forward prediction lstm keras

我想预测每周可预测的某些值(低SNR).我需要预测一年中形成的一年的整个时间序列(52个值 - 图1)

图1:按周计算的年度时间序列

我的第一个想法是使用Keras over TensorFlow开发多对多LSTM模型(图2).我正在使用52输入层(前一年的给定时间序列)和52预测输出层(明年的时间序列)训练模型.train_X的形状是(X_examples,52,1),换言之,要训练的X_examples,每个1个特征的52个时间步长.据我所知,Keras会将52个输入视为同一域的时间序列.train_Y的形状是相同的(y_examples,52,1).我添加了一个TimeDistributed层.我的想法是算法会将值预测为时间序列而不是孤立值(我是否正确?)

Keras的模型代码是:

y = y.reshape(y.shape[0], 52, 1)
X = X.reshape(X.shape[0], 52, 1)
# design network
model = Sequential()
model.add(LSTM(n_neurons, input_shape=(X.shape[1], X.shape[2]), return_sequences=True))
model.add(TimeDistributed(Dense(1)))
model.compile(loss='mean_squared_error', optimizer='adam')
# fit network
model.fit(X, y, epochs=n_epochs, batch_size=n_batch, verbose=2)
Run Code Online (Sandbox Code Playgroud)

图2:多对多LSTM架构

问题是算法没有学习这个例子.它预测的值与属性的值非常相似.我是否正确建模了问题?

第二个问题:另一个想法是用1输入和1输出训练算法,但是在测试期间如何在不查看'1输入'的情况下预测整个2015时间序列?测试数据将具有与训练数据不同的形状.

Dan*_*ler 24

分享关于数据太少的相同问题,你可以这样做.

首先,将值保持在-1和+1之间是个好主意,所以我先将它们标准化.

对于LSTM模型,您必须确保使用return_sequences=True.
您的模型没有"错误",但可能需要更多或更少的层或单元来实现您的需求.(虽然没有明确的答案).

训练模型以预测下一步:

你需要的只是将Y作为移位的X传递:

entireData = arrayWithShape((samples,52,1))
X = entireData[:,:-1,:]
y = entireData[:,1:,:]
Run Code Online (Sandbox Code Playgroud)

使用这些训练模型.

预测未来:

现在,为了预测未来,由于我们需要使用预测元素作为更多预测元素的输入,我们将使用循环并制作模型stateful=True.

使用以下更改创建与前一个相同的模型:

  • 所有LSTM图层必须具有 stateful=True
  • 批输入形状必须为(batch_size,None, 1)- 这允许可变长度

复制先前训练的模型的权重:

newModel.set_weights(oldModel.get_weights())
Run Code Online (Sandbox Code Playgroud)

一次仅预测一个样本,并且model.reset_states()在开始任何序列之前永远不会忘记调用.

首先用您已经知道的序列进行预测(这将确保模型正确地准备其状态以预测未来)

model.reset_states()
predictions = model.predict(entireData)
Run Code Online (Sandbox Code Playgroud)

按照我们训练的方式,预测的最后一步将是未来的第一个元素:

futureElement = predictions[:,-1:,:]

futureElements = []
futureElements.append(futureElement)
Run Code Online (Sandbox Code Playgroud)

现在我们创建一个循环,其中此元素是输入.(由于有状态,模型将理解它是前一个序列的新输入步骤而不是新序列)

for i in range(howManyPredictions):
    futureElement = model.predict(futureElement)
    futureElements.append(futureElement)
Run Code Online (Sandbox Code Playgroud)

此链接包含一个完整示例,用于预测两个功能的未来:https://github.com/danmoller/TestRepo/blob/master/TestBookLSTM.ipynb