LSTM 在预测和基本事实之间具有系统偏移
LSTM having a systematic offset between predictions and ground truth
目前我认为我在 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 轴是时间(以天为单位)。 NaN 已被替换为零,因为在这种情况下,真实值永远不会达到零。这就是数据中出现奇怪异常值的原因。
编辑:
我对模型进行了一些更改,从而提高了准确性。体系结构相同,但使用的功能已更改。目前只有目标序列本身的历史数据被用作特征。与此同时,n_input
也发生了变化,因此 128
。将 Adam
切换为 SGD
,均方误差与平均绝对误差,最后对 NaN 进行了插值而不是用 0 替换。
验证集上的预测看起来不错:
但是,验证集上的偏移量仍然是:
可能值得注意的是,此偏移量也出现在 x < ~430 的训练集上:
您的模型似乎过度拟合,只是总是返回最后一个时间步长的值作为预测。您的数据集可能太小,无法使模型具有如此多的参数收敛。您需要求助于对抗过度拟合的技术:积极的辍学、添加更多数据,或尝试更简单、更少过度参数化的方法。
这种现象(LSTM 返回输入的移位版本)一直是许多 Whosebug 问题中反复出现的主题。那里的答案可能包含一些有用的信息:
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)
LSTM Time series shifted predictions on stock market close price
最后,请注意,根据数据集的性质,您的数据中可能根本找不到任何模式。你经常看到人们试图用 LSTM 预测股市(Whosebug 上有一个关于如何预测彩票号码的问题)。
答案比我们想象的要简单得多...
我看到很多人说这是由于过度拟合和数据大小造成的。其他一些人表示这是由于重新缩放。
经过几次尝试,我找到了解决方案:尝试在将数据提供给 RNN 之前进行去趋势处理。
例如,您可以对数据进行简单的 2 次多项式拟合,得到多项式公式。并且可以减少公式值对应的各个数据值。然后我们得到一个新的数据集,我们可以将它提供给 LSTM,在预测之后我们可以将趋势添加回结果,结果应该看起来更好。
目前我认为我在 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 轴是时间(以天为单位)。 NaN 已被替换为零,因为在这种情况下,真实值永远不会达到零。这就是数据中出现奇怪异常值的原因。
编辑:
我对模型进行了一些更改,从而提高了准确性。体系结构相同,但使用的功能已更改。目前只有目标序列本身的历史数据被用作特征。与此同时,n_input
也发生了变化,因此 128
。将 Adam
切换为 SGD
,均方误差与平均绝对误差,最后对 NaN 进行了插值而不是用 0 替换。
验证集上的预测看起来不错:
但是,验证集上的偏移量仍然是:
可能值得注意的是,此偏移量也出现在 x < ~430 的训练集上:
您的模型似乎过度拟合,只是总是返回最后一个时间步长的值作为预测。您的数据集可能太小,无法使模型具有如此多的参数收敛。您需要求助于对抗过度拟合的技术:积极的辍学、添加更多数据,或尝试更简单、更少过度参数化的方法。
这种现象(LSTM 返回输入的移位版本)一直是许多 Whosebug 问题中反复出现的主题。那里的答案可能包含一些有用的信息:
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)
LSTM Time series shifted predictions on stock market close price
最后,请注意,根据数据集的性质,您的数据中可能根本找不到任何模式。你经常看到人们试图用 LSTM 预测股市(Whosebug 上有一个关于如何预测彩票号码的问题)。
答案比我们想象的要简单得多... 我看到很多人说这是由于过度拟合和数据大小造成的。其他一些人表示这是由于重新缩放。 经过几次尝试,我找到了解决方案:尝试在将数据提供给 RNN 之前进行去趋势处理。 例如,您可以对数据进行简单的 2 次多项式拟合,得到多项式公式。并且可以减少公式值对应的各个数据值。然后我们得到一个新的数据集,我们可以将它提供给 LSTM,在预测之后我们可以将趋势添加回结果,结果应该看起来更好。