我使用了 AirPassenger 数据集。并且基于几个先前的值(例如 20),我想预测未来的几个(3 或 5)步。
像
X -> y
[10,20,30,....200]->[210,220,230]
[20,30,40,....210]->[220,230,240]
[30,40,50,....220]->[230,240,250] 等
我进行了规范化和拆分。
scaler = StandardScaler()
df['#Passengers'] = scaler.fit_transform(df[['#Passengers']])
train_size = int(len(df)*0.8)
test_size = len(df) -train_size
train,test = df[['#Passengers']].iloc[:train_size], df[['#Passengers']].iloc[train_size:]
创建数据集
def create_dataset(X, y, time_steps=1,pred_range=1):
Xs, ys = [], []
for i in range(len(X) - time_steps-pred_range):
v = X.iloc[i:(i + time_steps)].values
Xs.append(v)
ys.append(y.iloc[i + time_steps:i + time_steps+pred_range])
return np.array(Xs), np.array(ys)
time_steps = 20
pred_range = 5
xtrain, ytrain = create_dataset(train, train, time_steps,pred_range)
xtest, ytest = create_dataset(test, test, time_steps,pred_range)
input_shape=(xtrain.shape[1], xtrain.shape[2])
并在 Keras 简单模型上制作。
mcp_save = tf.keras.callbacks.ModelCheckpoint('.mdl_wts.hdf5', save_best_only=True, monitor='val_loss', mode='min')
reduce_lr_loss = tf.keras.callbacks.ReduceLROnPlateau(monitor='val_loss', factor=0.1, patience=7, verbose=1, epsilon=1e-4, mode='min')
es_callback = keras.callbacks.EarlyStopping(monitor='val_loss', patience=10)
output_size=pred_range
model = keras.Sequential()
model.add(keras.layers.LSTM(256, return_sequences=True, input_shape=input_shape,))
model.add(keras.layers.Dropout(0.1))
model.add(keras.layers.LSTM(64, return_sequences=False))
model.add(keras.layers.Dropout(0.1))
model.add(keras.layers.Dense(output_size))
model.compile(loss='mae', optimizer='adam',metrics =["mean_squared_error","mae"])
history = model.fit(xtrain, ytrain, epochs=50, batch_size=100, validation_data=(xtest, ytest), verbose=2, shuffle=False,callbacks=[mcp_save,reduce_lr_loss,es_callback])
问题: 当我使用测试数据中的任何点进行预测时,我得到了一条线,形状基本相同
yhat3 = model.predict(np.array([xtest[3]]))
yhat30 = model.predict(np.array([xtest[30]]))
如您所见,无论 xtest 是什么,按形状划分的红线(预测)都是相同的
当您将其绘制到 Airpassenger 的整个测试数据时,它看起来像

附加问题为什么 LSTM 没有捕捉曲线的振幅?这是因为我的模型不好,还是因为归一化,还是因为 LSTM ,还是我需要区分趋势和季节性?


