TransformerTS-Transformer 时序
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 按时间顺序切分训练、验证和测试集
与 TCN、TFT 里常见的随机切分不同,这个模块采用按时间顺序切分。设测试比例为 \(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 回归指标
回归任务对训练集、验证集和测试集都会分别计算 rmse、mae 和 r2:
$$ \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 分类指标
分类任务输出 accuracy、f1_macro 和 f1_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.pngpred_vs_true.pngpred_comparison.pngresidual_hist.pngrmse_comparison.png
分类任务则主要导出:
loss_curve.pngconfusion_matrix.png
5.3 自动生成 repro 脚本
结果页会自动生成 repro_*.py。该脚本会:
- 尝试把原始输入文件复制到结果目录下的
repro_inputs/; - 若没有源文件路径,则把
raw_data另存为 CSV; - 重新读取数据并重新调用
TransformerTSCalculator.run_analysis(); - 再导出一份
*_repro.xlsx。
所以它复现的是“同一份源码 + 同一组参数重新训练”,而不是直接加载保存好的模型权重。
6. 实现说明与注意事项
结合 core/transformer_ts_calculator.py、ui/upload_widget.py、ui/results_widget.py 和实际导出的结果文件,可以把该模块总结为:
- 它是一个较规范的 encoder-only Transformer 时序模型;
- 采用时间顺序切分训练、验证和测试集;
- 特征与目标缩放都在训练集上拟合,再应用到验证/测试,已经避免了主要数据泄漏;
- 位置编码支持
sinusoidal与learned两种方式; - 输出层是“全局平均池化 + 单头分类/回归”,不是 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.png、pred_vs_true.png、pred_comparison.png、residual_hist.png、rmse_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.xlsxTransformerTS-Transformer_时序_results_20260329_023402_repro.xlsx
两者实测工作表一致,均包含:
原始数据处理后数据模型指标训练历史预测结果训练集预测验证集预测混淆矩阵参数Charts
因此这篇应把 transformer_ts_results_20260329_023402.xlsx 视为主结果,把 ..._repro.xlsx 视为 repro 再生产物。当前代表性目录是回归口径结果,但仍保留 混淆矩阵 兼容表,不应误读为分类主实验。
当前目录中的真实图文件为:
transformer_ts_results_20260329_023402_plots/loss_curve.pngtransformer_ts_results_20260329_023402_plots/pred_vs_true.pngtransformer_ts_results_20260329_023402_plots/pred_comparison.pngtransformer_ts_results_20260329_023402_plots/residual_hist.pngtransformer_ts_results_20260329_023402_plots/rmse_comparison.pngTransformerTS-Transformer_时序_results_20260329_023402_repro_plots/loss_curve.pngTransformerTS-Transformer_时序_results_20260329_023402_repro_plots/pred_vs_true.pngTransformerTS-Transformer_时序_results_20260329_023402_repro_plots/pred_comparison.pngTransformerTS-Transformer_时序_results_20260329_023402_repro_plots/residual_hist.pngTransformerTS-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。 - 正文应围绕
RawData、Processed、TestPreds、Forecast、Metrics、Params、Parameters、TrainingLog、Charts来写。 - 图证应对应
loss_curve.png、pred_vs_true.png、pred_comparison.png、residual_hist.png、rmse_comparison.png,并把主结果和 repro 再生产物区分开。 - 复现脚本应按
repro_TransformerTS-Transformer_时序_20260329_023402.py + repro_inputs/sample_data.csv的口径说明。