gpt4 book ai didi

tensorflow - 如何处理keras中多元LSTM的多步时间序列预测

转载 作者:行者123 更新时间:2023-12-02 18:46:56 25 4
gpt4 key购买 nike

我正在尝试使用 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
  1. Q1:我已经使用上述数据训练了 LSTM 模型。这个模型确实很好地预测了 var2 在时间步 t 的值。然而,什么如果我想在时间步 t+1 预测 var2 。我觉得很难因为模型无法告诉我 var1 在时间步 t 的值。如果我想这样做,我应该如何修改code建立模型?
  2. 问题2:我看到这个问题被问了很多次,但我仍然很困惑。在我的例子,[样本,时间]中正确的时间步长应该是什么步骤、特征] 1 或 2?
  3. Q3:我刚刚开始研究 LSTM。我有阅读here LSTM 的最大优势之一是自己学习时间依赖性/滑动窗口大小,然后为什么我们必须总是将时间序列数据转换为如下格式上表?

更新:LSTM结果(蓝线是训练序列,橙线是地面实况,绿色是预测) Enter image description here

最佳答案

问题 1:

从你的表格中,我看到你在单个序列上有一个滑动窗口,用 2 个步骤生成许多较小的序列。

  • 为了预测 t,您将表格的第一行作为输入
  • 为了预测 t+1,您将第二行作为输入。

如果您不使用该表格:请参阅问题 3

问题 2:

假设您使用该表作为输入,它显然是一个以两个时间步长作为输入的滑动窗口情况,您的 timeSteps 为 2。

您可能应该像 var1var2 是同一序列中的功能一样工作:

  • input_shape = (2,2) - 两个时间步长和两个特征/变量。

问题 3:

我们不需要制作那样的 table 或 build 滑动窗柜。这是一种可能的方法。

您的模型实际上能够学习事物并决定该窗口本身的大小。

如果一方面您的模型能够学习长时间依赖性,从而允许您不使用窗口,另一方面,它可能会学会识别序列开头和中间的不同行为。在这种情况下,如果您想使用从中间(不包括开头)开始的序列进行预测,您的模型可能会像开头一样工作并预测不同的行为。使用 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=Truereturn_sequences=True 模型完成所有操作,只需处理两件事:

  • 训练时,每个时期都会reset_states()。 (使用手动循环和 epochs=1 进行训练)
  • 当从多个步骤进行预测时,仅将输出的最后一步作为所需结果。

关于tensorflow - 如何处理keras中多元LSTM的多步时间序列预测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46901371/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com