如何处理keras中多变量LSTM的多步时间序列预测
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何处理keras中多变量LSTM的多步时间序列预测相关的知识,希望对你有一定的参考价值。
我正在尝试使用Keras中的多变量LSTM进行多步时间序列预测。具体来说,我最初每个时间步有两个变量(var1和var2)。按照在线教程here,我决定在时间(t-2)和(t-1)使用数据来预测时间步t的var2的值。如示例数据表所示,我使用前4列作为输入,Y作为输出。我开发的代码可以看到here,但我有三个问题。
var1(t-2) var2(t-2) var1(t-1) var2(t-1) var2(t)
2 1.5 -0.8 0.9 -0.5 -0.2
3 0.9 -0.5 -0.1 -0.2 0.2
4 -0.1 -0.2 -0.3 0.2 0.4
5 -0.3 0.2 -0.7 0.4 0.6
6 -0.7 0.4 0.2 0.6 0.7
Question 1:
从你的表中,我看到你在一个序列上有一个滑动窗口,通过两个步骤制作许多较小的序列。
- 为了预测t,您将表的第一行作为输入
- 对于预测t + 1,您将第二行作为输入。
如果您不使用该表:请参阅问题3
Question 2:
假设您正在使用该表作为输入,其中显然是一个滑动窗口案例,需要两个时间步作为输入,您的timeSteps
为2。
你可能应该像var1
和var2
一样工作在同一序列中:
input_shape = (2,2)
- 两个时间步和两个功能/变量。
Question 3:
我们不需要像这样制作表格或构建滑动窗口案例。这是一种可能的方法。
你的模型实际上能够学习东西并决定这个窗口本身的大小。
如果一方面您的模型能够学习长时间的依赖性,另一方面,它允许您不使用窗口,它可以学习在序列的开头和中间识别不同的行为。在这种情况下,如果您想要预测使用从中间开始的序列(不包括开头),您的模型可能会像开始一样工作并预测不同的行为。使用Windows消除了这种非常长的影响。我想,哪个更好可能取决于测试。
不使用Windows:
如果您的数据有800个步骤,请立即提供所有800个步骤进行培训。
在这里,我们需要分开两个模型,一个用于训练,另一个用于预测。在训练中,我们将利用参数return_sequences=True
。这意味着对于每个输入步骤,我们将得到一个输出步骤。
为了以后预测,我们只需要一个输出,然后我们将使用return_sequences= False
。如果我们要将预测输出用作后续步骤的输入,我们将使用stateful=True
层。
训练:
将您的输入数据整形为(1, 799, 2)
,1个序列,采取步骤1到799.两个变量都在相同的序列中(2个特征)。
让您的目标数据(Y)形状也为(1, 799, 2)
,采取相同的步骤,从2到800。
使用return_sequences=True
构建模型。您可以使用timeSteps=799
,但您也可以使用None
(允许可变数量的步骤)。
model.add(LSTM(units, input_shape=(None,2), return_sequences=True))
model.add(LSTM(2, return_sequences=True)) #it could be a Dense 2 too....
....
model.fit(X, Y, ....)
预测:
对于预测,现在使用return_sequences=False
创建一个类似的模型。
复制权重:
newModel.set_weights(model.get_weights())
例如,您可以输入长度为800的形状(形状:(1,800,2)
)并预测下一步:
step801 = newModel.predict(X)
如果你想预测更多,我们将使用stateful=True
图层。再次使用相同的模型,现在使用return_sequences=False
(仅在最后一个LSTM中,其他保持为True)和stateful=True
(所有这些)。通过input_shape
更改batch_input_shape=(1,None,2)
。
#with stateful=True, your model will never think that the sequence ended
#each new batch will be seen as new steps instead of new sequences
#because of this, we need to call this when we want a sequence starting from zero:
statefulModel.reset_states()
#predicting
X = steps1to800 #input
step801 = statefulModel.predict(X).reshape(1,1,2)
step802 = statefulModel.predict(step801).reshape(1,1,2)
step803 = statefulModel.predict(step802).reshape(1,1,2)
#the reshape is because return_sequences=True eliminates the step dimension
实际上,你可以用一个stateful=True
和return_sequences=True
模型做任何事情,处理两件事:
- 训练时,
reset_states()
为每个时代。 (用手动循环和epochs=1
训练) - 从多个步骤预测时,仅将输出的最后一步作为所需结果。
实际上,您不能只输入原始时间序列数据,因为网络自然不适合它。 RNN的当前状态仍然需要您输入多个“功能”(手动或自动导出)才能正确学习有用的东西。
通常需要的先前步骤是:
- 消除趋势
- Deseasonalize
- 比例(标准化)
来自微软研究员的this post是一个很好的信息来源,它通过LSTM网络赢得了时间序列预测竞赛。
这篇文章:CNTK - Time series Prediction
以上是关于如何处理keras中多变量LSTM的多步时间序列预测的主要内容,如果未能解决你的问题,请参考以下文章
Keras 如何处理单元格和隐藏状态(RNN、LSTM)的初始值以进行推理?