Keras LSTM时间序列预测:如何生成超出验证集范围的未来预测?
LSTM超验证期未来预测实现方案
LSTM时间序列预测依赖固定长度的历史时间窗口输入输出未来值,没有现成的未来输入的场景下,用自回归迭代的方式就能实现,具体步骤和代码如下:
- 第一步:确认训练时的输入窗口长度
window_size,也就是你训练模型时用了过去多少个时间步的数据预测下一个步的值,这个值要和训练时完全一致。 - 第二步:提取你手里所有已知数据中,最新的
window_size条已经完成预处理(归一化、差分等,和训练集预处理规则完全一致)的数据,整理成和训练输入维度一致的初始窗口,一般维度是(1, window_size, 特征数)。 - 第三步:把初始窗口喂给模型得到第一个未来时间步的预测值,把预测值存入结果列表。
- 第四步:滑动更新窗口:删掉窗口最开头的旧数据,把刚得到的预测值拼到窗口末尾,保持窗口长度始终为
window_size。 - 第五步:重复第三步和第四步,直到你得到需要的所有未来时间步的预测结果。
- 第六步:对所有预测结果做逆预处理变换(比如逆归一化、逆差分),还原成真实业务尺度的数值即可。
对应参考代码的实现示例:
import numpy as np # 自定义参数:训练用窗口长度,需要预测的未来步数,输入特征数 window_size = 30 future_steps = 30 n_features = 1 # 单特征时间序列填1,多特征填对应特征数量 # 1. 生成初始输入窗口:取所有预处理后数据的最后window_size条 # transformed_all_data是全量预处理后的数据,包含训练+验证所有已知数据 last_window = transformed_all_data[-window_size:].reshape(1, window_size, n_features) future_predictions = [] for _ in range(future_steps): # 2. 预测单步结果 current_pred = model.predict(last_window, verbose=0)[0] future_predictions.append(current_pred) # 3. 滑动更新窗口 last_window = np.roll(last_window, shift=-1, axis=1) last_window[0, -1, :] = current_pred # 4. 逆变换还原真实值,scaler为训练时用的归一化/标准化工具 future_predictions = scaler.inverse_transform(np.array(future_predictions))
注意:这种递归预测的误差会随着预测步长增加逐步累积,如果需要预测长周期的未来数据,可以改为训练时直接输出对应长度的多步结果,或者改用seq2seq结构的LSTM降低误差。如果是多特征输入场景,提前已知的外生特征(如节假日、营销活动计划等)要提前填入对应时间步,不要用预测值,避免误差进一步放大。

内容的提问来源于stack exchange,提问作者Zizzipupp
相关产品推荐
相关产品推荐

