使用 RNN(有状态 LSTM)进行时间序列预测会产生常数值

数据挖掘 深度学习 时间序列 张量流 rnn lstm
2021-09-30 04:12:22

我有大约 6 年的时间序列每日数据(1.8k 数据点)。我正在尝试预测下一个 t+30 值,训练数据独立矩阵 (X)=前 30 天值的序列训练 (Y)=前 30 天值中的每一个的第 31 天值。

我按照以下方法进行预测:首先预测 t+1 的 Y,然后将 X 矩阵行移动 1 天并将预测的 Y 附加到该行的末尾,然后使用该行预测 t+2 值和继续。然而,在(通常) t+3 天之后的每个序列中,预测值在剩余的 t+n 天中变得恒定。

这是用 LSTM 预测时间序列的正确方法吗?

如何解释这种行为?

即使对于具有很大季节性的时间序列,情况也会如此吗?

即使对于非常大的时间序列数据,这种行为是否也是预期的?

我是否应该尝试使用具有相同 X 的第 31 天到第 60 天值的 Y 矩阵来训练网络?

我的火车数据如下所示:

array([[-0.35811423, -0.22393472, -0.39437897, ..., -0.36718042, -0.37080689, -0.35267452], [-0.22393472, -0.39437897, -0.13327289, ..., -0.37080689, -0.35267452, -0.2030825 ], [-0.39437897, -0.13327289, -0.1532185 , ..., -0.35267452, -0.2030825 , -0.25294651]

架构:输入 LSTM 层(20 个神经元) 1 个隐藏 LSTM 层 20 个神经元 1 个输出密集层,批量大小为 1。有状态 LSTM,我在每个 epoch 后重置模型状态。

2个回答

这是用 LSTM 预测时间序列的正确方法吗?

训练数据独立矩阵 (X)=前 30 天值的序列 训练 (Y)=前 30 天值中每个值的第 31 天值

你的方法理论上可行。但通常,对于普通 LSTM,设置看起来像x=[x0,x1,...,xn1]y=[x1,x2...,xn]. 我怀疑如果你这样做,你会得到更好的结果。

如果您还没有阅读过,强烈推荐 Colah 的出色解释。

我按照以下方法进行预测:首先预测 t+1 的 Y,然后将 X 矩阵行移动 1 天并将预测的 Y 附加到该行的末尾,然后使用该行预测 t+2 值和继续。然而,在(通常) t+3 天之后的每个序列中,预测值在剩余的 t+n 天中变得恒定。

不建议这样做,因为预测中的任何错误都会随着时间的推移而复杂化。请在下面的帖子中找到我的答案以获得详细解释 时间序列多步提前预测序列到序列问题吗?

如何解释这种行为?

如果您获得恒定的预测值,则可能是您遇到了所谓的“梯度爆炸问题”,请尝试在反向传播可能成为解决方案之前剪裁梯度。


更正。稍微考虑一下就好了。这里不是梯度爆炸问题。更有可能是由于神经元饱和。由于 LSTM 使用 sigmoid 函数,如果输入没有正确缩放或权重初始化不当,可能会很快导致神经元饱和。

我正在处理 3 年的数据(每日数据),并且可以看到这些值每天都在变化。我正在尝试使用Jason Brownlee 博士的教程预测接下来的 30 天。

上面的教程帮助我预测了接下来的 30 天,我仍在努力改进预测。

编辑:在尝试改善我的结果时,我正在尝试并遇到与您类似的情况。建议 --->从您的网络中删除任何激活功能,这可能会有所帮助。