使用 NHITS 进行长周期预测
长周期预测具有挑战性,因为预测结果具有波动性且计算复杂度高。为了解决这个问题,我们创建了 NHITS 模型,并在 NeuralForecast 库中提供了代码。NHITS
通过分层插值和多速率输入处理,使其部分输出专注于时间序列的不同频率。
在本 notebook 中,我们将展示如何在 ETTm2 基准数据集上使用 NHITS
。该数据集包含 2 个变电站的 2 个变压器的数据点,包括负载、油温等信息。
我们将向您展示如何加载数据、训练模型并执行自动超参数调优,以实现 SoTA 性能,其计算成本仅为最新 Transformer 架构的一小部分(快 50 倍),但性能甚至超越它们。
您可以使用 Google Colab 在 GPU 上运行这些实验。
1. 安装 NeuralForecast
2. 加载 ETTm2 数据
LongHorizon
类会自动下载完整的 ETTm2 数据集并进行处理。
它返回三个 Dataframe: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. 超参数选择和预测
AutoNHITS
类将使用 Tune 库自动执行超参数调优,探索用户定义或默认的搜索空间。模型根据在验证集上的误差进行选择,然后存储最佳模型并在推理过程中使用。
AutoNHITS.default_config
属性包含一个建议的超参数空间。这里,我们按照论文中的超参数指定了一个不同的搜索空间。请注意,*1000 次随机梯度步*就足以实现 SoTA 性能。您可以随意尝试调整这个空间。
提示
有关不同空间选项(例如列表和连续区间)的更多信息,请参阅 https://docs.rayai.org.cn/en/latest/tune/index.html。
要实例化 AutoNHITS
,您需要定义:
h
: 预测范围 (forecasting horizon)loss
: 训练损失。使用DistributionLoss
来生成概率预测。config
: 超参数搜索空间。如果为None
,AutoNHITS
类将使用预定义的建议超参数空间。num_samples
: 探索的配置数量。
通过实例化一个 NeuralForecast
对象并使用以下必需参数来拟合模型:
-
models
: 模型列表。 -
freq
: 表示数据频率的字符串。(参见 panda's 可用频率。)
cross_validation
方法允许您模拟多个历史预测,通过用 fit
和 predict
方法替换 for 循环,极大地简化了流程。
对于时间序列数据,交叉验证是通过在历史数据上定义一个滑动窗口并预测其后的时期来完成的。这种形式的交叉验证使我们能够在更广泛的时间实例范围内更好地估计模型的预测能力,同时保持训练集中的数据连续,这是我们的模型所要求的。
cross_validation
方法将使用验证集进行超参数选择,然后为测试集生成预测。
4. 评估结果
AutoNHITS
类包含一个 results
tune 属性,用于存储每个探索的配置信息。它包含验证损失和最佳验证超参数。
最后,我们计算两个关注指标的测试误差:
and
作为参考,我们可以对照 NHITS 论文中先前的“最先进”基于 Transformer 的长周期预测方法来检查性能。要重现或改进论文结果,请尝试在超参数调优中设置 hyperopt_max_evals=30
。
平均绝对误差 (MAE)
预测范围 | NHITS | AutoFormer | InFormer | ARIMA |
---|---|---|---|---|
96 | 0.249 | 0.339 | 0.453 | 0.301 |
192 | 0.305 | 0.340 | 0.563 | 0.345 |
336 | 0.346 | 0.372 | 0.887 | 0.386 |
720 | 0.426 | 0.419 | 1.388 | 0.445 |
均方误差 (MSE)
预测范围 | NHITS | AutoFormer | InFormer | ARIMA |
---|---|---|---|---|
96 | 0.173 | 0.255 | 0.365 | 0.225 |
192 | 0.245 | 0.281 | 0.533 | 0.298 |
336 | 0.295 | 0.339 | 1.363 | 0.370 |
720 | 0.401 | 0.422 | 3.379 | 0.478 |