首先,您需要扩展您的测试 ( X_test
) 输入。您确实确实扩展了您的训练数据 ( X_train
),但没有扩展测试集。
所以你需要像你一样缩放它X_train
:
X_test = preprocessing.MinMaxScaler().fit_transform(X_test.reshape(-1, 50*8)).reshape(-1, 50, 8)
此外,'ReLU'
在输出层中使用激活是有问题的。因为即使最后一层的权重产生负输出,你也总会得到正输出。
这里的问题是这些负输出的权重不会更新太多,因为损失非常低。
想象一下,您的权重设置导致输出为-23435235
,而您的目标为0.9
。在您的输出上使用'ReLU'
激活时,它被映射-23435235
到0
导致低损耗的结果。但是低损失意味着更少的变化,而相反的高损失会导致您的体重发生很大变化。
所以你想要一个高损失,以便对你的权重进行强有力的修正。因为-23435235
不是你想要的。
所以最后一层不要用'ReLU'
,我改到'linear'
这里。
所以说(我改成'tanh'
顺便'ReLU'
说一句。)代码:
#somewhere before you need to normalize your `X_test`
X_test = preprocessing.MinMaxScaler().fit_transform(X_test.reshape(-1, 50*8)).reshape(-1, 50, 8)
from tensorflow.keras.layers import GRU
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, Activation
model = Sequential()
model.add(GRU(units=50, input_shape=X_train.shape[1:], return_sequences=False))
model.add(Activation('relu'))
model.add(Dropout(0.2))
model.add(Dense(NFS))
model.add(Activation('linear'))
model.compile(loss='mse', optimizer='adam')
model.fit(X_train, Y_train, batch_size=4000, validation_data=(X_test, Y_test), epochs=15)
输出:
Train on 291314 samples, validate on 72829 samples
Epoch 1/15
291314/291314 [==============================] - 22s 75us/step - loss: 0.1523 - val_loss: 0.2442
Epoch 2/15
291314/291314 [==============================] - 16s 56us/step - loss: 0.0652 - val_loss: 0.2375
Epoch 3/15
291314/291314 [==============================] - 16s 56us/step - loss: 0.0420 - val_loss: 0.2316
Epoch 4/15
291314/291314 [==============================] - 16s 56us/step - loss: 0.0337 - val_loss: 0.2262
Epoch 5/15
291314/291314 [==============================] - 16s 56us/step - loss: 0.0271 - val_loss: 0.2272
Epoch 6/15
291314/291314 [==============================] - 16s 56us/step - loss: 0.0219 - val_loss: 0.2256
Epoch 7/15
291314/291314 [==============================] - 16s 56us/step - loss: 0.0179 - val_loss: 0.2245
Epoch 8/15
291314/291314 [==============================] - 16s 56us/step - loss: 0.0149 - val_loss: 0.2246
Epoch 9/15
291314/291314 [==============================] - 16s 56us/step - loss: 0.0125 - val_loss: 0.2244
Epoch 10/15
291314/291314 [==============================] - 16s 57us/step - loss: 0.0108 - val_loss: 0.2213
Epoch 11/15
291314/291314 [==============================] - 16s 57us/step - loss: 0.0096 - val_loss: 0.2197
Epoch 12/15
291314/291314 [==============================] - 16s 56us/step - loss: 0.0087 - val_loss: 0.2189
Epoch 13/15
291314/291314 [==============================] - 16s 57us/step - loss: 0.0080 - val_loss: 0.2178
Epoch 14/15
291314/291314 [==============================] - 16s 56us/step - loss: 0.0075 - val_loss: 0.2148
Epoch 15/15
291314/291314 [==============================] - 16s 57us/step - loss: 0.0072 - val_loss: 0.2129
<tensorflow.python.keras.callbacks.History at 0x7f8a93637b70>
进一步的X_test
结果:
代码:
prediction = model.predict(X_test[:10])
prediction
输出:
array([[0.03562379, 0.06016447, 0.0987532 , 0.01986726, 0.0336756 ],
[0.03518523, 0.06041833, 0.0983481 , 0.01864071, 0.03437094],
[0.03487844, 0.06067847, 0.09811568, 0.0175517 , 0.03480709],
[0.03491565, 0.05986937, 0.09927133, 0.02029082, 0.03347992],
[0.03466946, 0.06018706, 0.09859383, 0.01869587, 0.03432 ],
[0.03459518, 0.06030918, 0.09850594, 0.01805007, 0.03444977],
[0.03448001, 0.06019764, 0.09864715, 0.01818896, 0.034256 ],
[0.03450274, 0.05936757, 0.10001318, 0.02131432, 0.03305689],
[0.03424717, 0.05954869, 0.09983289, 0.0208826 , 0.03378636],
[0.03426195, 0.05959999, 0.09991242, 0.02090426, 0.03394405]],
dtype=float32)
如上所述,我使用您的笔记本和数据来训练模型。
如您所见,验证损失在 epoch 15 中仍在减少,而且测试输出现在看起来非常接近目标。
还有一点需要注意 - 我还没有阅读笔记本中的所有预处理代码,但在我看来,您使用的是绝对值。
如果是这种情况,您应该考虑改用百分比变化(例如,从当前时间点到未来的预测点)。这也为您进行缩放。(10% 变化 = 0.1)
进一步的绝对值确实变化太大。如果价格是~5.4324
十个月前的价格,而今天的价格~50.5534
比这些数据对您毫无用处,而价格变化的相对模式可能仍然有效。
这只是一个旁注 - 我希望它有所帮助。