You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

基于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

火山引擎 最新活动