首页 > 解决方案 > LSTM 模型只是在预测时间序列中重复过去

问题描述

我想从九个输入变量中预测一个输出变量。该数据也是一个时间序列,目标是提前 2 个时间步预测输出变量。

我的数据表看起来像这样

我使用均值归一化对所有数据进行了归一化,并添加了一些特征,所以现在数据如下所示:

   weekday (weekend vs weekday)      hour  (f_real - 50)*70  ACE [Mwh]  \
0                     -1.579094 -1.341627          0.032171   2.017604   
1                     -1.579094 -0.447209          0.032171  -0.543702   
2                     -1.579094  0.447209          0.037651   0.204731   
3                     -1.579094  1.341627          0.043130  -0.601538   
4                     -1.579094 -1.341627          0.021211  11.759046   
   IGCC [Mwh]  SRE [Mwh]  TertCalls [Mwh]  Imbalance [Mwh]      Time  
0    0.257560   5.377617         0.128754        -2.858935 -1.713381  
1    0.507353   4.850718         0.128754        -2.532608 -1.677292  
2    0.173518   5.042090         0.128754        -3.325708 -1.641203  
3    2.753128   1.684767         0.128754        -2.912524 -1.605114  
4    0.206732   6.506615         0.128754        -4.926271 -1.569025

和这样的目标:

0    1.541263
1    1.541263
2    1.541263
3    1.541263
4    3.885717
Name: TRE [Mwh], dtype: float64

现在我的问题来了。如果我以这种格式将 X 和 y 数据输入 LSTM 模型,它会完美地学习如何在整个时间内预测目标变量。

模型在测试数据上的预测没有偏移

但是当我执行 2 个时间步的移位时:

target = target.shift(-2)

它只是学习了同样的东西,并预测了落后 2 个时间步的目标。

具有目标偏移的模型预测

两种模型都是使用 Keras 制作的相同 LSTM 网络:

model = Sequential()
model.add(LSTM(50, input_shape=(1, train_X.shape[2])))
model.add(Dense(1, activation='linear'))
model.compile(loss='mse', optimizer=Adam(lr=0.02))
model.fit(train_X, train_y, epochs=200, batch_size=train_X.shape[0]//2, verbose=2)

有什么方法可以修改成本函数以帮助模型预测转移的目标?

标签: pythonmachine-learningkerastime-serieslstm

解决方案


推荐阅读