为什么我的 LSTM 神经网络的预测落后于真实值?

数据挖掘 时间序列 lstm 预言 rnn
2021-09-25 23:07:11

我正在使用 keras 包在 R 中运行 LSTM 神经网络,试图对比特币进行时间序列预测。我遇到的问题是,虽然我的预测值似乎是合理的,但由于某种原因,它们“落后”或“落后于”真实值。下面是我的一些代码,再往下我有一些图表来告诉你我的意思。我的型号代码:

batch_size = 2              


model <- keras_model_sequential()

model%>%
  layer_lstm(units=22, 
             batch_input_shape = c(batch_size, 1, 22), use_bias = TRUE, stateful = TRUE,
              return_sequences = TRUE) %>%
  layer_lstm(units=16, batch_input_shape = c(batch_size, 1, 22), stateful = TRUE, return_sequences = TRUE) %>%
  layer_dense(units=1)
model %>% compile(
  loss = 'mean_absolute_error',
  optimizer = optimizer_adam(lr= 0.00004, decay = 0.000004),  
  metrics = c('mean_absolute_error')
)
summary(model)

Epochs <- 50
for (i in 1:Epochs){
  print(i)
  model %>% fit(x_train, y_train, epochs=1, batch_size=batch_size, verbose=1, shuffle=FALSE)
  model %>% reset_states()
}

因此,如果不清楚,我有一个具有 1 个中间层的神经网络 - 我在输入层有 22 个单元(等于我的变量数),在中间层有 16 个单元,在我的一个输出层中有 16 个单元。

这是训练数据拟合的图表(蓝色是拟合,红色是真实值): 模型训练拟合

我提前 24 小时预测比特币价格。我有每小时的数据,所以我通过简单地将我的数据的比特币价格列向后移动 24 步来进行这个预测,所以我将过去的预测条件与未来的结果相匹配。

从上图可以看出训练契合度非常强。但是,看看我的样本外预测与真实值的对比(同样,蓝线是模型预测,红线是真实值): 测试数据

乍一看,还真不寒酸。然而,如果你仔细观察(当我放大到更小的时间尺度时它变得非常明显),预测的蓝线通常落后于“真正的”红线: 预测中带圆圈的“滞后”

对我来说奇怪的是,这不是一个一致的问题。如果您查看图表右侧的一些移动,模型会使其达到目标(无滞后)。此外,通过放大并仔细观察,我发现明显滞后本身的幅度并不一致,从大约 14 小时到有时 22 小时不等(这意味着预测几乎无法使用,因为它预测的是提前 24 小时,但是“滞后”真实值 22 小时,所以我真的只比实际预测提前 2 小时)。

我尝试增加批量大小(增加到 5、10、30),但这并没有使问题变得更好(甚至可能使问题变得更糟)。我尝试增加中间神经元层的大小(增加到 20、30、44),但这也没有解决问题。将损失函数作为“平均绝对误差”似乎比“均方误差”工作得更好,但您所看到的已经是 MAE 版本,所以问题显然仍然存在。

我对神经网络模型的输入中大约有一半是比特币价格的滞后值(24 小时前、25 小时前的比特币价格等),所以我认为问题可能在于我的模型只是简单地获取了那些过去的值并复制它们因为该模型找不到与我的预测变量的任何其他有意义的联系。然而,

  1. 您可以看到训练数据集拟合中不存在该问题,因此我认为这不是我的模型仅使用过去的价格值作为其最佳猜测的问题。
  2. 我尝试更改过去使用的滞后时间(例如,我没有使用 24 小时前的值,而是使用了 30 小时前的值)。但是,这并没有什么不同,所以我现在非常有信心,问题不在于我的模型仅依赖于过去的价格值。

结果,我真的不知道这个差距是从哪里来的。

任何关于我如何处理这个奇怪的差距的建议、建议或提示都将不胜感激。非常感谢你!

编辑(请完整阅读,重要):为了一劳永逸地测试这是导致问题的滞后时间序列输入的想法,我只是运行了神经网络,删除了所有过去的价格值。如,所有输入都是外生变量,没有时间序列滞后值,虽然有点难以判断(因为预测比较混乱),但问题似乎仍然存在。看一看: 不使用任何时间序列预测器的预测

我认为这几乎明确地证明了滞后并非来自复制过去的价格值。但是,我查看了适合没有时间序列输入的模型的训练数据,很明显它也有偏移/滞后。例子: 没有时间序列输入训练拟合放大

我还需要提到一件事。当我在相同的数据上运行这个神经网络但没有从结果中抵消预测变量时,没有问题。也就是说,当我在不将比特币价格列向后移动的情况下运行数据时,这意味着我的网络正在将当前条件与当前价格匹配,这个预测偏移不存在。事实上,我一直在玩弄这个偏移量(所以,试图预测提前 12 小时、提前 24 小时、提前 48 和 72 小时),似乎改变这个会改变预测的滞后。我不知道为什么。当我将其更改为预测提前 72 小时时,预测滞后并不完全是 72 小时(就像我预测那么远时它不完全是 24 小时一样)。但是,当我增加/减少我试图预测的距离时,预测滞后会显着增加/减少。

编辑2:我现在很确定我在数据处理中犯了一些错误。由于我注意到预测偏移量会随着我试图预测的距离而增加/减少,因此我尝试将“我想要预测的时间提前”的值设为负值。(准确地说是-20)。这就是我现在看到的: -20 滞后的预测

果然,预测现在明显“领先”于实际值。结果,我认为我犯了某种基本的数据处理错误。到目前为止,我还没有发现错误。

3个回答

欢迎来到本站。

我认为预测滞后于真实值是对的,因为该序列是自回归的(即预测明天值的一种强有力的方法是“它将与今天大致相同”)。因此,您的模型会在错过大跃进时使用新信息进行自我纠正。换句话说,如果某天价格上涨而您的模型没有预测到这一点,那么它已经学会在预测第二天的价格时考虑更高的价格。

针对您上面的编号点:

  1. 这是基于目测数据吗?您能否向我们展示任何证明模型在训练期间表现不同的结果?
  2. 您确定当您将延迟更改为 30 小时时,预测的延迟不仅会更改为 30 小时的延迟,正如我们对自回归模型所期望的那样吗?

我建议使用另一个模型作为基线(例如 Facebook Prophet),并查看您的模型产生的与基线模型显着不同的值是否更正确。这为您提供了一种更严格的替代方法,可以通过肉眼对数据进行故障排除。如果您的模型不太准确,您可以查看这些时间步长的输入类型。

欢迎来到 Stack Exchange 上的数据科学,
这是一个常见问题,预测未来价格或预测。您看到的差距是由于此类价格的随机性以及该主题的潜在复杂性。除非数据中存在时间模式,否则 LSTM 模型不会很好地预测。如果数据经常改变方向,价值上升和下降,LSTM 的表现尤其差。
很多讨论都围绕着您应该使用哪种模型,但不确定它们中的任何一个是否始终是最好的。对于在这种情况下应用于股票市场的不同技术的一些一般性想法,这是一个很好的参考。

https://www.analyticsvidhya.com/blog/2018/10/predicting-stock-price-machine-learningnd-deep-learning-techniques-python/

它提到了 LSTM(如果你相信动量的话很受欢迎),还有 Arima、FBProphet 等。

但是,通常还有许多其他变量会对未来价格产生很大影响,而您不会以这种方式获得,例如情绪、新闻文章或公告等。您可能会考虑使用集成,可能是 LSTM + 1 或2 个其他模型,并结合这些不同的输入,以便将它们包含在您的预测中。

我自己一直在摆弄 LSTM 来使用惯性无人机数据预测风速,我的一些地块与你的“偏移量”相似。您是否使用 MinMax 或 Standard 标量缩放输入?我在实施 KNN 算法来预测风速方面也取得了惊人的成功,其平均偏差误差通常低于 LSTM 发现的误差。