正在加载中...

展开本页目录
算法教程TransformerTS-Transformer 时序

TransformerTS-Transformer 时序

No.159 · 在线教程

TransformerTS-Transformer 时序 模块的真实实现,位于 core/transformertscalculator.py。与前面的 TFT 轻量版本不同,这个模块更接近一个标准的 encoder-only Transformer 时序模型:

TransformerTS-Transformer 时序

1. 方法概述

TransformerTS-Transformer 时序 模块的真实实现,位于 core/transformer_ts_calculator.py。与前面的 TFT 轻量版本不同,这个模块更接近一个标准的 encoder-only Transformer 时序模型

  • 先把表格数据构造成滑动窗口序列;
  • 通过线性层将输入投影到 d_model
  • 叠加多层 Transformer Encoder 风格的“自注意力 + 前馈网络 + 残差归一化”;
  • GlobalAveragePooling1D 汇聚整段序列;
  • 最后输出回归值或分类概率。

设按时间顺序排列的样本为

$$ \mathcal{D}=\{(x_t,y_t)\}_{t=1}^{N},\qquad x_t\in\mathbb{R}^{d},\ y_t\in\mathcal{Y} \tag{1} $$

其中 \(x_t\) 为第 \(t\) 行的特征向量,\(y_t\) 为目标变量。当前实现默认数据行顺序即时间顺序,不单独要求时间列参与建模。

2. 数据预处理与序列构造

2.1 特征编码

用户在界面中显式勾选 feature_cols 后,程序会从这些列中构造输入矩阵。若 scale_method="none",仅保留数值型特征;否则执行 pd.get_dummies(),得到编码后的特征向量

$$ \tilde{x}_t\in\mathbb{R}^{d'} \tag{2} $$

这意味着:

  • scale_method="none" 时,非数值特征会被直接丢弃;
  • scale_method="standard"minmax 时,类别特征会先做 One-Hot 编码;
  • 编码发生在完整数据表上,然后再做时序切分。

2.2 缺失值删除与目标编码

程序会将特征与目标拼接后按行删除缺失值,设清洗后的样本数为 \(N'\)。分类任务中,再使用 LabelEncoder 把标签映射为

$$ \phi:\mathcal{Y}\to\{0,1,\ldots,C-1\} \tag{3} $$

其中 \(C\) 是类别数。回归任务则要求目标可转换为浮点数。

2.3 滑动窗口

设窗口长度为 \(W=\text{window\_size}\),预测步长为 \(H=\text{horizon}\)。对位置 \(i\),程序构造输入序列

$$ \mathbf{X}_i= \begin{bmatrix} \tilde{x}_{i}\\ \tilde{x}_{i+1}\\ \vdots\\ \tilde{x}_{i+W-1} \end{bmatrix} \in\mathbb{R}^{W\times d'} \tag{4} $$

标签取为未来第 \(H\) 步单点:

$$ z_i=y_{i+W+H-1} \tag{5} $$

可生成的序列样本数为

$$ M=N'-W-H+1 \tag{6} $$

因此当前模块仍然是 sequence-to-one 结构,horizon 只负责决定“预测未来第几步那个单点”。

2.4 按时间顺序切分训练、验证和测试集

TCNTFT 里常见的随机切分不同,这个模块采用按时间顺序切分。设测试比例为 \(r_{\mathrm{te}}\),则先划分

$$ M_{\mathrm{train\_full}}=\left\lfloor M(1-r_{\mathrm{te}})\right\rfloor,\qquad M_{\mathrm{test}}=M-M_{\mathrm{train\_full}} \tag{7} $$

前 \(M_{\mathrm{train\_full}}\) 个序列作为训练候选集,最后 \(M_{\mathrm{test}}\) 个序列作为测试集。

若验证比例为 \(r_{\mathrm{val}}>0\),则再从训练候选集中按时间顺序划分:

$$ M_{\mathrm{train}}=\left\lfloor M_{\mathrm{train\_full}}(1-r_{\mathrm{val}})\right\rfloor,\qquad M_{\mathrm{val}}=M_{\mathrm{train\_full}}-M_{\mathrm{train}} \tag{8} $$

因此验证集是训练段的尾部,而不是随机抽样。

2.5 缩放策略

如果 scale_method="standard"minmax,程序会先在训练集窗口上拟合特征缩放器,再应用到训练/验证/测试集。以标准化为例:

$$ x_{t,j}^{\ast}=\frac{x_{t,j}-\mu_j^{(\mathrm{train})}}{\sigma_j^{(\mathrm{train})}} \tag{9} $$

这里的 \(\mu_j^{(\mathrm{train})},\sigma_j^{(\mathrm{train})}\) 由训练集展开后的所有时间步共同估计,因此当前版本已经避免了“全量样本先缩放再切分”的数据泄漏问题。

回归任务若勾选 scale_target=True,目标变量还会使用训练集拟合的 StandardScaler

$$ y_t^{\ast}=\frac{y_t-\mu_y^{(\mathrm{train})}}{\sigma_y^{(\mathrm{train})}} \tag{10} $$

需要注意:目标缩放始终使用标准化,即使特征缩放选择的是 minmax

3. Transformer 编码器结构

3.1 输入投影

每个时间步的特征先通过线性层投影到模型维度 \(d=\text{d\_model}\):

$$ e_{i,\tau}=W_e x_{i,\tau}^{\ast}+b_e,\qquad e_{i,\tau}\in\mathbb{R}^{d} \tag{11} $$

模型要求

$$ d \bmod h = 0 \tag{12} $$

其中 \(h=\text{num\_heads}\) 是注意力头数。

3.2 位置编码

positional_encoding="sinusoidal",则加入固定位置编码:

$$ \mathrm{PE}(p,2k)=\sin\!\left(p/10000^{2k/d}\right) \tag{13} $$

$$ \mathrm{PE}(p,2k+1)=\cos\!\left(p/10000^{2k/d}\right) \tag{14} $$

若选择 learned,则程序使用 Embedding(input_dim=seq_len, output_dim=d_model) 学习位置向量。

3.3 多层编码器块

对每一层编码器,先执行自注意力:

$$ A^{(\ell)}=\mathrm{MHA}\!\left(H^{(\ell-1)},H^{(\ell-1)},H^{(\ell-1)}\right) \tag{15} $$

再做 dropout、残差连接和层归一化:

$$ \tilde{H}^{(\ell)}=\mathrm{LayerNorm}\!\left(H^{(\ell-1)}+\mathrm{Dropout}(A^{(\ell)})\right) \tag{16} $$

随后经过前馈网络:

$$ F^{(\ell)}=W_2^{(\ell)}\,\mathrm{Dropout}\!\left(\mathrm{ReLU}(W_1^{(\ell)}\tilde{H}^{(\ell)}+b_1^{(\ell)})\right)+b_2^{(\ell)} \tag{17} $$

再做一次残差归一化:

$$ H^{(\ell)}=\mathrm{LayerNorm}\!\left(\tilde{H}^{(\ell)}+F^{(\ell)}\right) \tag{18} $$

这就是比较标准的 Transformer Encoder 块结构。

3.4 序列表征与输出

全部编码层结束后,程序使用 GlobalAveragePooling1D 对时间维做全局平均:

$$ g_i=\frac{1}{W}\sum_{\tau=1}^{W}H^{(L)}_{i,\tau} \tag{19} $$

再经过 dropout 和输出层:

$$ \hat{y}_i=W_o\,\mathrm{Dropout}(g_i)+b_o \tag{20} $$

分类任务中:

$$ \hat{p}_i= \begin{cases} \sigma(\hat{y}_i), & C\le 2\\ \mathrm{softmax}(\hat{y}_i), & C>2 \end{cases} \tag{21} $$

这说明当前模型是编码器 + 全局池化 + 分类/回归头的结构,而不是带解码器的序列到序列 Transformer。

4. 训练机制与评价指标

4.1 损失函数

回归任务使用均方误差:

$$ \mathcal{L}_{\mathrm{reg}}=\frac{1}{M_{\mathrm{train}}}\sum_i(z_i-\hat{y}_i)^2 \tag{22} $$

二分类任务使用 binary_crossentropy,多分类使用 sparse_categorical_crossentropy

4.2 早停与学习率调度

early_stopping=True,程序会:

  • 有验证集时监控 val_loss
  • 没有验证集时监控训练 loss

若开启学习率分段衰减,则第 epoch 轮的学习率为

$$ \eta_{\mathrm{epoch}}=\eta_0\cdot \gamma^{\left\lfloor \mathrm{epoch}/T \right\rfloor} \tag{23} $$

其中 \(\eta_0\) 是初始学习率,\(\gamma=\text{lr\_drop\_factor}\),\(T=\text{lr\_drop\_period}\)。

4.3 回归指标

回归任务对训练集、验证集和测试集都会分别计算 rmsemaer2

$$ \mathrm{RMSE}=\sqrt{\frac{1}{n}\sum_i(y_i-\hat{y}_i)^2} \tag{24} $$

$$ \mathrm{MAE}=\frac{1}{n}\sum_i|y_i-\hat{y}_i| \tag{25} $$

$$ R^2=1-\frac{\sum_i(y_i-\hat{y}_i)^2}{\sum_i(y_i-\bar{y})^2} \tag{26} $$

如果回归目标做过缩放,评估前会先把预测值和真实值逆变换回原始量纲。

4.4 分类指标

分类任务输出 accuracyf1_macrof1_weighted。准确率定义为

$$ \mathrm{Accuracy}=\frac{1}{n}\sum_i\mathbf{1}(\hat{y}_i=y_i) \tag{27} $$

同时程序还会生成混淆矩阵。

5. 输出结果与复现

5.1 输出结果说明

save_to_excel() 会导出以下工作表:

  • 原始数据
  • 处理后数据
  • 模型指标
  • 训练历史
  • 预测结果
  • 训练集预测
  • 验证集预测
  • 混淆矩阵
  • 类别映射(仅分类任务)
  • 参数
  • Charts

其中:

  • 处理后数据 是按行编码/缩放后的二维表,不是三维滑动窗口张量;
  • 模型指标 同时包含 train / validation / test 三个数据集的指标;
  • 预测结果 对应测试集;
  • 训练集预测验证集预测 会额外导出,便于对比过拟合;
  • Charts 保存的是图像文件路径。

5.2 图表输出

回归任务通常会导出:

  • loss_curve.png
  • pred_vs_true.png
  • pred_comparison.png
  • residual_hist.png
  • rmse_comparison.png

分类任务则主要导出:

  • loss_curve.png
  • confusion_matrix.png

5.3 自动生成 repro 脚本

结果页会自动生成 repro_*.py。该脚本会:

  1. 尝试把原始输入文件复制到结果目录下的 repro_inputs/
  2. 若没有源文件路径,则把 raw_data 另存为 CSV;
  3. 重新读取数据并重新调用 TransformerTSCalculator.run_analysis()
  4. 再导出一份 *_repro.xlsx

所以它复现的是“同一份源码 + 同一组参数重新训练”,而不是直接加载保存好的模型权重。

6. 实现说明与注意事项

结合 core/transformer_ts_calculator.pyui/upload_widget.pyui/results_widget.py 和实际导出的结果文件,可以把该模块总结为:

  • 它是一个较规范的 encoder-only Transformer 时序模型;
  • 采用时间顺序切分训练、验证和测试集;
  • 特征与目标缩放都在训练集上拟合,再应用到验证/测试,已经避免了主要数据泄漏;
  • 位置编码支持 sinusoidallearned 两种方式;
  • 输出层是“全局平均池化 + 单头分类/回归”,不是 seq2seq 解码器;
  • 导出层较完整,能够提供训练、验证、测试三段预测结果与多类图表。

因此,在论文说明中,可以把它表述为:一个基于 Transformer Encoder 的时序预测/分类实现,采用滑动窗口建模和全局池化读出,工程实现相对规范,但仍属于 sequence-to-one 预测框架,而非完整的序列到序列 Transformer。

7. 论文写作模板

7.1 方法描述模板

可在论文“方法部分”中写为:

“本文采用基于 Transformer 编码器的时序建模方法对序列样本进行预测或分类。首先,将按时间顺序排列的数据构造成固定长度的滑动窗口监督样本,并对输入特征进行必要的编码和缩放;其次,利用多头自注意力与前馈网络提取序列中的全局依赖关系,并以编码后的序列表示完成目标变量预测;随后,根据任务类型选择相应的损失函数与评价指标进行训练和评估;最后,输出预测结果、指标表和图表,用于分析模型的时序建模性能。”

7.2 结果解释模板

结果部分可写为:Transformer 编码器擅长建模序列中的全局依赖关系,若预测结果在长序列区间仍保持稳定,则说明自注意力机制对当前任务具有较好适配性。若与循环模型相比提升有限,则应讨论样本规模和窗口长度对注意力模型效果的限制。

7.3 表格标题模板

表题可写为:Transformer 时序模型预测结果与性能指标汇总表。

7.4 图表题注模板

图注可写为:Transformer 时序模型真实值与预测值对比曲线。

7.5 表格示例

建议列名:时间点、真实值、预测值、残差、RMSE、MAE、\(R^2\) 或分类评价指标。

8. 论文写作建议

论文中建议把该模块写成“Transformer Encoder 的 sequence-to-one 时序模型”。结果部分可展示训练/验证/测试三段指标、预测对比图以及关键超参数表。由于输出层使用的是全局平均池化读出,正文中不宜把它写成完整 seq2seq Transformer 预测器。

9. 单篇终审补充

9.1 图题与表题对齐建议

  • 原始数据 表可写为:表X Transformer 时序原始数据表。
  • 处理后数据 表可写为:表X Transformer 时序处理后数据表。
  • 模型指标 表可写为:表X Transformer 时序训练、验证与测试指标汇总。
  • 训练历史 表可写为:表X Transformer 时序训练过程记录。
  • 预测结果 表可写为:表X Transformer 时序测试集预测结果。
  • 训练集预测 表可写为:表X Transformer 时序训练集预测结果。
  • 验证集预测 表可写为:表X Transformer 时序验证集预测结果。
  • 混淆矩阵 表可写为:表X Transformer 时序混淆矩阵或占位结果表。
  • 参数 表可写为:表X Transformer 时序参数设置与模型配置。
  • Charts 表可写为:表X Transformer 时序图表索引与路径清单。
  • loss_curve.png 建议写为:图X Transformer 时序训练损失曲线。
  • pred_vs_true.png 建议写为:图X Transformer 时序真实值与预测值对比图。
  • pred_comparison.png 建议写为:图X Transformer 时序训练/验证/测试预测对比图。
  • residual_hist.png 建议写为:图X Transformer 时序残差分布图。
  • rmse_comparison.png 建议写为:图X Transformer 时序 RMSE 对比图。

9.2 终审说明

  • 当前代表性结果目录中的真实主工作簿为 transformer_ts_results_20260329_023402.xlsx,复现输出为 TransformerTS-Transformer_时序_results_20260329_023402_repro.xlsx。论文附录中若列文件名,应分清主运行结果与 repro 结果。
  • 当前代表性回归结果目录并未出现 类别映射 表,因此该表不是固定导出项,而是仅分类任务下才出现的条件性工作表。正文不可把它写成该算法的必有结果。
  • 当前实体图文件集中在 *_plots/ 目录下,代表性图包括 loss_curve.pngpred_vs_true.pngpred_comparison.pngresidual_hist.pngrmse_comparison.png。终稿配图应与这组真实文件名一致,不要替换成通用 Transformer 模板名。
  • 真实 repro 脚本为 repro_TransformerTS-Transformer_时序_20260329_023402.py,并通过 INPUT_FILE = 'repro_inputs/sample_data.csv' 读取输入副本。附录复现实验说明应保留这一相对路径口径。
  • 当前实现是 encoder-only、sequence-to-one 的 Transformer 时序模型。正文不应把 训练集预测/验证集预测/预测结果 三张表误写成 seq2seq 解码器逐步输出过程。

9.3 全量强化补充

本篇终审补充绑定的真实算法目录为 具体的算法3/深度学习与时序网络/TransformerTS-Transformer 时序,本次采用的代表性结果目录为 具体的算法3/深度学习与时序网络/TransformerTS-Transformer 时序/results/TransformerTS-Transformer时序分析结果_20260329_023402

当前目录中真实存在两份工作簿:

  • transformer_ts_results_20260329_023402.xlsx
  • TransformerTS-Transformer_时序_results_20260329_023402_repro.xlsx

两者实测工作表一致,均包含:

  • 原始数据
  • 处理后数据
  • 模型指标
  • 训练历史
  • 预测结果
  • 训练集预测
  • 验证集预测
  • 混淆矩阵
  • 参数
  • Charts

因此这篇应把 transformer_ts_results_20260329_023402.xlsx 视为主结果,把 ..._repro.xlsx 视为 repro 再生产物。当前代表性目录是回归口径结果,但仍保留 混淆矩阵 兼容表,不应误读为分类主实验。

当前目录中的真实图文件为:

  • transformer_ts_results_20260329_023402_plots/loss_curve.png
  • transformer_ts_results_20260329_023402_plots/pred_vs_true.png
  • transformer_ts_results_20260329_023402_plots/pred_comparison.png
  • transformer_ts_results_20260329_023402_plots/residual_hist.png
  • transformer_ts_results_20260329_023402_plots/rmse_comparison.png
  • TransformerTS-Transformer_时序_results_20260329_023402_repro_plots/loss_curve.png
  • TransformerTS-Transformer_时序_results_20260329_023402_repro_plots/pred_vs_true.png
  • TransformerTS-Transformer_时序_results_20260329_023402_repro_plots/pred_comparison.png
  • TransformerTS-Transformer_时序_results_20260329_023402_repro_plots/residual_hist.png
  • TransformerTS-Transformer_时序_results_20260329_023402_repro_plots/rmse_comparison.png

这说明当前磁盘同时保留了主结果图和 repro 图,两套图型一致。

复现实物方面,该目录实际包含:

  • 具体的算法3/深度学习与时序网络/TransformerTS-Transformer 时序/results/TransformerTS-Transformer时序分析结果_20260329_023402/repro_TransformerTS-Transformer_时序_20260329_023402.py
  • 具体的算法3/深度学习与时序网络/TransformerTS-Transformer 时序/results/TransformerTS-Transformer时序分析结果_20260329_023402/repro_inputs/sample_data.csv

脚本中明确写成 INPUT_FILE = 'repro_inputs/sample_data.csv'OUTPUT_FILE = 'TransformerTS-Transformer_时序_results_20260329_023402_repro.xlsx'。因此这一篇当前已具备目录内相对输入副本复现口径。

10. 软件实现核查补充(2026-07)

  • 当前主结果目录应写作 具体的算法3/深度学习与时序网络/TransformerTS-Transformer 时序/results/TransformerTS-Transformer时序分析结果_20260329_023402
  • 正文应围绕 RawDataProcessedTestPredsForecastMetricsParamsParametersTrainingLogCharts 来写。
  • 图证应对应 loss_curve.pngpred_vs_true.pngpred_comparison.pngresidual_hist.pngrmse_comparison.png,并把主结果和 repro 再生产物区分开。
  • 复现脚本应按 repro_TransformerTS-Transformer_时序_20260329_023402.py + repro_inputs/sample_data.csv 的口径说明。