You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用训练好的Keras模型进行时间序列10天超前预测?

嘿,我太懂你的困惑了——用训练好的Keras时间序列模型做超前预测,和直接拿历史数据跑predict()对比结果完全不是一回事。咱们一步步来解决这个10天超前预测的问题,分两种常用方法给你讲清楚:

方法一:递归预测(最常用,无需重新训练模型)

这种方法的核心逻辑是用前一步的预测结果当作下一步的输入,循环10次就能得到10天的超前预测。假设你的模型原本是用90天的窗口数据预测下1天的值,那具体步骤是:

  1. 先拿你手头最后90天的真实数据作为初始输入窗口;
  2. 用模型预测第91天的值;
  3. 把这个预测值加到输入窗口的末尾,同时删掉窗口最前面的那1天数据,形成新的90天窗口;
  4. 重复步骤2-3,直到得到10天的预测结果。

给你贴个可直接参考的代码示例:

import numpy as np

# 假设你的训练好的模型是`model`,`dataset`是最后90天的输入数据
# 先确保输入形状符合模型要求:如果你的模型输入是(样本数, 时间步长, 特征数)
# 那如果dataset是(90, 特征数)的形状,要reshape成(1, 90, 特征数)
input_window = dataset.reshape(1, 90, n_features)  # n_features是你的特征数量,比如单变量就是1

# 用来存储10天的预测结果
forecast_results = []

for _ in range(10):
    # 预测下一天的值,verbose=0是关闭打印日志
    next_day_pred = model.predict(input_window, verbose=0)
    # 把预测值加入结果列表(这里假设是单变量预测,根据你的情况调整索引)
    forecast_results.append(next_day_pred[0][0])
    
    # 更新输入窗口:去掉最前面的1天,把刚预测的值加到末尾
    # 先把预测值reshape成和窗口匹配的维度:(1, 1, n_features)
    pred_reshaped = next_day_pred.reshape(1, 1, n_features)
    # 拼接成新的90天窗口
    input_window = np.concatenate([input_window[:, 1:, :], pred_reshaped], axis=1)

# 最后forecast_results就是10天的超前预测值
print("10天超前预测结果:", forecast_results)

优缺点:

  • 优点:不用重新训练模型,代码简单,直接用你现有的模型就能实现;
  • 缺点:预测误差会随着步数累积,越往后的预测误差可能越大。
方法二:直接多步预测(需要重新训练,但误差不累积)

如果你想避免递归预测的误差累积问题,可以直接训练一个能一次性输出10天预测的模型。这种方法需要你重新准备训练数据:把每个90天的输入窗口,对应到它之后的10天真实值作为输出标签。

代码示例(重新构建并训练模型):

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense

# 假设你的训练数据X是(样本数, 90, n_features),y是(样本数, 10)
# 每个y样本对应X样本之后的10天真实数据

# 构建模型:输出层设置为10个单元,对应10天的预测
model_multi_step = Sequential()
model_multi_step.add(LSTM(64, input_shape=(90, n_features)))  # 可根据你的需求调整LSTM单元数
model_multi_step.add(Dense(10))  # 直接输出10天的预测值
model_multi_step.compile(optimizer='adam', loss='mse')

# 训练模型(记得用你准备好的多步输出训练数据)
model_multi_step.fit(X_train, y_train, epochs=50, batch_size=32, validation_split=0.1)

# 预测时,直接输入最后90天的数据,就能得到10天的预测结果
forecast_10_days = model_multi_step.predict(dataset.reshape(1, 90, n_features), verbose=0)[0]
print("一次性10天超前预测结果:", forecast_10_days)

优缺点:

  • 优点:每个天的预测都是独立的,不会有误差累积的问题;
  • 缺点:需要重新准备训练数据(把标签改成10天的序列),且模型训练需要更多的数据支撑。
关键注意事项:数据缩放要和训练时一致

如果训练模型前你对数据做了标准化/归一化(比如用MinMaxScaler),那预测时必须用同一个scaler对输入窗口进行缩放,得到预测结果后还要反缩放回原始数据范围,不然预测值会是缩放后的数值,没有实际意义。举个例子:

from sklearn.preprocessing import MinMaxScaler

# 注意:这个scaler必须是你训练时用的那个,最好训练完保存下来(比如用joblib)
scaler = MinMaxScaler(feature_range=(0, 1))
# --- 训练时的缩放过程(示例)---
# scaled_train_data = scaler.fit_transform(train_data)

# 预测前先缩放输入窗口
scaled_input = scaler.transform(dataset)
input_window = scaled_input.reshape(1, 90, n_features)

# 进行递归预测(用方法一的代码)
# ... 得到forecast_results ...

# 把预测结果反缩放回原始范围
forecast_scaled = np.array(forecast_results).reshape(-1, 1)
forecast_real_values = scaler.inverse_transform(forecast_scaled).flatten()
print("反缩放后的真实预测值:", forecast_real_values)

内容的提问来源于stack exchange,提问作者Артур

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:22:07