看了好多序列预测的都是seq2seq的翻译模式的预测,根本没有预测未来的数据,这篇文章具体用最简单的一层lstm实现了一个预测实例
import numpy as np
import matplotlib.pyplot as plt
step = 3 #步长
size = 6 #输入大小
forward = 3 #向后预测几步
def load_data():
"""
[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
[ 0, 1, 2, 3, 4] ⇨⋙ [ 5, 6, 7, 8]
[ 3, 4, 5, 6, 7] ⇨⋙ [ 8, 9, 10, 11]
"""
# 生成滑动窗口式的数据
data = np.arange(100)
data_X, data_Y = [], []
for i in range(data.shape[0] // step):
if not (i * step + size + forward) >= data.shape[0]:
data_X.append(data[i * step:i * step + size])
data_Y.append(data[i * step + size:i * step + size + forward])
# reshape变成keras可接受的输入
data_X, data_Y = np.array(data_X), np.array(data_Y)
data_X = data_X.reshape(data_X.shape[0], 1, data_X.shape[1])
data_Y = data_Y.reshape(data_Y.shape[0], 1, data_Y.shape[1])
# 划分训练集70%,验证集20%,测试集10%
train_X = data_X[:round(data_X.shape[0] * 0.7)]
valid_X = data_X[round(data_X.shape[0] * 0.7):round(data_X.shape[0] * 0.9)]
test_X = data_X[round(data_X.shape[0] * 0.9):]
train_Y = data_Y[:round(data_Y.shape[0] * 0.7)]
valid_Y = data_Y[round(data_Y.shape[0] * 0.7):round(data_Y.shape[0] * 0.9)]
test_Y = data_Y[round(data_Y.shape[0] * 0.9):]
return (train_X, valid_X, test_X), (train_Y, valid_Y, test_Y), data
def rnn_model():
from tensorflow import keras
(train_X, valid_X, test_X), (train_Y, valid_Y, test_Y), data = load_data()
model = keras.models.Sequential()
model.add(keras.layers.LSTM(units=6, return_sequences=True, activation='relu', input_shape=(train_X.shape[1], train_X.shape[2])))
model.add(keras.layers.GRU(units=6, return_sequences=True, activation='relu'))
model.add(keras.layers.Dense(units=train_Y.shape[2]))
model.compile(loss=keras.losses.mean_absolute_error, optimizer=keras.optimizers.Adam())
model.summary()
history = model.fit(train_X, train_Y, validation_data=(valid_X, valid_Y), epochs=500, batch_size=32)
plt.figure(figsize=(24, 8))
plt.subplot(211)
plt.plot(history.history['loss'][40:], label='train_loss')
plt.plot(history.history['val_loss'][40:], label='valid_loss')
train_predict = model.predict(train_X)
valid_predict = model.predict(valid_X)
test_predict = model.predict(test_X)
plt.grid(axis='y')
plt.legend()
plt.subplot(212)
plt.grid(axis='x')
plt.plot([i for i in train_Y.reshape(-1)] + [i for i in valid_Y.reshape(-1)] + [i for i in test_Y.reshape(-1)], '-o', label="train+valid+test Y")
plt.plot([i for i in train_predict.reshape(-1)] + [i for i in valid_predict.reshape(-1)] + [i for i in test_predict.reshape(-1)], '-o', label="predict Y")
plt.legend()
print(test_X)
print(test_Y)
print(test_predict)
plt.show()
if __name__ == "__main__":
rnn_model()
# load_data()