基于LSTM的时间序列预测:如何预测更大时间步长的路段速度
实现LSTM多步时间序列预测(15分钟速度预测)
嘿,很高兴看到你已经用Keras搭好LSTM完成单步(下一个5分钟)的路段速度预测了!要扩展到15分钟(也就是t+3步,因为你的数据是5分钟间隔)的预测,这里有几种实用的思路,我给你详细拆解下:
方法1:直接修改目标变量(最直接的固定步长预测)
这种方法不需要改动模型结构,只需要重新构造训练数据集——把原来预测「t+1时刻速度」的目标,换成预测「t+3时刻速度」。
举个例子,假设你之前用的是20步历史窗口(用过去20个5分钟的速度数据预测下一个),现在只需要把标签从V(t+1)改成V(t+3)即可。对应的数据集生成代码可以调整成这样:
import numpy as np def create_forecast_dataset(data, look_back=20, forecast_step=3): # data是一维的速度序列数组 X, y = [], [] # 确保有足够的数据生成样本:总长度 - 历史窗口 - 预测步长 +1 for i in range(len(data) - look_back - forecast_step + 1): # 输入:过去look_back个时间步的速度 X.append(data[i:(i + look_back)]) # 输出:forecast_step步后的速度(这里是t+3) y.append(data[i + look_back + forecast_step - 1]) return np.array(X).reshape(-1, look_back, 1), np.array(y)
优点:
- 实现最简单,不需要调整模型结构
- 没有误差累积,预测稳定性比递归法好
- 适合只需要固定远期步长(比如就15分钟)的场景
方法2:多输出预测(同时预测多个时间步)
如果除了15分钟后的速度,你还想拿到中间5分钟、10分钟的预测结果,可以让LSTM直接输出连续3个时间步的速度值(t+1、t+2、t+3),最后取第三个值就是15分钟后的结果。
数据集构造:
def create_multi_output_dataset(data, look_back=20, forecast_steps=3): X, y = [], [] for i in range(len(data) - look_back - forecast_steps + 1): X.append(data[i:(i + look_back)]) # 标签改成连续forecast_steps个时间步的速度 y.append(data[i + look_back : i + look_back + forecast_steps]) return np.array(X).reshape(-1, look_back, 1), np.array(y)
模型调整:
把原来的输出层从Dense(1)改成Dense(3),因为要输出3个时间步的结果:
from keras.models import Sequential from keras.layers import LSTM, Dense model = Sequential() model.add(LSTM(50, input_shape=(20, 1))) model.add(Dense(3)) # 输出3个时间步的预测值 model.compile(optimizer='adam', loss='mse')
预测时:
训练完成后,预测结果的第三个元素就是15分钟后的速度:
# 假设test_seq是测试用的历史窗口数据 predictions = model.predict(test_seq.reshape(1, 20, 1), verbose=0) t_plus_3_pred = predictions[0][2] # 取第三个预测值
优点:
- 一次性拿到多个时间步的预测结果,灵活性更高
- 误差比递归法小,因为模型直接学习到多步的映射关系
方法3:递归预测(用单步模型迭代预测)
如果你不想重新训练模型,也可以用已经训练好的单步预测模型,通过迭代预测得到15分钟后的结果:先用历史数据预测t+1,再把t+1的预测值加入输入序列,去掉最旧的一个数据,再预测t+2,重复到t+3。
代码示例:
def recursive_multi_step_forecast(model, initial_seq, steps=3): current_sequence = initial_seq.copy() predictions = [] for _ in range(steps): # 预测当前序列的下一个时间步 pred = model.predict(current_sequence.reshape(1, len(current_sequence), 1), verbose=0) predictions.append(pred[0][0]) # 更新序列:移除最前面的旧数据,添加新的预测值 current_sequence = np.append(current_sequence[1:], pred) return predictions # 使用示例:initial_seq是最后20个真实的速度数据 all_predictions = recursive_multi_step_forecast(model, initial_seq, steps=3) t_plus_3_pred = all_predictions[-1] # 15分钟后的预测值
注意点:
- 这种方法的误差会累积,预测步长越长,误差可能越大
- 适合需要灵活调整预测步长的场景,不需要重新训练模型
额外建议
- 不管用哪种方法,都要确保训练样本数量足够:你的1258条数据,用20步窗口+3步预测的话,可用样本数是
1258 -20 -3 +1 = 1236条,完全足够训练。 - 可以尝试调整LSTM的神经元数量、层数,或者加入
Dropout层防止过拟合,提升远期预测的准确性。 - 如果数据有明显的时间周期(比如早晚高峰),可以考虑加入时间特征(如小时、星期几)作为额外输入,帮助模型捕捉规律。
内容的提问来源于stack exchange,提问作者Klaus




