LSTM 时间序列递归预测收敛到相同的值

数据挖掘 时间序列 回归 喀拉斯 rnn lstm
2022-03-07 19:29:34

我正在使用 LSTM 进行时间序列预测。我的目标是使用 25 个过去值的窗口来生成对接下来 25 个值的预测。我正在递归地这样做:我使用 25 个已知值来预测下一个值。将该值附加为已知值,然后移动 25 个值并再次预测下一个值,直到我有 25 个新生成的值(或更多)

我正在使用“Keras”来实现 RNN 架构:

regressor = Sequential()
regressor.add(LSTM(units = 50, return_sequences = True, input_shape = (X_train.shape[1], 1)))
regressor.add(Dropout(0.1))

regressor.add(LSTM(units = 50, return_sequences = True))
regressor.add(Dropout(0.1))

regressor.add(LSTM(units = 50))
regressor.add(Dropout(0.1))

regressor.add(Dense(units = 1))

regressor.compile(optimizer = 'rmsprop', loss = 'mean_squared_error')

regressor.fit(X_train, y_train, epochs = 10, batch_size = 32)

问题:无论之前是什么序列,递归预测总是收敛到某个值。

示例 1 示例 2 示例 3

当然这不是我想要的,我期待生成的序列会根据我之前的情况而有所不同,我想知道是否有人对这种行为以及如何避免这种行为有所了解。也许我做错了什么......

我尝试了不同的时期数并没有太大帮助,实际上更多的时期使情况变得更糟。更改 Batch Size、Number of Units、Number of Layers 和窗口大小也无助于避免这个问题。

我正在使用 MinMaxScaler 获取数据。

3个回答

如果您想使用 LSTM 进行时间序列预测,您必须尝试所有可能的参数以找到可能的最佳结果。为了检查您的模型性能,您还应该检查您的训练/验证损失(这可能表明 10 个 epoch 太少)。检查您的网络架构。为什么要使用三层?更多的层并不意味着更好的结果。尝试具有不同学习率的不同优化器。最后,问问自己为什么还要使用 LSTM 进行预测?您是否尝试过其他方法?LSTM 并不神奇,如果没有任何可借鉴的模式,它们就不会有完美的预测,而且你只有很小的样本可供训练。

看起来你的 RNN 对单变量时间序列建模来说太复杂了:我建议使用更简单的模型,使用更少的 LSTM 层。

现在,时间序列预测总是存在长期收敛到某个平均值的问题。实时序列被认为受到来自“环境”的“冲击”,导致突然增加或减少。如果您的数据中没有这些冲击,并且不对它们何时发生做出假设,那么唯一合理的长期预测将是某个恒定值。你觉得这很直观吗?

其次,使用 LSTM 进行递归预测会导致非常严重的错误累积。例如,当预测时间步长 t + 3 时,模型的隐藏状态和您输入的数据(在本例中为输入:您对 t + 2 的预测)都会出现一些错误。在训练期间,只有隐藏状态会受到错误影响:输入是实际观察。你知道这如何导致这种极端的预测失控吗?

对于回归,通常激活函数保持线性