【发布时间】:2019-12-04 14:49:50
【问题描述】:
我有一个形状数据集 (77424, 144)。然后我创建一个上移 1 的副本和一个上移 2 的版本,并将它们堆叠成一个 77422、3、144 3d 数组。
因此,时间步 0 中的 2/3/4 观察结果如下所示,其中前 4 列是年/月/日/小时:
0 1 2 3 4 ... 139 140 141 142 143
2 2011.0 12.0 31.0 21.0 13911.0 ... 0.00 0.11 38.0 36.0 9.0
3 2011.0 12.0 31.0 20.0 14635.0 ... 0.00 0.20 38.0 36.0 9.0
4 2011.0 12.0 31.0 19.0 15254.0 ... 0.00 0.18 38.0 36.0 9.0
然后在时间步 1,它是这样的:
0 1 2 3 4 ... 139 140 141 142 143
2 2011.0 12.0 31.0 22.0 13100.0 ... 0.0 0.17 38.0 35.0 9.0
3 2011.0 12.0 31.0 21.0 13911.0 ... 0.0 0.11 38.0 36.0 9.0
4 2011.0 12.0 31.0 20.0 14635.0 ... 0.0 0.20 38.0 36.0 9.0
您可能已经猜到,时间步 2 如下所示:
0 1 2 3 4 ... 139 140 141 142 143
2 2011.0 12.0 31.0 23.0 12410.0 ... 0.0 0.25 39.0 35.0 9.0
3 2011.0 12.0 31.0 22.0 13100.0 ... 0.0 0.17 38.0 35.0 9.0
4 2011.0 12.0 31.0 21.0 13911.0 ... 0.0 0.11 38.0 36.0 9.0
然后我将这个 3-D 77422、3、144 数组输入到 LSTM 中,但得到的结果非常糟糕。具体来说,网络是:
model = tf.keras.models.Sequential([
tf.keras.layers.LSTM(50),
tf.keras.layers.Dense(1)
])
optimizer = tf.keras.optimizers.Adam()
model.compile(loss='mse',
optimizer=optimizer,
metrics=['mae', 'mse'], epochs=50, verbose=0)
我试图预测的一般范围是 1,100 到 1,400。我的 MAE 大约是 1,200。我的预测都是同一个数字。所以如果我这样做:
predictions = model.predict(X_test)
print(predictions)
我得到:
[[62.61828]
[62.61828]
[62.61828]
...
[62.61828]
[62.61828]
[62.61828]]
我试过了:
颠倒时间步的堆叠顺序
颠倒观察的顺序,使最新的(2018 年)在顶部,最旧的在底部
改变 LSTM 中的神经元数量
尝试了 GRU,结果几乎相同
我已仔细确保我正在翻转 Y 向量(我试图预测的变量)以匹配输入数据的各种翻转。
到目前为止,我最好的解决方案是构建一个巨大的表格,将 t-1 和 t-2 粘贴到观测值的右侧,所以我最终得到一个 2-D 77424、432 数组,然后使用常规预测多层密集模型,但我觉得这不是最好的解决方案,因为我的数据是时间序列数据。
谁能建议我在这里可能做错了什么?
谢谢!
【问题讨论】:
-
你的loss太高,说明模型没有学习或者训练不够,这种情况下看预测没有意义。
-
我用它来诊断为什么我的损失会如此之高,这确实解释了这一点。问题是为什么模型在每个输入上预测相同的值。如果我使用相同数量的数据来训练其他类型的模型,我会得到很好的结果。这让我怀疑我错误地使用了 LSTM,而不是我没有足够的数据。
标签: python tensorflow keras lstm