我有一个形状数据集(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)
我要预测的值通常在1100到1400之间。我得到的MAE约为1200。我的预测都相同。因此,如果我这样做:
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粘贴到观测值的右侧,因此我得到了一个二维77424、432数组,然后使用一个常规的多层密集模型,但我觉得这不是最佳解决方案,因为我的数据是时间序列数据。
有人可以建议我在这里做错什么吗?
谢谢!
答案 0 :(得分:0)
不确定为什么会停留在该值上,但是可能1000和1400超出了模型/优化器预期的训练范围。
一个想法是尝试使用'sgd'
优化器来查看Adam是否正在裁剪某些内容。
另一个想法是使用一个模型,使您的Dense输出的值更像预期的值(大约0和1)。
model = tf.keras.models.Sequential([
tf.keras.layers.LSTM(50),
tf.keras.layers.Dense(1),
tf.keras.layers.Lambda(lambda x: 300*x + 1100)
])
您还可以使用以下命令强制输出介于1000和1500之间:
tf.keras.layers.LSTM(50),
tf.keras.layers.Dense(1, activation = 'sigmoid'),
tf.keras.layers.Lambda(lambda x: 500*x + 1000)
])