我正在使用 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 小时前的比特币价格等),所以我认为问题可能在于我的模型只是简单地获取了那些过去的值并复制它们因为该模型找不到与我的预测变量的任何其他有意义的联系。然而,
- 您可以看到训练数据集拟合中不存在该问题,因此我认为这不是我的模型仅使用过去的价格值作为其最佳猜测的问题。
- 我尝试更改过去使用的滞后时间(例如,我没有使用 24 小时前的值,而是使用了 30 小时前的值)。但是,这并没有什么不同,所以我现在非常有信心,问题不在于我的模型仅依赖于过去的价格值。
结果,我真的不知道这个差距是从哪里来的。
任何关于我如何处理这个奇怪的差距的建议、建议或提示都将不胜感激。非常感谢你!
编辑(请完整阅读,重要):为了一劳永逸地测试这是导致问题的滞后时间序列输入的想法,我只是运行了神经网络,删除了所有过去的价格值。如,所有输入都是外生变量,没有时间序列滞后值,虽然有点难以判断(因为预测比较混乱),但问题似乎仍然存在。看一看:
我认为这几乎明确地证明了滞后并非来自复制过去的价格值。但是,我查看了适合没有时间序列输入的模型的训练数据,很明显它也有偏移/滞后。例子:
我还需要提到一件事。当我在相同的数据上运行这个神经网络但没有从结果中抵消预测变量时,没有问题。也就是说,当我在不将比特币价格列向后移动的情况下运行数据时,这意味着我的网络正在将当前条件与当前价格匹配,这个预测偏移不存在。事实上,我一直在玩弄这个偏移量(所以,试图预测提前 12 小时、提前 24 小时、提前 48 和 72 小时),似乎改变这个会改变预测的滞后。我不知道为什么。当我将其更改为预测提前 72 小时时,预测滞后并不完全是 72 小时(就像我预测那么远时它不完全是 24 小时一样)。但是,当我增加/减少我试图预测的距离时,预测滞后会显着增加/减少。
编辑2:我现在很确定我在数据处理中犯了一些错误。由于我注意到预测偏移量会随着我试图预测的距离而增加/减少,因此我尝试将“我想要预测的时间提前”的值设为负值。(准确地说是-20)。这就是我现在看到的:
果然,预测现在明显“领先”于实际值。结果,我认为我犯了某种基本的数据处理错误。到目前为止,我还没有发现错误。