这是使用有状态LSTM神经网络预测时间序列的正确方法吗?

时间:2017-03-07 15:46:28

标签: machine-learning neural-network keras lstm stateful

我正在使用LSTM神经网络(有状态)进行时间序列预测。

我希望有状态的LSTM可以捕获隐藏的模式并做出令人满意的预测(导致时间序列变化的物理定律不明确)。

我的时间序列X的长度为1500(实际观察数据),我的目的是预测未来100

我认为预测下一个10比预测下一个100更有希望(是吗?)。

所以,我准备这样的训练数据(始终使用100值来预测下一个10; x_n表示n-th中的X元素):

shape of trainX: [140, 100, 1]
shape of trainY: [140, 10, 1]
---
0: [x_0,  x_1, ...,  x_99]  -> [x_100, x_101, ..., x_109]
1: [x_10, x_11, ..., x_109] -> [x_110, x_111, ..., x_119]
2: [x_20, x_21, ..., x_119] -> [x_120, x_121, ..., x_129]
                     ...
139: [x_1390, x_1391, ..., x_1489] -> [x_1490, x_1491, ..., x_1499]
---

培训结束后,我想使用该模型预测下10个值[x_1500 - x_1509] [x_1400 - x_1499],然后预测下一个10值{{1}与[x_1510 - x_1519]

这是正确的方法吗?

经过大量阅读文档和示例,我可以训练模型并进行预测,但结果似乎不尽如人意。

为了验证方法,我假设最后[x_1410 - x_1509]个值未知,并从100 (x_1400 - x_1499)trainX中删除它们,然后尝试训练模型并预测它们。最后,将预测值与观察值进行比较。

任何建议或意见将不胜感激。

时间序列如下所示: enter image description here

1 个答案:

答案 0 :(得分:3)

你的问题非常复杂。在我尝试回答之前 - 我将与您分享我的疑问,使用LSTM来完成任务是明智的。你想使用一个真正高级的模型(LSTM能够学习真正复杂的模式)到一个看似相对容易的时间序列。而且 - 你的数据非常少。说实话 - 我会先尝试训练更简单,更简单的方法(如ARMAARIMA)。

回答你的问题 - 如果你的方法很好 - 这似乎是合理的。其他合理的方法是预测所有100步骤或例如50步骤两次。使用10步骤可能会遇到错误累积 - 但它仍然可能是一个很好的方法。

正如我之前提到的 - 我宁愿为此任务尝试更简单的ML方法,但如果您真的想使用LSTM,则可以通过以下方式解决此问题:

  1. 定义元参数,例如您想要预测的步数,输入网络的输入大小。
  2. 尝试使用例如网格搜索,以便找到此元参数的最佳值。使用k-fold交叉验证评估每个设置。
  3. 使用最佳元参数设置重新构建最终模型。
  4. 您拥有相对较少的数据,因此您可以轻松找到超参数的最佳值。这也将向您显示您的方法是否良好 - 只需检查最佳解决方案提供的结果。