使用 TSMixer 进行多元时间序列预测
关于如何使用 TSMixer 模型进行多元时间序列预测的教程。
在 多元 时间序列预测中,我们使用所有时间序列的信息联合生成所有时间序列的预测。相比之下,在 单变量 时间序列预测中,我们只考虑每个单独时间序列的信息,并单独生成每个时间序列的预测。因此,多元时间序列预测方法使用更多信息来生成每个预测,从而应该能够提供更好的预测结果。然而,多元时间序列预测方法也随着时间序列数量的增加而扩展,这意味着这些方法通常不太适合大规模问题(即预测许多许多时间序列)。
在本 Notebook 中,我们将演示最先进的多元时间序列预测架构 TSMixer
/ TSMixerx
与单变量时间序列预测方法 (NHITS
) 和简单的基于 MLP 的多元方法 (MLPMultivariate
) 相比的性能。
我们将展示如何: * 加载学术文献中使用的 ETTm2 基准数据集。 * 训练 TSMixer
、TSMixerx
和 MLPMultivariate
模型 * 预测测试集 * 优化超参数
您可以使用 Google Colab 上的 GPU 运行这些实验。
1. 安装库
2. 加载 ETTm2 数据
LongHorizon
类将自动下载并处理完整的 ETTm2 数据集。
它返回三个 Dataframe:Y_df
包含目标变量的值,X_df
包含外部日历特征,S_df
包含每个时间序列的静态特征(ETTm2 没有)。在本示例中,我们将使用 Y_df
和 X_df
。
在 TSMixerx
中,我们可以利用 X_df
中包含的额外外部特征。在 TSMixer
中,*不*支持外部特征。因此,如果您想使用外部特征,应该使用 TSMixerx
。
如果您想使用自己的数据,只需替换 Y_df
和 X_df
。请确保使用长格式,并具有与我们的数据集相似的结构。
unique_id | ds | y | ex_1 | ex_2 | ex_3 | ex_4 | |
---|---|---|---|---|---|---|---|
0 | HUFL | 2016-07-01 00:00:00 | -0.041413 | -0.500000 | 0.166667 | -0.500000 | -0.001370 |
1 | HUFL | 2016-07-01 00:15:00 | -0.185467 | -0.500000 | 0.166667 | -0.500000 | -0.001370 |
2 | HUFL | 2016-07-01 00:30:00 | -0.257495 | -0.500000 | 0.166667 | -0.500000 | -0.001370 |
3 | HUFL | 2016-07-01 00:45:00 | -0.577510 | -0.500000 | 0.166667 | -0.500000 | -0.001370 |
4 | HUFL | 2016-07-01 01:00:00 | -0.385501 | -0.456522 | 0.166667 | -0.500000 | -0.001370 |
… | … | … | … | … | … | … | … |
403195 | OT | 2018-02-20 22:45:00 | -1.581325 | 0.456522 | -0.333333 | 0.133333 | -0.363014 |
403196 | OT | 2018-02-20 23:00:00 | -1.581325 | 0.500000 | -0.333333 | 0.133333 | -0.363014 |
403197 | OT | 2018-02-20 23:15:00 | -1.581325 | 0.500000 | -0.333333 | 0.133333 | -0.363014 |
403198 | OT | 2018-02-20 23:30:00 | -1.562328 | 0.500000 | -0.333333 | 0.133333 | -0.363014 |
403199 | OT | 2018-02-20 23:45:00 | -1.562328 | 0.500000 | -0.333333 | 0.133333 | -0.363014 |
3. 训练模型
我们将使用 cross_validation
方法训练模型,该方法允许用户自动模拟多个历史预测(在测试集中)。
cross_validation
方法将使用验证集进行超参数选择和早期停止,然后生成测试集的预测。
首先,实例化 models
列表中的每个模型,指定 horizon
、input_size
和训练迭代次数。在本 Notebook 中,我们将与单变量 NHITS
模型和多元 MLPMultivariate
模型进行比较。
提示
请查看我们的
auto
模型以进行自动超参数优化,并参阅本教程末尾的超参数调优示例。
使用以下必需参数实例化一个 NeuralForecast
对象
-
models
:模型列表。 -
freq
:一个字符串,表示数据的频率。(参见 panda 的可用频率列表。)
其次,使用 cross_validation
方法,指定数据集 (Y_df
)、验证集大小和测试集大小。
cross_validation
方法将返回测试集上每个模型的预测结果。
4. 评估结果
接下来,我们绘制测试集上所有模型的 OT
变量的预测结果。
最后,我们使用平均绝对误差 (MAE) 和均方误差 (MSE) 计算测试误差
和
指标 | TSMixer | TSMixerx | MLPMultivariate | NHITS | |
---|---|---|---|---|---|
0 | mae | 0.245435 | 0.249727 | 0.263579 | 0.251008 |
1 | mse | 0.162566 | 0.163098 | 0.176594 | 0.178864 |
作为参考,我们可以将性能与论文中自行报告的性能进行比较。我们发现 TSMixer
提供了比单变量方法 NHITS
更好的结果。此外,我们实现的 TSMixer
与原始论文的结果非常接近。最后,使用 X_df
Dataframe 中包含的额外外部变量似乎没有多大益处,因为 TSMixerx
的性能不如 TSMixer
,尤其是在较长的预测周期上。另请注意,与其它方法相比,MLPMultivariate
的性能明显较差,考虑到其相对简单性,这在一定程度上是可以预料的。
平均绝对误差 (MAE)
预测周期 | TSMixer (本 Notebook) | TSMixer (论文) | TSMixerx (本 Notebook) | NHITS (本 Notebook) | NHITS (论文) | MLPMultivariate (本 Notebook) |
---|---|---|---|---|---|---|
96 | 0.245 | 0.252 | 0.250 | 0.251 | 0.251 | 0.263 |
192 | 0.288 | 0.290 | 0.300 | 0.291 | 0.305 | 0.361 |
336 | 0.323 | 0.324 | 0.380 | 0.344 | 0.346 | 0.390 |
720 | 0.377 | 0.422 | 0.464 | 0.417 | 0.413 | 0.608 |
均方误差 (MSE)
预测周期 | TSMixer (本 Notebook) | TSMixer (论文) | TSMixerx (本 Notebook) | NHITS (本 Notebook) | NHITS (论文) | MLPMultivariate (本 Notebook) |
---|---|---|---|---|---|---|
96 | 0.163 | 0.163 | 0.163 | 0.179 | 0.179 | 0.177 |
192 | 0.220 | 0.216 | 0.231 | 0.239 | 0.245 | 0.330 |
336 | 0.272 | 0.268 | 0.361 | 0.311 | 0.295 | 0.376 |
720 | 0.356 | 0.420 | 0.493 | 0.451 | 0.401 | 3.421 |
请注意,对于上表,我们在所有预测周期中对所有方法使用相同的超参数,而原始论文会为每个预测周期调整超参数。
5. 调优超参数
AutoTSMixer
/ AutoTSMixerx
类将使用 Tune 库自动执行超参数调优,探索用户定义或默认的搜索空间。模型根据在验证集上的误差进行选择,然后存储最佳模型并在推理时使用。
AutoTSMixer.default_config
/ AutoTSMixerx.default_config
属性包含建议的超参数空间。在这里,我们根据论文的超参数指定了不同的搜索空间。您可以随意调整此空间。
在本示例中,我们将优化 horizon = 96
的超参数。
要实例化 AutoTSMixer
和 AutoTSMixerx
,您需要定义
h
:预测周期n_series
:多元时间序列问题中的时间序列数量。
此外,我们定义以下参数(如果未给出这些参数,AutoTSMixer
/AutoTSMixerx
类将使用预定义值):* loss
:训练损失。使用 DistributionLoss
生成概率预测。* config
:超参数搜索空间。如果为 None
,AutoTSMixer
类将使用预定义的建议超参数空间。* num_samples
:探索的配置数量。在本例中,我们仅使用有限的 10
个。* search_alg
:用于在超参数空间中选择参数值的搜索算法类型。* backend
:用于超参数优化搜索的后端,可以是 ray
或 optuna
。* valid_loss
:优化过程中用于验证集的损失。
现在,通过实例化一个具有以下必需参数的 NeuralForecast
对象来拟合模型
-
models
:模型列表。 -
freq
:一个字符串,表示数据的频率。(参见 panda 的可用频率列表。)
cross_validation
方法允许您模拟多个历史预测,通过用 fit
和 predict
方法替换 for 循环来大大简化管道。
对于时间序列数据,交叉验证是通过在历史数据上定义一个滑动窗口并预测其后面的时期来完成的。这种形式的交叉验证使我们能够在更广泛的时间范围内更好地估计模型的预测能力,同时保持训练集中的数据连续,这是我们的模型所必需的。
cross_validation
方法将使用验证集进行超参数选择,然后生成测试集的预测。
6. 评估结果
AutoTSMixer
/AutoTSMixerx
类包含一个 results
属性,用于存储探索的每个配置的信息。它包含验证损失和最佳验证超参数。我们在上一步中获得的 Y_hat_df
结果 Dataframe 是基于超参数搜索的最佳配置。对于 AutoTSMixer
,最佳配置是
对于 AutoTSMixerx
我们计算最佳配置在这两个感兴趣指标上的测试误差
和
指标 | AutoTSMixer | AutoTSMixerx | |
---|---|---|---|
0 | mae | 0.243749 | 0.251972 |
1 | mse | 0.162212 | 0.164347 |
我们可以将优化设置的错误指标与之前使用默认超参数的设置进行比较。在本例中,对于预测周期为 96,TSMixer
在 MAE
上取得了略微改进的结果。有趣的是,与默认设置相比,TSMixerx
没有得到改进。对于此数据集,在预测周期为 96 时,使用 TSMixerx
架构中的外部特征似乎价值有限。
指标 | TSMixer (优化) | TSMixer (默认) | TSMixer (论文) | TSMixerx (优化) | TSMixerx (默认) |
---|---|---|---|---|---|
MAE | 0.244 | 0.245 | 0.252 | 0.252 | 0.250 |
MSE | 0.162 | 0.163 | 0.163 | 0.164 | 0.163 |
请注意,我们仅评估了 10 种超参数配置(num_samples=10
),这可能表明通过探索更多超参数配置可以进一步提高预测性能。
参考文献
Chen, Si-An, Chun-Liang Li, Nate Yoder, Sercan O. Arik, and Tomas Pfister (2023). “TSMixer: 一种用于时间序列预测的全 MLP 架构。”
Cristian Challu, Kin G. Olivares, Boris N. Oreshkin, Federico Garza, Max Mergenthaler-Canseco, Artur Dubrawski (2021). NHITS: 用于时间序列预测的神经层级插值。被 AAAI 2023 接受。