我正在使用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()
}
所以如果不清楚的话,我有一个有一个中间层的神经网络,输入层有22个单元(等于变量的数量),中间层有16个单元,输出层有一个。
以下是训练数据拟合的图表(蓝色是合适的,红色是真值):
我预测未来24小时的比特币价格。我有每小时的数据,所以我做这个预测,只需将我的数据的比特币价格列后退24步,所以我将过去的预测条件与未来的结果相匹配。
从上面的图片,你可以看到,训练配合是非常强大的。但是,看看我的样本外预测与真值(同样,蓝线是模型预测,红线是真值):
乍一看,这真的不算寒酸。然而,如果你仔细看一看(当我放大到较小的时间尺度时,这一点变得非常明显),预测的蓝线往往落后于“真实”的红线:
奇怪的是,这不是一个一贯的问题。如果你看一下图的右边的一些动作,模型就会使它达到目标(没有滞后)。此外,通过放大和仔细观察,我发现明显的滞后本身在大小上并不一致,从14小时到有时22小时不等(这意味着这个预测几乎无法使用,因为它预测的时间提前了24小时,但“滞后”了22小时,所以我实际上只比实际预测提前了2个小时)。
我已经尝试增加我的批处理大小(到5,10,30),这并没有使问题变得更好(甚至可能使问题变得更糟)。我试着增加我的中间神经元层的大小(到20,30,44),这也没有解决这个问题。将损失函数作为“平均绝对误差”似乎比“均方误差”更有效,但您所看到的已经是MAE版本,因此问题显然仍然存在。
我对神经网络模型的输入大约有一半是比特币价格的滞后值( 24小时前的BTC价格,25小时前的BTC价格等等),所以我想问题可能是,我的模型只是简单地抓住了过去的值并复制它们,因为模型找不到与我的预测器有任何其他有意义的联系。然而,
因此,我真的不知道这个差距是从何而来的。
任何建议,建议或建议,我将感谢如何处理这个奇怪的差距。非常感谢!
编辑(请完全阅读,重要):为了一劳永逸地测试导致问题的是滞后的时间序列输入的想法,我刚刚运行了神经网络,去掉了所有的过去价格值。与之一样,所有输入都是外生变量,没有时间序列滞后值,虽然很难说(因为预测比较混乱),但问题似乎仍然存在。看一看:
我认为这在很大程度上证明了这种滞后并不是来自于过去的价格价值被复制。然而,我查看了适合于没有时间序列输入的模型的训练数据,很明显,它也有偏移/滞后。示例:
我还要提一件事。当我在相同的数据上运行这个神经网络,但不抵消结果的预测因子,就没有问题了。也就是说,当我运行数据而不将比特币价格列移回时,这意味着我的网络正在将当前的情况与当前的价格相匹配,这种预测偏移并不存在。事实上,我一直在玩这个偏移(所以,试着提前12小时,提前24小时,提前48小时和72小时),这似乎改变了预测的滞后。我不知道为什么。当我将预测改为提前72小时时,预测滞后并不完全是72小时(就像我预测的提前24小时一样)。然而,当我试图预测的未来有多远时,预测滞后会明显地增加/减少。
编辑2:我现在很确定,我在数据处理中犯了一些错误。由于我注意到预测的偏移量随着我预测的距离而增加/减少,所以我尝试将“我要预测的时间提前多少小时”作为负值。(确切地说是-20)。我现在看到的是:
可以肯定的是,这些预测现在大大地“领先”了实际值。因此,我想我犯了一些基本的数据处理错误。到目前为止,我还没有发现错误。
发布于 2020-06-29 06:58:48
欢迎来到现场。
我认为你是对的,预测滞后于真实值,因为这个序列是自回归的(也就是说,预测明天价值的一种强有力的方法是“它将和今天差不多”)。因此,当你的模型错过了一次大的跳跃时,它就会用新的信息来修正自己。换句话说,如果某一天价格上涨,而你的模型没有预测到这一点,那么它已经学会了在预测第二天的价格时考虑到更高的价格。
针对您上面的编号:
我建议使用另一个模型作为基线(例如Facebook ),看看您的模型产生的值是否与基准模型的值有很大不同。这给您提供了一个更严格的选择,以排除您的数据的眼睛。在您的模型不太准确的地方,您可以在这些时间步骤中查看输入类型。
发布于 2020-06-29 05:32:28
欢迎来到堆栈交换上的数据科学,
这是一个常见的问题,预测未来的价格或预测。你所看到的差距是由于像这样的价格的随机性,以及这个话题的潜在复杂性。除非数据中存在时间模式,否则LSTM模型无法很好地预测。如果数据经常改变方向,在价值上上升或下降,那么LSTM的表现将尤其糟糕。
很多讨论都围绕着你应该使用的模型,但不确定它们中的任何一个都是最好的。对于一些关于不同技术的一般想法,在这种情况下应用于股票市场,这里有很好的参考。
它提到了LSTM (如果你相信动量的话很流行),还有Arima,FBProphet等等。
然而,通常还有很多其他变量对未来的价格有很大的影响,比如情绪、新闻文章或公告等。你可能会考虑使用一个整体,也许是LSTM +1或2个其他模型,并将这些不同的输入组合起来,以便将它们包含在您的预测中。
发布于 2020-06-29 16:15:37
我自己也在和LSTM打交道,用惯性无人机数据来预测风速,我的一些情节和你的类似“抵消”。您是否使用MinMax或标准标量缩放输入?我也取得了惊人的成功,实现了KNN算法来预测平均偏差误差往往低于LSTM所发现的风速。
https://datascience.stackexchange.com/questions/76826
复制相似问题