LSTM 在预测和基本事实之间具有系统偏移
Posted
技术标签:
【中文标题】LSTM 在预测和基本事实之间具有系统偏移【英文标题】:LSTM having a systematic offset between predictions and ground truth 【发布时间】:2019-06-19 11:45:06 【问题描述】:目前我认为我在 LSTM 模型中遇到了预测值和真实值之间的系统偏移。从现在开始继续前进的最佳方法是什么?
模型架构以及预测和真实值如下所示。这是一个回归问题,其中目标的历史数据加上 5 个其他相关特征X
用于预测目标y
。当前输入序列n_input
的长度为256,其中输出序列n_out
为1。简单来说,前面的256个点用来预测下一个目标值。
X
已标准化。均方误差用作损失函数。具有余弦退火学习率的 Adam 被用作优化器 (min_lr=1e-7
, max_lr=6e-2
)。
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
cu_dnnlstm_8 (CuDNNLSTM) (None, 256) 270336
_________________________________________________________________
batch_normalization_11 (Batc (None, 256) 1024
_________________________________________________________________
leaky_re_lu_11 (LeakyReLU) (None, 256) 0
_________________________________________________________________
dropout_11 (Dropout) (None, 256) 0
_________________________________________________________________
dense_11 (Dense) (None, 1) 257
=================================================================
Total params: 271,617
Trainable params: 271,105
Non-trainable params: 512
_________________________________________________________________
增加 LSTM 层中的节点大小、添加更多 LSTM 层(使用return_sequences=True
)或在 LSTM 层之后添加密集层似乎只会降低准确性。任何意见,将不胜感激。
图片的附加信息。 y 轴是一个值,x 轴是时间(以天为单位)。 NaNs 已被零替换,因为在这种情况下,ground truth 值永远不会达到零。这就是为什么数据中有奇怪的异常值。
编辑:
我对模型进行了一些更改,从而提高了准确性。架构是相同的,但是使用的功能发生了变化。目前仅使用目标序列本身的历史数据作为特征。与此同时,n_input
也发生了变化,所以 128
。将 Adam
切换为 SGD
,均方误差与平均绝对误差,最后 NaN 已被插值,而不是被 0 替换。
对验证集的领先一步预测看起来不错:
但是,验证集上的偏移量仍然存在:
值得注意的是,这个偏移量也出现在 x
【问题讨论】:
您的 seq-length 太大,您是否尝试过其他变体?你的数据量是多少? 总数据集为 1427 个时间步长,分为 50% 训练、20% 验证和 30% 测试。我现在就去尝试一个较小的输入序列,我会在收到更新后立即发布。 好的,这里是更新。前向填充所有 NaN,而不是用 0 替换它们,从而相对提高了准确度。删除所有其他特征,但目标的历史顺序也有帮助。对于输入序列长度,越长越好。但是,偏移量仍然存在,目前与地面实况相比约为 +15%,而预测的形状看起来与地面实况完全一致。 我想您可能遇到了类似于this 答案中描述的问题。 【参考方案1】:看起来您的模型过度拟合,并且总是返回上一个时间步的值作为预测。您的数据集可能太小,无法让具有这么多参数的模型收敛。您将需要求助于对抗过度拟合的技术:激进的 dropout、添加更多数据,或者尝试更简单、更少过度参数化的方法。
这种现象(LSTM 返回输入的转换版本)一直是许多 *** 问题中反复出现的主题。那里的答案可能包含一些有用的信息:
LSTM Sequence Prediction in Keras just outputs last step in the input
LSTM model just repeats the past in forecasting time series
LSTM NN produces “shifted” forecast (low quality result)
Keras network producing inverse predictions
Stock price predictions of keras multilayer LSTM model converge to a constant value
Keras LSTM predicted timeseries squashed and shifted
LSTM Time series shifted predictions on stock market close price
Interesting results from LSTM RNN : lagged results for train and validation data
最后,请注意,根据数据集的性质,您的数据中可能根本没有发现任何模式。你经常看到人们试图用 LSTM 预测股票市场(*** 上有一个关于如何预测彩票号码的问题)。
【讨论】:
非常感谢,很难找到这个答案。几乎所有的教程、博客和论文都关注一步超前预测,而忽略了多步超前预测的问题。对于其他遇到此问题的人:CNN 似乎给出了更有希望的结果。【参考方案2】:答案比我们想象的要简单得多... 我看到很多人说这是由于过度拟合和数据大小。其他一些人说这是由于重新调整。 经过多次尝试,我找到了解决方案:在将数据提供给 RNN 之前尝试去趋势。 例如,您可以对数据进行简单的 2 次多项式拟合,这将为您提供一个多项式公式。并且可以减少与公式值对应的每个数据值。然后我们得到了一个新的数据集,我们可以将它输入到 LSTM 中,在预测之后我们可以将趋势添加回结果中,结果应该看起来更好。
【讨论】:
以上是关于LSTM 在预测和基本事实之间具有系统偏移的主要内容,如果未能解决你的问题,请参考以下文章