使用 Transformer 模型进行长周期预测
关于如何训练和预测 Transformer 模型的教程。
Transformer 模型最初应用于自然语言处理领域,现已在时间序列预测领域得到越来越多的采用。这些模型的变革性力量在于其新颖的架构,该架构高度依赖于自注意力机制,这有助于模型专注于输入序列的不同部分进行预测,同时捕获数据中的长期依赖关系。在时间序列预测的背景下,Transformer 模型利用这种自注意力机制来识别时间序列中不同时期之间的相关信息,使其在预测复杂和噪声序列的未来值方面异常有效。
长周期预测涉及预测大量时间戳。由于预测的波动性和计算复杂性,这是一项具有挑战性的任务。为了解决这个问题,最近的研究提出了各种基于 Transformer 的模型。
Neuralforecast 库包含了以下流行的最新模型的实现:Informer
(Zhou, H. et al. 2021)、Autoformer
(Wu et al. 2021)、FEDformer
(Zhou, T. et al. 2022) 和 PatchTST
(Nie et al. 2023)。
我们对所有这些模型的实现都是单变量的,这意味着只使用每个特征的自回归值进行预测。我们观察到,这些单变量模型比它们的多变量对应模型更准确、更快。
在本 Notebook 中,我们将展示如何: * 加载学术文献中使用的 ETTm2 基准数据集。 * 训练模型 * 预测测试集
在本 Notebook 中取得的结果优于各自原始论文中自我报告的原始结果,且计算成本仅为一小部分。此外,所有模型都使用默认推荐参数进行训练,使用我们的自动
模型进行自动超参数选择可以进一步改进结果。
您可以使用 Google Colab 的 GPU 运行这些实验。
1. 安装库
2. 加载 ETTm2 数据
LongHorizon
类将自动下载完整的 ETTm2 数据集并进行处理。
它返回三个 Dataframes:Y_df
包含目标变量的值,X_df
包含外部日历特征,S_df
包含每个时间序列的静态特征(ETTm2 没有)。对于本例,我们将只使用 Y_df
。
如果您想使用自己的数据,只需替换 Y_df
。请确保使用长格式并与我们的数据集结构相似。
unique_id | ds | y | |
---|---|---|---|
0 | HUFL | 2016-07-01 00:00:00 | -0.041413 |
1 | HUFL | 2016-07-01 00:15:00 | -0.185467 |
57600 | HULL | 2016-07-01 00:00:00 | 0.040104 |
57601 | HULL | 2016-07-01 00:15:00 | -0.214450 |
115200 | LUFL | 2016-07-01 00:00:00 | 0.695804 |
115201 | LUFL | 2016-07-01 00:15:00 | 0.434685 |
172800 | LULL | 2016-07-01 00:00:00 | 0.434430 |
172801 | LULL | 2016-07-01 00:15:00 | 0.428168 |
230400 | MUFL | 2016-07-01 00:00:00 | -0.599211 |
230401 | MUFL | 2016-07-01 00:15:00 | -0.658068 |
288000 | MULL | 2016-07-01 00:00:00 | -0.393536 |
288001 | MULL | 2016-07-01 00:15:00 | -0.659338 |
345600 | OT | 2016-07-01 00:00:00 | 1.018032 |
345601 | OT | 2016-07-01 00:15:00 | 0.980124 |
3. 训练模型
我们将使用 cross_validation
方法训练模型,该方法允许用户自动模拟多个历史预测(在测试集中)。
cross_validation
方法将使用验证集进行超参数选择和早期停止,然后生成测试集的预测结果。
首先,实例化 models
列表中的每个模型,指定 horizon
、input_size
和训练迭代次数。
(注意:由于训练时间过长,FEDformer
模型被排除。)
提示
查看我们的
自动
模型以进行自动超参数优化。
使用以下必需参数实例化一个 NeuralForecast
对象
-
models
:模型列表。 -
freq
:一个字符串,表示数据的频率。(参见 panda 可用的频率。)
其次,使用 cross_validation
方法,指定数据集 (Y_df
)、验证集大小和测试集大小。
cross_validation
方法将返回测试集上每个模型的预测结果。
unique_id | ds | 截止点 | Informer | Autoformer | PatchTST | y | |
---|---|---|---|---|---|---|---|
0 | HUFL | 2017-10-24 00:00:00 | 2017-10-23 23:45:00 | -1.055062 | -0.861487 | -0.860189 | -0.977673 |
1 | HUFL | 2017-10-24 00:15:00 | 2017-10-23 23:45:00 | -1.021247 | -0.873399 | -0.865730 | -0.865620 |
2 | HUFL | 2017-10-24 00:30:00 | 2017-10-23 23:45:00 | -1.057297 | -0.900345 | -0.944296 | -0.961624 |
3 | HUFL | 2017-10-24 00:45:00 | 2017-10-23 23:45:00 | -0.886652 | -0.867466 | -0.974849 | -1.049700 |
4 | HUFL | 2017-10-24 01:00:00 | 2017-10-23 23:45:00 | -1.000431 | -0.887454 | -1.008530 | -0.953600 |
4. 评估结果
接下来,我们绘制测试集上所有模型的 OT
变量的预测结果。
最后,我们使用平均绝对误差 (MAE) 计算测试误差
作为参考,我们可以将其性能与各自论文中自我报告的性能进行比较。
预测期 | PatchTST | AutoFormer | Informer | ARIMA |
---|---|---|---|---|
96 | 0.256 | 0.339 | 0.453 | 0.301 |
192 | 0.296 | 0.340 | 0.563 | 0.345 |
336 | 0.329 | 0.372 | 0.887 | 0.386 |
720 | 0.385 | 0.419 | 1.388 | 0.445 |
后续步骤
我们提出了一种用于长周期预测的替代模型 NHITS
,该模型基于 (Challu et al. 2023) 中的前馈网络。它实现了与 PatchTST
不相上下的性能,而计算成本仅为一小部分。NHITS
教程可在此处获取 here。