我正在尝试将顺序模型(LSTM)拟合到我的数据中。为此,我使用 Keras 库。
简单地说,我的目标是一个统计某个位置每天的人数的计数器。这些功能包括天气数据、公共假期和当前日期。总共有 21 个功能。
我的目标是利用最近3天,以及第二天(总共4天)的数据,包括天气预报,来预测当天的人数。
为了进行比较,我的基线误差约为 10000,并且我已经安装了两个模型,即训练误差约为 5000 的 xgboost 模型和训练误差约为 7000 的密集模型。绝对值并不重要,但我只是提到它们,所以你会有一种感觉并声明,其他模型确实能够拾取这些模式。
我的输入形状是:
X_train_3d.shape
>>> (2918, 4, 21)
第一个元素如下所示:
X_train_3d[0]
>>> array([[2.0130e+03, 1.0000e+00, 1.0000e+00, 1.0000e+00, 9.1000e+00,
6.9000e+00, 0.0000e+00, 1.9400e+01, 1.0018e+03, 0.0000e+00,
1.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00,
1.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00,
0.0000e+00],
[2.0130e+03, 1.0000e+00, 2.0000e+00, 2.0000e+00, 7.1000e+00,
1.8000e+00, 0.0000e+00, 2.0200e+01, 1.0175e+03, 3.0000e+01,
1.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00,
0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00,
0.0000e+00],
[2.0130e+03, 1.0000e+00, 3.0000e+00, 3.0000e+00, 1.0600e+01,
9.0000e-01, 0.0000e+00, 2.3800e+01, 1.0245e+03, 0.0000e+00,
1.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00,
0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00,
0.0000e+00],
[2.0130e+03, 1.0000e+00, 4.0000e+00, 4.0000e+00, 9.7000e+00,
0.0000e+00, 0.0000e+00, 2.5200e+01, 1.0295e+03, 0.0000e+00,
1.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00,
0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00,
0.0000e+00]])
我的目标形状是:
y_train_3d.shape
>>> (2918, 4, 1)
第一个元素如下所示:
y_train_3d[0]
>>> array([[ 5795.],
[19494.],
[24851.],
[13475.]])
所以形状和内容看起来都像他们应该的那样。
3.模型是我的LSTM模型。我的模型如下:
num_sequence = 4
inputs = Input(shape=(num_sequence, 21))
x = LSTM(32, activation='relu', dropout=0.0, return_sequences=True)(inputs)
outputs = Dense(1, activation='linear')(x)
model = tf.keras.Model(inputs=inputs, outputs=outputs)
optimizer = Adam(learning_rate=0.1)
model.compile(optimizer=optimizer, loss='mse', metrics=[RootMeanSquaredError()])
print(model.summary())
模型总结为:
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_1 (InputLayer) [(None, 4, 21)] 0
lstm_2 (LSTM) (None, 4, 32) 6912
dense_3 (Dense) (None, 4, 1) 33
=================================================================
Total params: 6,945
Trainable params: 6,945
Non-trainable params: 0
_________________________________________________________________
我的问题: 如果我使用这个 LSTM 并让它运行 500 个 epoch,首先它似乎真正学习并且训练误差下降,但在 180 个 epoch 后的某个时刻,训练误差再次变得更糟。
Epoch 178/500
92/92 - 0s - loss: 67061724.0000 - root_mean_squared_error: 8189.1221 - val_loss: 73245328.0000 - val_root_mean_squared_error: 8558.3486 - 488ms/epoch - 5ms/step
Epoch 179/500
92/92 - 1s - loss: 63150060.0000 - root_mean_squared_error: 7946.7012 - val_loss: 73750616.0000 - val_root_mean_squared_error: 8587.8184 - 536ms/epoch - 6ms/step
Epoch 180/500
92/92 - 1s - loss: 114693592.0000 - root_mean_squared_error: 10709.5098 - val_loss: 149320688.0000 - val_root_mean_squared_error: 12219.6846 - 661ms/epoch - 7ms/step
Epoch 181/500
92/92 - 1s - loss: 121518424.0000 - root_mean_squared_error: 11023.5391 - val_loss: 125545216.0000 - val_root_mean_squared_error: 11204.6963 - 646ms/epoch - 7ms/step
Epoch 182/500
92/92 - 1s - loss: 115984808.0000 - root_mean_squared_error: 10769.6240 - val_loss: 122884320.0000 - val_root_mean_squared_error: 11085.3203 - 690ms/epoch - 8ms/step
经过 500 个 epoch 后,我对训练集进行了预测并得到了这些结果:
model.predict(X_train_3d)
>>> array([[[22839.49 ],
[22839.49 ],
[22839.49 ],
[22839.49 ]],
[[26642.746],
[26642.746],
[26642.746],
[26642.746]],
[[27665.633],
[27665.633],
[27665.633],
[27665.633]],
...,
[[13904.507],
[13904.507],
[13904.507],
[13904.507]],
[[12234.53 ],
[12234.53 ],
[12234.53 ],
[12234.53 ]],
[[15874.946],
[15874.946],
[15874.946],
[15874.946]]], dtype=float32)
我对顺序模型相当陌生,因此我可能会错过一些概念来查看这里的错误。 对我来说,一切看起来都很好,因为训练数据具有正确的形状,并且 LSTM 模型给出了正确的输出形状。另外,直到第 180 纪元,模型似乎都在改进和学习,直到突然变得更糟,并且它只是为每个时间步预测相同的值。
正如你所看到的,我在这里也没有故意使用任何正则化,因为我的模型甚至似乎无法很好地拟合训练数据,因此我猜测这更多是一个
high bias
问题,而正则化不是帮忙。
有人能给我一些关于这里发生的事情的直觉吗? 除了一般直觉之外,我的期望是,如果我根本不使用正则化并训练足够长的时间,我应该至少能够过度拟合我的训练数据,这应该会导致
model.predict(X_train_3d)
接近我的
y_train_3d
,例如第一个元素
>>> array([[ 5795.],
[19494.],
[24851.],
[13475.]])
但正如我们所看到的,所有值都相同且相差很远,例如对于第一个元素。我还使用了相同的架构和更大的模型(2 个 LSTM 层)并收到了类似的结果。因此,我的模型太小,无法拾取图案似乎不是问题。
更多比较: 我的 Dense 模型有
Trainable params: 3,329
LSTM 有 Trainable params: 6,945
因此,理论上它应该具有拾取复杂模式并在训练数据上表现良好的能力。
虽然你有很多构建架构的方法,但为了获得更好的模型,我会说进行大量的培训。
开始尝试一些仅 5 到 10 个 epoch 的新模型,并查看结果。 另外,在这个实现中,我会在 LSTM 上做更多的单元,因为它有很多输入特征,比如 64。
简而言之:更少的时代,不同的架构,更多的过滤器
编辑:强烈推荐这个:https://machinelearningmastery.com/how-to-develop-lstm-models-for-time-series-forecasting/