前言
最近我复现了时间序列预测领域的一篇经典论文:
Are Transformers Effective for Time Series Forecasting?
AAAI 2023
对应代码仓库:LTSF-Linear
DLinear 这篇论文提出了一个很有意思的问题:
在长序列时间序列预测任务中,复杂的 Transformer 模型真的一定比简单线性模型好吗?
论文的结论是:在很多长序列预测 benchmark 上,简单的线性模型反而可以取得非常有竞争力的结果,甚至超过一些 Transformer-based 方法。
这篇博客主要记录我本次复现实验的过程、结果和阶段性分析。相比单纯“跑通代码”,我更希望把这次复现整理成一个比较规范的实验过程,包括:
- 跑哪些模型;
- 跑哪些数据集;
- 如何整理 MSE/MAE;
- 如何比较 Linear 和 DLinear;
- 如何分析多次运行稳定性;
- 如何结合可视化结果进行解释;
- 当前复现还缺什么。
论文和模型简介
LTSF-Linear 论文主要讨论的是 Long-term Time Series Forecasting,也就是长序列时间序列预测任务。
论文中提出了三个非常简单的线性模型:
| 模型 | 核心思想 |
|---|---|
| Linear | 直接用一个线性层从历史序列预测未来序列 |
| NLinear | 在 Linear 基础上加入简单归一化,用于缓解分布偏移 |
| DLinear | 先将序列分解为 trend 和 seasonal,再分别用线性层预测 |
其中,DLinear 是本文最核心的模型之一。
DLinear 的基本思想是:
原始序列 = 趋势项 trend + 季节/残差项 seasonal
然后模型分别对趋势项和季节项进行线性预测,最后将两部分结果相加得到最终预测。
这看起来很简单,但它在很多长预测任务上表现不错。
实验环境与结果来源
本次实验主要在 WSL 环境中运行,然后将结果同步到 Windows 上整理。
实验结果主要来自以下文件:
logs/LongForecasting/*.log
result.txt
test_results/
其中:
| 文件或目录 | 作用 |
|---|---|
logs/LongForecasting/*.log |
保存每次实验的训练过程和最终 MSE/MAE |
result.txt |
保存每次测试的汇总指标,但存在重复记录 |
test_results/ |
保存预测曲线 PDF,可用于可视化分析 |
results/ |
保存 .npy 预测数组,本阶段主要作为备份 |
由于 result.txt 中可能出现重复记录,所以最终分析时我主要以:
logs/LongForecasting/*.log
为准。
当前完成的实验
本阶段主要完成了以下实验。
ETTh1 数据集
在 ETTh1 数据集上,我完成了:
| Dataset | Model | Seq Len | Pred Len |
|---|---|---|---|
| ETTh1 | Linear | 336 | 96 / 192 / 336 / 720 |
| ETTh1 | DLinear | 336 | 96 / 192 / 336 / 720 |
| ETTh1 | DLinear | 336 | 96 / 192 / 336 / 720,多次运行 |
也就是说,ETTh1 上已经可以比较:
Linear vs DLinear
同时,DLinear 也有多次运行结果,可以做初步稳定性分析。
ETTm1 数据集
在 ETTm1 数据集上,我完成了:
| Dataset | Model | Seq Len | Pred Len |
|---|---|---|---|
| ETTm1 | DLinear | 336 | 96 / 192 / 336 / 720 |
这个实验主要用于观察 DLinear 在另一个 ETT 数据集上的预测长度变化趋势。
ETTh1:Linear 与 DLinear 对比
首先看 ETTh1 上 Linear 和 DLinear 的 MSE 对比。
这里 DLinear 使用多次运行的平均结果。
| Pred Len | Linear MSE | DLinear Mean MSE | 结论 |
|---|---|---|---|
| 96 | 0.3747 | 0.3767 | 基本接近,Linear 略优 |
| 192 | 0.4183 | 0.4201 | 基本接近,Linear 略优 |
| 336 | 0.4792 | 0.4583 | DLinear 更优 |
| 720 | 0.6250 | 0.5087 | DLinear 明显更优 |
再看 MAE:
| Pred Len | Linear MAE | DLinear Mean MAE | 结论 |
|---|---|---|---|
| 96 | 0.3967 | 0.3982 | 基本接近 |
| 192 | 0.4288 | 0.4288 | 基本持平 |
| 336 | 0.4767 | 0.4593 | DLinear 更优 |
| 720 | 0.5930 | 0.5159 | DLinear 明显更优 |
从结果可以看出:
- 在短预测长度
96和192下,Linear 和 DLinear 的表现非常接近; - 在更长预测长度
336和720下,DLinear 开始明显优于 Linear; - 尤其是
pred_len=720时,DLinear 相比 Linear 的 MSE 下降约 18.60%。
这个结果说明:
DLinear 的趋势/季节分解机制在长预测任务中更有优势。
这也符合论文中的直觉:当预测长度变长时,显式建模趋势和周期结构会更重要。
ETTh1:DLinear 多次运行稳定性分析
为了避免只看单次实验结果,我对 ETTh1 上的 DLinear 结果进行了多次运行整理。
当前有三组结果:
default/rerun
seed2025
seed2026
其中 default/rerun 是一次未单独标注 seed 的重跑记录,seed2025 和 seed2026 是两次带 seed 标记的实验。
MSE 结果
| Pred Len | Default/Rerun MSE | Seed2025 MSE | Seed2026 MSE | Mean MSE | Std |
|---|---|---|---|---|---|
| 96 | 0.3841 | 0.3720 | 0.3740 | 0.3767 | 0.0065 |
| 192 | 0.4435 | 0.4070 | 0.4099 | 0.4201 | 0.0203 |
| 336 | 0.4469 | 0.4644 | 0.4636 | 0.4583 | 0.0099 |
| 720 | 0.5042 | 0.5393 | 0.4827 | 0.5087 | 0.0286 |
这里的 Std 是标准差,用于衡量多次运行结果的波动程度。
如何理解标准差
标准差越小,说明多次运行结果越接近,模型越稳定。
标准差越大,说明不同运行之间差异越大,模型对随机性或训练过程更敏感。
从上表可以看到:
pred_len=96的结果比较稳定;pred_len=336的结果也相对稳定;pred_len=720的波动较大;pred_len=192中 default/rerun 明显高于 seed2025/2026,说明也存在一定训练波动。
这说明:
长预测任务本身更困难,模型结果更容易受到随机初始化、训练过程和 early stopping 的影响。
如果后续要写得更严谨,应该继续补充更多随机种子,例如:
seed2027
seed2028
然后报告:
mean ± std
ETTm1:DLinear 预测长度趋势分析
接下来观察 ETTm1 上 DLinear 的结果。
| Pred Len | MSE | MAE |
|---|---|---|
| 96 | 0.3012 | 0.3446 |
| 192 | 0.3356 | 0.3661 |
| 336 | 0.3718 | 0.3887 |
| 720 | 0.4266 | 0.4227 |
这个结果非常符合长序列预测任务的一般规律:
预测长度越长,误差越大。
从 96 到 720:
- MSE 从 0.3012 增加到 0.4266;
- MAE 从 0.3446 增加到 0.4227。
这说明实验结果整体合理,没有出现明显异常。
可视化结果怎么看
除了 MSE 和 MAE,项目还会在 test_results/ 中保存预测曲线 PDF。
可视化图通常包含:
历史输入 + 真实未来曲线 + 模型预测曲线
看这些图时,我主要从以下几个角度分析。
预测曲线是否跟随真实曲线趋势
首先看预测曲线的大方向是否和真实曲线一致。
比如:
- 真实曲线整体上升,预测曲线是否也上升;
- 真实曲线整体下降,预测曲线是否也下降;
- 真实曲线有周期性波动,预测曲线是否也有类似波动。
如果趋势能跟上,说明模型捕捉到了主要变化规律。
如果趋势跟不上,说明模型可能只学到了平均水平,而没有学到时间变化结构。
长预测下是否出现过度平滑
长预测时,模型经常会出现一种现象:
预测曲线越来越平,波动越来越小。
也就是说:
- 真实曲线有明显峰谷;
- 但预测曲线像一条比较平滑的线;
- 模型预测不到尖峰、突变、快速下降或快速上升。
这说明模型对长期未来的不确定性处理不够好。
这个现象尤其应该在:
pred_len=720
中观察。
Linear 和 DLinear 在长预测下是否有差异
可以对比同一个数据集、同一个预测长度下的图。
例如:
ETTh1_336_720_Linear.../0.pdf
ETTh1_336_720_DLinear.../0.pdf
主要看:
- 哪个模型预测曲线更接近真实曲线;
- 哪个模型趋势更准;
- 哪个模型更能保留波动;
- 哪个模型在预测后半段偏移更严重。
如果 DLinear 图上更贴近真实曲线,同时 MSE/MAE 也更低,就可以说:
DLinear 不仅指标更好,可视化上也能更好地跟随长期趋势。
是否存在峰值预测失败的样本
峰值预测失败指的是:
真实曲线突然升高或降低,但预测曲线没有跟上。
常见表现包括:
- 真实值有尖峰,预测没有;
- 真实值有突然下降,预测还很平;
- 预测曲线滞后于真实曲线;
- 模型只预测出平均趋势,忽略极端变化。
这类图很适合放进汇报,因为它能说明:
模型虽然整体 MSE/MAE 不错,但对突发变化仍然不足。
这就是失败案例分析。
当前结果说明了什么
综合数值结果和可视化分析,本阶段可以得到几个结论。
简单 Linear 已经是很强的 baseline
ETTh1 上,在 pred_len=96 和 192 时,Linear 和 DLinear 的结果非常接近,甚至 Linear 略优。
这说明:
在一些短预测任务中,简单线性映射已经能捕捉主要模式。
这也是 LTSF-Linear 论文想强调的核心观点之一:不要盲目认为复杂模型一定更好。
DLinear 在长预测上更有优势
当预测长度增加到 336 和 720 时,DLinear 明显优于 Linear。
尤其在 pred_len=720 上:
Linear MSE = 0.6250
DLinear Mean MSE = 0.5087
DLinear 的优势很明显。
这说明:
趋势/季节分解结构更适合长预测任务。
长预测任务稳定性更差
DLinear 在 pred_len=720 上的多次运行结果波动较大:
0.5042 / 0.5393 / 0.4827
这说明:
长预测任务不仅误差更大,而且结果稳定性也更差。
因此后续如果要做更规范的科研实验,需要更多 seed。
ETTm1 结果趋势合理
ETTm1 上 DLinear 的误差随预测长度增加而单调上升:
96 < 192 < 336 < 720
这符合长序列预测任务的基本规律,说明实验结果整体可信。
当前复现还缺什么
虽然目前已经完成了阶段性复现,但还不能说完整复现论文。
当前还缺:
NLinear 实验
LTSF-Linear 包含 Linear、NLinear、DLinear 三个模型,目前还缺 NLinear。Transformer baseline
论文核心问题是“Transformer 是否适合长序列预测”,所以后续需要补 Transformer 或 Autoformer。更多数据集
当前主要有 ETTh1 和 ETTm1,后续可以补 Weather、Exchange 等。更多随机种子
尤其是 DLinear 在pred_len=720上波动较大,需要更多 seed 验证稳定性。更系统的可视化分析
后续可以从 PDF 中挑选成功案例和失败案例,形成更完整的图表分析。
下一步计划
如果继续推进,我认为优先级应该是:
1. 补 ETTh1 + NLinear + pred_len=96/192/336/720
2. 补 ETTh1 + DLinear + pred_len=720 + 更多 seed
3. 补 Transformer 或 Autoformer baseline
4. 整理典型可视化图
5. 扩展到 Weather / Exchange 数据集
这样可以从“代码复现”进一步升级为“系统实验复现”。
总结
本次复现实验完成了 LTSF-Linear 的阶段性实验整理,主要包括:
- ETTh1 上 Linear 和 DLinear 的对比;
- ETTh1 上 DLinear 的多次运行稳定性分析;
- ETTm1 上 DLinear 的预测长度趋势分析;
- 基于
test_results的可视化分析思路。
目前最重要的结论是:
在短预测长度下,Linear 和 DLinear 表现接近;但随着预测长度变长,DLinear 的优势逐渐明显,尤其在
pred_len=720上明显优于 Linear。这说明 DLinear 的趋势/季节分解结构对长预测任务有帮助。
同时也观察到:
长预测任务下模型结果波动更大,因此后续需要更多随机种子和更多 baseline 来增强实验可信度。
这次复现让我认识到,科研中的“复现”不只是把代码跑通,更重要的是把结果整理成表格、做对比、分析趋势、解释可视化现象,并明确下一步还缺什么。