
简介这份资源面向时间序列预测方向的研究生与科研人员针对官方Informer模型仅支持固定长度预测、难以满足论文实验需求的痛点在原始代码基础上扩展了滚动长期预测能力首次预测未来24个时间点后自动回填结果并继续预测下一段无需手动填补便于评估固定区间精度也可接入自动爬取数据形成实际应用。压缩包共131个文件约1.01MB以53个py源码与64个pyc编译文件为核心辅以xml配置、csv数据集、yml参数文件及png可视化结果覆盖模型训练、数据加载与实验配置等模块。目前已有5937人学习下载。读者可获得可复现的滚动预测改造方案、完整工程目录与结果可视化脚本并借助排错思路快速迁移到自身课题适合准备发表论文或开展长期预测实验的中高级学习者参考。1. 魔改 Informer 做滚动长期预测这套科研版代码到底能不能直接跑时间序列预测这个方向Informer 算是绕不开的一个基线。但真正上手过的人都知道原版 Informer 做长期预测时有个很别扭的地方它擅长一次性输出未来一大段序列可一旦你想做滚动预测——也就是每预测一步、把预测值喂回去、再预测下一步——原版那套 encoder-decoder 结构就开始别扭了。这套「魔改 Informer 滚动长期预测」的科研版本解决的正是这个痛点把滚动推理逻辑嵌进模型同时保留可视化输出让实验结果能直接进论文插图。它适合谁做毕业设计、写小论文、需要长期滚动预测对比实验的人。如果你只是想要一个开箱即用的预测工具这套代码偏科研向配置项多、可视化重不一定是最省事的选择。但如果你需要「能改、能画、能写进论文」的完整流程它比调包强得多。下面我按实际拆包复现的顺序把这份资源讲透。2. 魔改点拆解滚动预测为什么不能直接用原版 Informer2.1 原版 Informer 的长期预测逻辑与它的边界原版 Informer 的核心是 ProbSparse 自注意力加蒸馏机制把长序列的注意力复杂度从 O(L²) 压到 O(L log L)。它的预测方式是一次性输出整个 decoder 长度对应的序列比如你设预测长度 96它一口气吐出 96 个点。这在「一次性预测」任务里没问题但滚动长期预测要求的是预测第 1 步把结果拼回输入再预测第 2 步如此往复。问题就出在这。原版 decoder 的输入里有一段是占位符通常是 0 或者均值填充靠 attention 去「猜」这段。滚动预测时你每一步的输入都变了但原版没有为这种逐步推理设计缓存机制每步都要重新跑一遍完整 encoder计算量直接爆炸。更麻烦的是原版对预测误差的累积没有做任何约束滚动几十步之后输出会漂移到离谱——这就是很多人说的「玄学漂移」。常见做法是要么改成自回归式逐步输出要么在 decoder 里加一个反馈通道。这套魔改版走的是后者同时保留了原版的稀疏注意力算是折中方案。2.2 魔改版的三处关键改动拆开代码看改动集中在三个地方我按重要性排第一处是 decoder 输入重构。原版 decoder 输入是[已知序列 占位符]魔改版把它改成[已知序列 上一步预测值 占位符]让模型在每一步都能看到自己上一步的输出。这个改动看着小但它把「一次性预测」变成了「带反馈的滚动预测」。第二处是滚动窗口管理。代码里有一个RollingWindow类负责维护输入窗口的滑动和预测值的回填。它控制两个参数window_size输入窗口长度和pred_step单步预测长度。滚动时窗口每次滑动pred_step个位置把新预测的值填进去。第三处是误差累积抑制。魔改版在损失函数里加了一项对预测值变化率的惩罚防止滚动过程中输出剧烈抖动。这一项权重由smooth_weight控制默认 0.1调大了会让预测更平滑但可能欠拟合。提示这三处改动里第一处是必须的后两处可以根据你的数据特性决定要不要保留。如果你的数据本身波动大smooth_weight 建议调小甚至设 0。2.3 滚动预测的推理流程滚动推理的伪代码逻辑如下实际代码里封装在predict_rolling方法中# 滚动预测核心逻辑简化示意 def predict_rolling(model, init_input, total_steps, pred_step): init_input: 初始输入窗口shape [batch, window_size, features] total_steps: 总共要预测多少步 pred_step: 每次前向预测多少步 outputs [] current_input init_input.clone() steps_done 0 while steps_done total_steps: # 前向预测 pred_step 步 pred model(current_input) # shape [batch, pred_step, features] outputs.append(pred) # 把预测值拼回输入窗口滑动窗口 current_input torch.cat([ current_input[:, pred_step:, :], # 去掉最旧的 pred_step 步 pred # 拼上新预测的 ], dim1) steps_done pred_step return torch.cat(outputs, dim1)逻辑说明每次预测pred_step步然后把窗口往前滑pred_step用预测值填补。参数pred_step是关键——设太小比如 1会导致推理极慢设太大比如等于 window_size就退化成一次性预测失去滚动意义。我一般设成 window_size 的 1/4 到 1/2。3. 环境配置与数据准备从零把代码跑起来3.1 依赖安装与版本对齐这套代码基于 PyTorch依赖不算多但版本敏感。我踩过的坑是 torch 版本和 numpy 版本不匹配导致torch.from_numpy报错。建议按下面这个组合来# 创建虚拟环境 conda create -n informer_rolling python3.8 -y conda activate informer_rolling # 安装核心依赖版本尽量对齐 pip install torch1.13.1cu117 -f https://download.pytorch.org/whl/torch_stable.html pip install numpy1.23.5 pip install pandas1.5.3 pip install matplotlib3.7.1 pip install scikit-learn1.2.2 pip install tensorboard2.13.0参数说明torch 用 1.13.1 是因为魔改版里用到了torch.nn.functional.scaled_dot_product_attention的早期接口2.0 之后接口有变动直接跑会报unexpected keyword argument。numpy 锁 1.23.5 是为了避开 1.24 之后移除的np.float别名问题。如果你没有 GPU把 torch 换成 CPU 版即可但滚动预测在 CPU 上会非常慢长序列建议至少 8G 显存的卡。3.2 数据格式与预处理代码默认读的是 CSV要求三列date、target、以及若干协变量列。时间列会被解析成索引target 是你要预测的主变量。预处理脚本在data_loader.py里核心是标准化和滑窗切分# 数据预处理关键步骤 from sklearn.preprocessing import StandardScaler def prepare_data(df, target_col, feature_cols, window_size, pred_step): scaler StandardScaler() # 只对特征做标准化target 单独处理 df[feature_cols] scaler.fit_transform(df[feature_cols]) data df[feature_cols [target_col]].values X, Y [], [] for i in range(len(data) - window_size - pred_step 1): X.append(data[i : i window_size]) Y.append(data[i window_size : i window_size pred_step, -1]) return np.array(X), np.array(Y), scaler逻辑说明window_size是输入窗口长度pred_step是单次预测步长。注意这里 Y 只取 target 列X 包含所有特征。标准化只对特征做target 保持原尺度方便后面反标准化画图。参数上window_size 一般取 96 或 168对应 4 天或 7 天的小时数据pred_step 取 24 或 48。注意如果你的数据有缺失值代码里没有自动填充逻辑需要你在传入前用插值或前向填充处理掉否则标准化会出 NaN。3.3 配置文件怎么改项目根目录有个config.yaml所有关键参数都在里面。我列一下必须改的几项参数名含义建议值seq_len输入窗口长度96pred_len单次预测步长24rolling_total滚动总步数336d_model模型隐藏维度64n_heads注意力头数4smooth_weight平滑惩罚权重0.1batch_size批大小32epochs训练轮数50rolling_total要能被pred_len整除否则最后一段会补零画图时会出现断崖。d_model和n_heads要满足整除关系64/4 是安全组合改成 128/6 会报维度错误。4. 训练与滚动推理参数怎么设、结果怎么看4.1 训练脚本与损失曲线判读训练入口是train.py直接python train.py --config config.yaml就能跑。训练过程中 tensorboard 会记录 loss我一般会盯两个信号训练 loss 是否稳定下降、验证 loss 是否在某个 epoch 后反弹。反弹说明过拟合这时候要么加 dropout要么减 d_model。魔改版的损失函数是 MSE 加平滑项# 损失函数定义 def rolling_loss(pred, true, smooth_weight0.1): mse F.mse_loss(pred, true) # 平滑项惩罚相邻预测步之间的剧烈变化 diff pred[:, 1:, :] - pred[:, :-1, :] smooth torch.mean(diff ** 2) return mse smooth_weight * smooth参数说明smooth_weight控制平滑项占比。设 0 就是纯 MSE设太大比如 1.0会让预测趋近于一条直线。我试过 0.05 到 0.3 之间0.1 在多数数据上比较稳。如果你的数据本身噪声大可以适当调高到 0.2。4.2 滚动推理的两种模式代码支持两种滚动模式通过--rolling_mode切换step模式每次只预测pred_step步然后立刻回填窗口。优点是误差累积慢缺点是推理时间长。chunk模式先一次性预测一大段再分段回填。优点是快缺点是误差累积快。我一般先用step模式验证模型效果确认没问题后再用chunk模式跑大批量实验。切换方式# step 模式 python predict.py --config config.yaml --rolling_mode step # chunk 模式 python predict.py --config config.yaml --rolling_mode chunk --chunk_size 96chunk_size只在 chunk 模式下生效表示每次预测多少步再回填。设成pred_len的整数倍比较合理。4.3 可视化输出与论文插图预测完会在results/下生成三张图预测对比图、误差分布图、滚动误差累积曲线。预测对比图是直接能进论文的横轴时间、纵轴数值真实值和预测值两条线。误差累积曲线用来展示滚动多少步之后误差开始失控这个图在论文里很有说服力。画图脚本用的是 matplotlib中文字体需要手动设否则会显示方块import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] [SimHei] # 中文字体 plt.rcParams[axes.unicode_minus] False # 负号正常显示如果你的环境没有 SimHei换成Microsoft YaHei或者直接输出英文标签。论文里一般用英文所以这个坑不算致命但自己看结果时中文更直观。5. 避坑与排查滚动预测里最容易翻车的五个地方5.1 预测值漂移成一条直线现象滚动几十步后预测曲线变成一条水平线完全不跟随真实值波动。原因smooth_weight设太大或者模型在训练时过拟合了训练集的平稳段导致推理时倾向于输出均值。解决先把smooth_weight降到 0.05 以下重新训练。如果还漂检查训练集里是不是有大量重复值或缺失填充值这些会让模型学到「输出常数最安全」。5.2 滚动推理速度慢到无法接受现象step模式下预测 336 步要跑十几分钟。原因每步都重新跑完整 encoder没有缓存。这是原版结构的遗留问题魔改版没有彻底解决。解决改用chunk模式把chunk_size设成 48 或 96。或者把d_model从 64 降到 32速度能快一倍多精度损失通常在可接受范围内。5.3 反标准化后数值量纲错乱现象预测图里预测值和真实值差了一个数量级。原因标准化时对 target 也做了处理但反标准化时只对预测值做了逆变换真实值没做或者 scaler 拟合时用了全量数据导致信息泄漏。解决确保 scaler 只在训练集上 fit然后对训练、验证、测试集分别 transform。反标准化时对预测值和真实值用同一个 scaler 的inverse_transform。5.4 多变量输入时特征对齐错误现象加了协变量之后预测效果反而比单变量差。原因协变量的时间对齐没做对比如把未来才知道的变量如节假日标记当成了历史输入。解决检查feature_cols里有没有「未来信息」列。滚动预测只能用预测时刻之前已知的变量任何未来信息都会导致信息泄漏让验证集效果好但实际推理崩掉。5.5 GPU 显存溢出现象训练到一半报CUDA out of memory。原因batch_size或seq_len太大或者滚动推理时没有用torch.no_grad()。解决推理时强制加with torch.no_grad():能省一半显存。训练时把batch_size降到 16或者开梯度累积。如果还不行把seq_len从 96 降到 48但预测长度也要相应调整。6. 进阶技巧把滚动误差压下来的两个实操手段第一个手段是分段训练。不要一上来就让模型学 336 步的滚动先让它学 24 步收敛后再逐步加长到 48、96。代码里可以通过改rolling_total实现每次训练完保存权重下次加载继续训。这个做法类似课程学习我实测能把长步滚动的误差降低 15% 到 20%。第二个手段是误差反馈校正。在滚动推理时维护一个误差缓冲区每预测一步把上一步的预测误差按比例反馈到当前输入里。代码里加一个error_feedback开关# 误差反馈校正在 predict_rolling 里加 if error_feedback: # 计算上一步误差 last_error true_value - last_pred # 推理时 true_value 用最近已知值近似 # 按比例反馈到当前输入 current_input[:, -1, -1] feedback_ratio * last_errorfeedback_ratio我一般设 0.1 到 0.3设太大会引入振荡。这个技巧在数据有明显趋势时效果最好纯随机数据上提升有限。验证方法上我习惯把滚动预测结果按步长分段统计误差前 24 步、24 到 96 步、96 步以上各算一次 MAE。如果后段误差突然跳升说明模型的长程依赖没学好这时候要么加长训练要么检查位置编码有没有截断。从那以后我每次跑滚动预测都会先拿一小段数据做 10 步的快速验证确认误差累积曲线是平缓上升而不是指数爆炸再上全量。这个习惯帮我省了无数次白跑一晚上的电费。希望帮到你。本文还有配套的精品资源点击获取