时间序列预测:如何使用已训练保存模型预测未来24小时数据?
问题说明
参考Hvass-Labs TensorFlow时间序列预测教程完成自有数据的模型训练后,直接执行y_pred = model.predict(past_dataset)得到的结果是模型对历史输入段的拟合值(即示意图中与历史灰线走势贴合的红线),无法直接输出2022-06-06全天的未来24小时预测结果,按以下步骤操作即可得到目标预测值。
具体实现步骤
- 先确认模型的两个基础参数
先对齐训练阶段的配置:一是模型要求的输入序列长度(即单次预测需要喂给模型多少个连续历史时间步的数据),二是模型单次输出的预测步长(如果是直接预测24小时则步长为24,对应1小时粒度的全天数据;如果是单步预测则每次仅输出1个时间步的结果)。 - 构造预测用的输入序列
取距离预测起点最近、长度等于模型输入要求的连续历史数据,做和训练阶段完全一致的预处理:包括缺失值填充、归一化/标准化、特征工程,最后reshape成模型要求的输入张量形状(单样本预测的格式一般为[1, 输入序列长度, 特征数量])。
举个例子:如果模型要求输入过去168小时(7天)的数据预测未来24小时,你就取2022-05-30 00:00至2022-06-05 24:00的处理后数据作为输入即可,不需要把5月21日开始的全量历史数据都喂进去。 - 执行预测并还原结果
多步预测模型(单次输出24步)直接调用预测接口即可:
最终得到的# last_processed_seq为预处理完成、形状符合要求的输入序列 y_future = model.predict(last_processed_seq, verbose=0) # 对预测结果做反归一化,还原为原始数据的量纲 y_future_origin_scale = scaler.inverse_transform(y_future.reshape(-1, 1)).flatten()y_future_origin_scale就是2022-06-06 00:00至24:00的全天预测值,按时间顺序对齐即可。
如果是单步预测模型,需要做滚动迭代预测:每预测1个时间步的结果,就把该结果追加到输入序列末尾、删掉输入序列最头部的1个旧时间步,保持输入序列长度不变,再预测下一个时间步,循环24次即可得到全天结果。注意滚动预测的误差会随步长增加逐步累积。
之前预测结果不符合预期的原因
你之前传入的past_dataset是把整段2022-05-21至2022-06-05的历史数据按滑动窗口规则切分后的数据集,模型对每个滑动窗口输出的是该窗口后紧邻的一段预测值,把所有窗口的预测结果按时间拼接后,就得到了和历史灰线走势贴合的红线,本质是模型在历史数据上的回测拟合效果,不是向外推演的未来预测值。
注意事项
- 所有预处理、反归一化的逻辑必须和训练阶段完全一致,不能随意更改参数,否则预测结果会完全失真
- 对齐时间轴时注意确认训练时的偏移逻辑:如果输入序列最后一个时间点是t,要确认模型输出的第一个预测点对应t+1还是t,避免时间错位
内容的提问来源于stack exchange,提问作者Dorr
相关产品推荐
相关产品推荐

