为什么 Keras 上的 LSTM 在需要预测前进的几步时不能正常工作

数据挖掘 深度学习 喀拉斯 时间序列 lstm 序列到序列
2022-02-21 11:21:29

我使用了 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]]))

预测 yhat3

预测 yhat30

如您所见,无论 xtest 是什么,按形状划分的红线(预测)都是相同的

当您将其绘制到 Airpassenger 的整个测试数据时,它看起来像 所有的

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

0个回答
没有发现任何回复~