Informer-Informer
Informer-Informer 模块在当前项目中的真实实现,主后端是一个基于 PyTorch 的简化 Informer 时序预测器,支持 ProbSparse 或 Full 注意力、编码器蒸馏卷积 (distil) 以及多步预测输出。需要首先说明两点:
Informer-Informer
1. 方法概述
Informer-Informer 模块在当前项目中的真实实现,主后端是一个基于 PyTorch 的简化 Informer 时序预测器,支持 ProbSparse 或 Full 注意力、编码器蒸馏卷积 (distil) 以及多步预测输出。需要首先说明两点:
- 当前核心代码只使用时间列和目标列,并没有把其他外生特征送入 Informer 主模型;
- 若环境中未安装
torch,程序会退化为基于sklearn.linear_model.Ridge的滑窗多步回归后备实现。
设按时间顺序整理后的单变量序列为
$$ \mathcal{D}=\{(t_i,y_i)\}_{i=1}^{N},\qquad y_i\in\mathbb{R} \tag{1} $$
其中 \(t_i\) 为时间戳,\(y_i\) 为目标变量。该模块本质上是一个单变量长短期时序预测器,而不是多变量 Informer。
2. 数据预处理、时间特征与窗口构造
2.1 数据清洗
程序在 set_data() 中只保留时间列与目标列,删除缺失值,并按时间列升序排序,得到
$$ \tilde{\mathcal{D}}=\{(\tilde t_i,\tilde y_i)\}_{i=1}^{\tilde N} \tag{2} $$
其中 \(\tilde N\) 为清洗后的有效样本数。若目标列不是数值型,代码会直接报错;时间列会先尝试转成 datetime,若失败则保留原值并继续后续流程。
2.2 时间特征
Informer 主模型除目标序列外,还会为每个时间步构造 4 维时间特征:
$$ \mathbf{m}_i= \begin{bmatrix} (\mathrm{month}(t_i)-1)/11\\ (\mathrm{day}(t_i)-1)/30\\ \mathrm{weekday}(t_i)/6\\ \mathrm{hour}(t_i)/23 \end{bmatrix} \in\mathbb{R}^{4} \tag{3} $$
若时间列无法解析为合法日期,程序会退化为基于样本索引的伪周期特征:
$$ \mathbf{m}_i= \begin{bmatrix} (i\bmod 12)/11\\ (i\bmod 31)/30\\ (i\bmod 7)/6\\ (i\bmod 24)/23 \end{bmatrix} \tag{4} $$
2.3 全序列标准化
若勾选 normalize=True,代码会先用全序列而不是训练子集的统计量对目标值做标准化:
$$ y_i^{\ast}=\frac{y_i-\mu}{\sigma} \tag{5} $$
其中
$$ \mu=\frac{1}{\tilde N}\sum_{i=1}^{\tilde N}y_i,\qquad \sigma=\sqrt{\frac{1}{\tilde N}\sum_{i=1}^{\tilde N}(y_i-\mu)^2} \tag{6} $$
这意味着当前实现的标准化统计量包含了测试区间信息,严格论文实验中应意识到这一点。
2.4 Informer 训练窗口
设编码器历史长度为 \(L\)(lookback/seq_len),解码器已知历史长度为 \(L_{\mathrm{lab}}\)(label_len),预测长度为 \(H\)(horizon/pred_len)。对起点 \(s\),编码器输入为
$$ \mathbf{x}^{\mathrm{enc}}_s= \begin{bmatrix} y_s^{\ast},y_{s+1}^{\ast},\ldots,y_{s+L-1}^{\ast} \end{bmatrix}^{\top} \tag{7} $$
解码器输入在训练/验证/测试阶段被构造为
$$ \mathbf{x}^{\mathrm{dec}}_s= \begin{bmatrix} y_{s+L-L_{\mathrm{lab}}}^{\ast},\ldots,y_{s+L+H-1}^{\ast} \end{bmatrix}^{\top} \tag{8} $$
对应监督目标为
$$ \mathbf{y}_s= \begin{bmatrix} y_{s+L}^{\ast},y_{s+L+1}^{\ast},\ldots,y_{s+L+H-1}^{\ast} \end{bmatrix}^{\top} \tag{9} $$
代码要求至少满足
$$ \tilde N\ge L+H+1 \tag{10} $$
可构造的窗口总数为
$$ M=\tilde N-L-H+1 \tag{11} $$
这里有一个非常关键的实现细节:式 \((8)\) 在训练、验证和测试阶段直接包含未来真实值段 \(y_{s+L}^{\ast},\ldots,y_{s+L+H-1}^{\ast}\)。因此,测试集 RMSE/MAE 并不是严格“全零未来占位符”条件下的纯前瞻误差。
2.5 切分方式与真实未来预测输入
窗口样本按时间顺序切分。若测试比例为 \(r_{\mathrm{te}}\),则
$$ M_{\mathrm{te}}=\max(1,\lfloor Mr_{\mathrm{te}}\rfloor),\qquad M_{\mathrm{tr}}=M-M_{\mathrm{te}} \tag{12} $$
若 \(M_{\mathrm{tr}}>10\),代码会再从训练尾部抽取约 10% 窗口作为验证集;否则不显式构造验证集。
只有在最终未来预测阶段,程序才使用更接近标准 Informer 的 decoder 输入:
$$ \mathbf{x}^{\mathrm{dec,future}}= \begin{bmatrix} y_{\tilde N-L_{\mathrm{lab}}+1}^{\ast},\ldots,y_{\tilde N}^{\ast},0,\ldots,0 \end{bmatrix}^{\top} \tag{13} $$
因此,Forecast 表中的未来预测与 TestPreds/测试指标所对应的推断条件并不完全相同。
3. Informer 核心网络结构
3.1 数据嵌入
当前实现的输入嵌入由 1D 卷积值嵌入、位置编码和时间特征线性投影三部分相加构成:
$$ E(x_t,m_t)=E_{\mathrm{token}}(x_t)+E_{\mathrm{pos}}(t)+E_{\mathrm{time}}(m_t) \tag{14} $$
其中 TokenEmbedding 使用一维卷积将单变量输入映射到 d_model 维空间。
3.2 注意力机制
若 attn="full",则使用标准缩放点积注意力:
$$ \mathrm{Attn}(Q,K,V)=\mathrm{softmax}\!\left(\frac{QK^{\top}}{\sqrt{d_k}}\right)V \tag{15} $$
若 attn="prob",则使用 ProbSparseAttention。其核心思想是在每个 query 上只挑选最重要的若干 query-key 交互,再更新上下文表示;因此它是一个Informer 风格的稀疏注意力近似,而不是普通 Transformer 全连接注意力。
3.3 编码器、蒸馏卷积与解码器
编码器每层由注意力子层、前馈网络和残差归一化组成,可写为
$$ H^{(\ell)}=\mathrm{LN}\!\left(\mathrm{FFN}\!\left(\mathrm{LN}\!\left(H^{(\ell-1)}+\mathrm{Attn}(H^{(\ell-1)})\right)\right)+\cdots\right) \tag{16} $$
当 distil=True 且 e_layers>1 时,编码器层间插入卷积降采样模块:
$$ \tilde H^{(\ell)}=\mathrm{MaxPool}\!\left(\mathrm{ELU}\!\left(\mathrm{BN}\!\left(\mathrm{Conv1D}(H^{(\ell)})\right)\right)\right) \tag{17} $$
解码器包含因果自注意力和交叉注意力,最终通过线性层输出未来 \(H\) 步预测值:
$$ \hat{\mathbf{y}}_s=W_o H^{\mathrm{dec}}_s+b_o,\qquad \hat{\mathbf{y}}_s\in\mathbb{R}^{H} \tag{18} $$
程序只返回解码器最后 pred_len 个时间步的输出。
4. 训练目标、后备实现与评价指标
4.1 主模型训练目标
PyTorch 主实现使用均方误差损失:
$$ \mathcal{L}_{\mathrm{MSE}}=\frac{1}{M_{\mathrm{tr}}H}\sum_{s=1}^{M_{\mathrm{tr}}}\sum_{h=1}^{H}\left(y_{s,h}^{\ast}-\hat y_{s,h}^{\ast}\right)^2 \tag{19} $$
优化器为 Adam,学习率由 learning_rate 指定;若存在验证集,则以 val_loss 执行早停并恢复最佳参数。
4.2 torch 不可用时的后备路径
若环境中没有 torch,程序会退化为 Ridge(alpha=1.0) 多输出回归器。此时输入特征是展平后的历史窗口:
$$ \mathbf{z}_s= \begin{bmatrix} y_{s-L}^{\ast},\ldots,y_{s-1}^{\ast} \end{bmatrix} \tag{20} $$
输出则直接回归整个未来向量 \(\mathbf{y}_s\)。该路径会把参数表中的 backend 记为 sklearn_fallback,并只生成 1 至 2 条伪训练日志。
4.3 评价指标
程序最终输出的测试指标只有 rmse 与 mae:
$$ \mathrm{RMSE}=\sqrt{\frac{1}{M_{\mathrm{te}}H}\sum_{s=1}^{M_{\mathrm{te}}}\sum_{h=1}^{H}(y_{s,h}-\hat y_{s,h})^2} \tag{21} $$
$$ \mathrm{MAE}=\frac{1}{M_{\mathrm{te}}H}\sum_{s=1}^{M_{\mathrm{te}}}\sum_{h=1}^{H}|y_{s,h}-\hat y_{s,h}| \tag{22} $$
注意,这里的误差是对全部测试窗口的全部 horizon 输出展开后计算的;而 TestPreds 工作表只展示最后一个测试窗口的 actual/pred 对比。
4.4 输出结果说明
代码当前导出的 Excel 工作表包括:
RawData:清洗后的原始时间列与目标列;Supervised:论文导向的滑窗摘要表,列为lag_0...lag_{L-1}、target_t+pred、time;Processed:与Supervised内容相同,再保存一份;TestPreds:最后一个测试窗口的真实值与预测值;Forecast:末端窗口向未来 \(H\) 步的预测;Metrics:rmse与mae;Params与Parameters:相同的参数表双份导出;TrainingLog:逐 epoch 的train_loss与val_loss;Charts:图表路径索引。
此外,结果目录通常还会生成:
test_pred_vs_actual.png:最后一个测试窗口预测对比图;forecast.png:未来 horizon 预测图;repro_*.py:复现脚本;repro_inputs/:复现实验所需输入副本。
需要特别指出:Supervised/Processed 只是便于论文写作的摘要表,并不是 Informer 真实训练时所用的四元组张量 x_enc/x_mark_enc/x_dec/x_mark_dec 的完整展开表示。
5. 算法流程
按照当前项目实现,Informer-Informer 的计算流程如下:
- 读取 Excel/CSV 数据,并仅保留时间列和目标列;
- 解析时间列、按时间升序排序、检查目标列数值合法性;
- 构造月、日、星期、小时 4 维时间特征;
- 若启用
normalize,则用全序列均值与标准差对目标序列标准化; - 依据
lookback、label_len与horizon构造 Informer 窗口; - 按时间顺序划分训练集、可选验证集与测试集;
- 训练 PyTorch Informer 主模型;若无
torch则退化为Ridge后备预测器; - 在测试集上计算 RMSE/MAE,并抽取最后一个测试窗口生成
TestPreds; - 使用序列末端窗口与零填充 decoder 输入生成真正的未来预测
Forecast; - 导出 Excel、图表和复现脚本。
6. 关键参数说明
表 1 关键参数及含义
| 参数 | 含义 | 当前默认值 |
|---|---|---|
time_column |
时间列名 | 用户指定 |
target_column |
目标列名 | 用户指定 |
lookback |
编码器历史长度 \(L\) | 24 |
label_len |
decoder 已知历史长度 \(L_{\mathrm{lab}}\) | 默认为 lookback/2,界面默认 12 |
horizon |
未来预测步长 \(H\) | 12 |
test_size |
测试集比例 | 0.20 |
random_state |
随机种子 | 可为空 |
d_model |
嵌入维度 | 64 |
n_heads |
注意力头数 | 4 |
e_layers |
编码器层数 | 2 |
d_layers |
解码器层数 | 1 |
d_ff |
前馈网络隐藏维度 | 128 |
dropout |
Dropout 比例 | 0.10 |
factor |
ProbSparse 采样强度参数 | 3 |
attn |
注意力类型 | prob |
distil |
是否启用卷积降采样蒸馏 | True |
epochs |
最大训练轮数 | 20 |
batch_size |
批大小 | 32 |
learning_rate |
学习率 | \(10^{-3}\) |
patience |
早停耐心轮数 | 5 |
normalize |
是否标准化目标序列 | True |
7. 论文写作模板
7.1 方法描述模板
可在论文“方法部分”中写为:
“本文采用基于 Informer 思想的长序列预测模型对单变量时间序列进行建模。首先,将原始时间序列按时间顺序整理,并从时间戳中提取月、日、星期和小时等时间特征;其次,依据历史窗口长度 \(L\)、decoder 已知历史长度 \(L_{\mathrm{lab}}\) 和预测步长 \(H\) 构造编码器输入、解码器输入与监督目标;随后,通过值嵌入、位置编码和时间特征嵌入构造序列表示,并在编码器中使用 ProbSparse 注意力和可选卷积蒸馏模块提取长短期依赖,在解码器中结合因果自注意力与交叉注意力生成未来多步预测;最后,采用均方误差损失训练模型,并使用 RMSE 与 MAE 评价预测精度。”
7.2 结果解释模板
结果部分可写为:Informer 适用于较长历史窗口下的多步预测任务。若模型在较长预测步长下仍能保持较低误差,则说明 ProbSparse 注意力对长距离依赖具有较好的建模能力;若后备实现与主实现结果差异明显,也应在正文中说明运行环境差异。
7.3 表格标题模板
表题可写为:Informer 长序列预测结果与误差指标汇总表。
7.4 图表题注模板
图注可写为:Informer 模型多步预测结果与真实序列对比图。
7.5 表格示例
建议列名:预测步长、真实值、预测值、残差、RMSE、MAE、历史窗口长度。
8. 实现说明与注意事项
- 当前实现虽然名为
Informer-Informer,但核心数据入口只保留“时间列 + 目标列”,并未真正接入多变量外生特征;论文若写成多变量 Informer,需要先确认代码已扩展。 README与安装说明中存在明显的 SVM 错拷文本,不能作为算法描述依据;应以core/informer_calculator.py和core/informer_model.py为准。- 若启用
normalize,标准化使用的是全序列均值与标准差,而非训练集统计量,这会引入一定的信息泄漏。 - 训练、验证和测试阶段的 decoder 输入直接包含未来真实值段,因此导出的
RMSE/MAE与TestPreds结果偏乐观;而Forecast使用的是“已知历史 + 未来零占位”输入,二者的推断条件并不完全一致。 - 若环境中没有
torch,程序不会报错退出,而会改用Ridge后备实现;因此正式实验前必须确认实际运行后端,否则“Informer”与“线性回归”结果会被混淆。 TestPreds只展示最后一个测试窗口,不能代表全部测试窗口的逐样本明细;若论文需要完整测试预测表,需要自行扩展导出逻辑。
9. 论文写作建议
论文中建议谨慎使用 “Informer” 这一名称,并在方法部分补充说明当前实现的两个关键限制:
- 只保留时间列和目标列;
- 测试阶段与未来预测阶段输入条件并不完全相同。
结果部分可重点展示 RMSE、MAE、未来预测图和时间特征构造说明;若实验实际退化为 Ridge 后备实现,正文中必须如实说明。
10. 单篇终审补充
10.1 图题与表题对齐建议
RawData表可写为:表X Informer 原始时间序列数据预览。Supervised表可写为:表X Informer 监督化样本构造结果。Processed表可写为:表X Informer 处理后样本表。TestPreds表可写为:表X Informer 测试窗口真实值与预测值对照。Forecast表可写为:表X Informer 未来多步预测结果。Metrics表可写为:表X Informer 误差指标汇总。Params或Parameters表可写为:表X Informer 参数设置与模型配置。TrainingLog表可写为:表X Informer 训练阶段记录。Charts表可写为:表X Informer 图表索引与路径清单。test_pred_vs_actual.png建议写为:图X Informer 测试集真实值与预测值对比图。forecast.png建议写为:图X Informer 未来预测曲线图。
10.2 终审说明
- 当前代表性结果目录中的真实主工作簿为
Informer-Informer_results_20260329_022736.xlsx,复现输出为Informer-Informer_results_20260329_022736_repro.xlsx;论文若引用结果文件,应把“主运行结果”和“repro 结果”分开描述。 - 当前导出同时存在
Params和Parameters两张参数表,这是实现层面的兼容性重复,不应在正文中解释成两套不同参数实验。 Supervised与Processed在当前实现中都来自同一份处理后的监督样本表。论文里可以把两者分别描述为“监督化结果”和“处理后样本”,但不要再虚构额外的特征选择或深层特征工程过程。- 真实图文件只有
test_pred_vs_actual.png和forecast.png两类,因此结果章节宜聚焦“测试窗口拟合效果”和“未来外推结果”,而不是宣称存在注意力热力图或蒸馏层可视化。 - 真实 repro 脚本为
repro_Informer-Informer_20260329_022736.py,通过INPUT_FILE = 'repro_inputs/sample_data.csv'读取输入副本。附录若给出复现实验路径,应保持repro_inputs/...相对路径,不要写回本机绝对路径。
10.3 全量强化补充
本篇终审补充绑定的真实算法目录为 具体的算法3/深度学习与时序网络/Informer-Informer,本次采用的代表性结果目录为 具体的算法3/深度学习与时序网络/Informer-Informer/results/Informer-Informer分析结果_20260329_022736。
当前目录中真实存在两份工作簿:
Informer-Informer_results_20260329_022736.xlsxInformer-Informer_results_20260329_022736_repro.xlsx
两者实测工作表一致,均包含:
RawDataSupervisedProcessedTestPredsForecastMetricsParamsParametersTrainingLogCharts
因此这一轮应把 ...022736.xlsx 视为主结果,把 ...022736_repro.xlsx 视为 repro 再生产物。Params 与 Parameters 两张表同时存在只是兼容性重复,不是两套实验。
当前目录中的真实图文件分成两套:
Informer-Informer_results_20260329_022736_plots/test_pred_vs_actual.pngInformer-Informer_results_20260329_022736_plots/forecast.pngInformer-Informer_results_20260329_022736_repro_plots/test_pred_vs_actual.pngInformer-Informer_results_20260329_022736_repro_plots/forecast.png
这说明当前磁盘同时保留了主结果图和 repro 图,图义一致,都是测试窗口拟合图与未来预测图。
复现实物方面,该目录实际包含:
具体的算法3/深度学习与时序网络/Informer-Informer/results/Informer-Informer分析结果_20260329_022736/repro_Informer-Informer_20260329_022736.py具体的算法3/深度学习与时序网络/Informer-Informer/results/Informer-Informer分析结果_20260329_022736/repro_inputs/sample_data.csv
脚本中明确写成 INPUT_FILE = 'repro_inputs/sample_data.csv'、OUTPUT_FILE = 'Informer-Informer_results_20260329_022736_repro.xlsx'。因此这一篇当前的真实可复现性已是目录内相对输入副本方案。
11. 软件实现核查补充(2026-07)
- 当前主结果目录应写作
具体的算法3/深度学习与时序网络/Informer-Informer/results/Informer-Informer分析结果_20260329_022736。 - 正文应围绕
RawData、Processed、TestPreds、Forecast、Metrics、Params、Parameters、TrainingLog、Charts来写。 - 图证应对应
test_pred_vs_actual.png与forecast.png,并把主结果和 repro 再生产物区分开。 - 复现脚本应按
repro_Informer-Informer_20260329_022736.py + repro_inputs/sample_data.csv的口径说明。