LSTM在预测和真实性之间存在系统性的偏移

时间:2019-01-25 15:50:32

标签: python tensorflow keras lstm recurrent-neural-network

目前,我认为我在LSTM模型中的预测与基本真实值之间出现系统性偏移。从现在开始继续前进的最佳方法是什么?

模型架构以及预测和基本真值如下所示。这是一个回归问题,其中使用目标的历史数据加上5个其他相关特征X来预测目标y。当前,输入序列n_input的长度为256,其中输出序列n_out的长度为1。简化后,前256个点用于预测下一个目标值。

X已标准化。均方误差用作损失函数。具有余弦退火学习率的Adam被用作优化器(min_lr=1e-7max_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层之后添加密集层似乎只会降低精度。任何意见,将不胜感激。

enter image description here

有关图像的其他信息。 y轴是一个值,x轴是时间(以天为单位)。 NaN已被替换为零,因为在这种情况下基本真理值永远不会达到零。这就是为什么数据中有奇数离群值的原因。

编辑: 我对模型进行了一些更改,从而提高了准确性。体系结构相同,但是使用的功能已更改。当前,仅目标序列本身的历史数据用作特征。与此同时,n_input也进行了更改,因此128。将Adam切换为SGD,将均方误差与平均绝对误差进行比较,最后对NaN进行插值,而不是将其替换为0。

对验证集的提前预测看起来不错:

enter image description here

但是,验证集上的偏移量仍为:

enter image description here

可能值得注意的是,此偏移也出现在x <〜430的火车集合上: enter image description here

2 个答案:

答案 0 :(得分:2)

您的模型似乎过拟合,并且总是总是从最后一个时间步返回值作为预测。您的数据集可能太小,以至于无法使具有此数量参数的模型收敛。您将需要采用与过度拟合作斗争的技术:积极的辍学,添加更多数据或尝试使用更简单,较少参数化的方法。

这种现象(LSTM返回输入的转换版本)在许多stackoverflow问题中都是重复出现的主题。那里的答案可能包含一些有用的信息:

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预测股票市场的人们中,您会看到很多(关于stackoverflow关于如何预测彩票号码的问题)。

答案 1 :(得分:-1)

答案比我们想象的要简单得多...... 我看到很多人说这是由于过度拟合和数据大小。其他一些人表示这是由于重新缩放。 经过多次尝试,我找到了解决方案:尝试在将数据提供给 RNN 之前进行去趋势。 例如,您可以对数据进行简单的 2 次多项式拟合,这将为您提供多项式公式。并且可以减少与公式值对应的每个数据值。然后我们得到了一个新的数据集,我们可以将它提供给 LSTM,在预测之后我们可以将趋势添加回结果,结果应该看起来更好。