使用 THIEF 进行时间序列聚合
使用 THIEF 在 M3 月度和季度数据上进行时间序列层级预测
在本 Notebook 中,我们将演示如何使用 HierarchicalForecast
在时间层级之间生成一致的预测。我们将使用 M3
数据集的月度和季度时间序列。首先,我们将加载 M3
数据,并使用 StatsForecast
中的 AutoETS
模型生成基础预测。然后,根据指定的时间层级,使用 HierarchicalForecast
中的 THIEF
(时间序列层级预测)对预测进行调和。
参考文献
您可以使用 Google Colab 在 CPU 或 GPU 上运行这些实验。
1. 加载和处理数据
我们将进行高达年度级别的时间序列聚合,因此对于月度和季度数据,我们确保每个时间序列都包含底层时间步长的整数倍。
例如,m3_monthly 中的第一个时间序列(unique_id='M1'
)有 68 个时间步长。这不是 12 的倍数(一年有 12 个月),因此我们无法将所有时间步长聚合成年。因此,我们截断(移除)了前 8 个时间步长,使该序列剩余 60 个时间步长。对于季度数据,我们也做了类似的处理,只是以 4 为倍数(一年有 4 个季度)。
根据您调和问题中最高的时间序列聚合级别,您可能需要以不同的方式截断数据。
2. 时间序列调和
2a. 划分训练/测试集
按照原始 THIEF 论文的做法,我们将月度序列的最后 24 个观测值和每个季度序列的最后 8 个观测值用作测试样本。
2a. 根据时间层级聚合数据集
我们首先定义时间序列聚合规范。规范是一个字典,其中键是聚合的名称,值是在该聚合中应该聚合的底层时间步长数量。例如,year
由 12
个月组成,因此我们定义了一个键值对 "yearly":12
。对于我们感兴趣的其他聚合,我们可以做类似的事情。
接下来,我们使用 aggregate_temporal
函数计算时间序列聚合的训练集和测试集。请注意,由于测试集包含训练集中未包含的时间层级,因此训练集和测试集的聚合矩阵 S
是不同的。
我们的聚合矩阵将最低时间粒度(季度)聚合至年份,用于训练集和测试集。
temporal_id | monthly-1 | monthly-2 | monthly-3 | monthly-4 | |
---|---|---|---|---|---|
0 | yearly-1 | 0.0 | 0.0 | 0.0 | 0.0 |
1 | yearly-2 | 0.0 | 0.0 | 0.0 | 0.0 |
2 | yearly-3 | 0.0 | 0.0 | 0.0 | 0.0 |
3 | yearly-4 | 0.0 | 0.0 | 0.0 | 0.0 |
4 | yearly-5 | 0.0 | 0.0 | 0.0 | 0.0 |
temporal_id | monthly-1 | monthly-2 | monthly-3 | monthly-4 | |
---|---|---|---|---|---|
0 | yearly-1 | 1.0 | 1.0 | 1.0 | 1.0 |
1 | yearly-2 | 0.0 | 0.0 | 0.0 | 0.0 |
2 | semiannually-1 | 1.0 | 1.0 | 1.0 | 1.0 |
3 | semiannually-2 | 0.0 | 0.0 | 0.0 | 0.0 |
4 | semiannually-3 | 0.0 | 0.0 | 0.0 | 0.0 |
2b. 计算基础预测
现在,我们需要计算每个时间序列聚合的基础预测。以下单元格使用 AutoARIMA
模型计算 Y_monthly_train
和 Y_quarterly_train
中每个时间序列聚合的基础预测。请注意,Y_hats
包含预测结果,但它们不一致。
另请注意,每个时间序列聚合的频率和预测范围都不同。对于月度数据,最低级别是月度频率,预测范围为 24
(即 2 年)。然而,例如,year
聚合的频率是年度,预测范围为 2。
当然,您可以为时间序列聚合中的每个级别选择不同的模型——您可以尽情发挥创造力!
2c. 调和预测
我们可以使用 HierarchicalReconciliation
类来调和预测。在本例中,我们使用 BottomUp
和 MinTrace(wls_struct)
。后者是 Forecasting with temporal hierarchies 中介绍的“结构缩放”方法。
请注意,在 reconcile
函数中,我们必须设置 temporal=True
。
3. 评估
HierarchicalForecast
包包含 evaluate
函数,用于评估不同的层级。
我们评估所有时间序列聚合上的时间序列聚合预测结果。
3a. 月度
层级 | 指标 | 基础 | 自下而上 | MinTrace(wls_struct) | |
---|---|---|---|---|---|
0 | 年度 | mae-scaled | 1.0 | 0.78 | 0.75 |
1 | 半年度 | mae-scaled | 1.0 | 0.99 | 0.95 |
2 | 四月度 | mae-scaled | 1.0 | 0.96 | 0.93 |
3 | 季度 | mae-scaled | 1.0 | 0.95 | 0.93 |
4 | 双月度 | mae-scaled | 1.0 | 0.96 | 0.94 |
5 | 月度 | mae-scaled | 1.0 | 1.00 | 0.99 |
6 | 总体 | mae-scaled | 1.0 | 0.94 | 0.92 |
MinTrace(wls_struct)
是总体表现最好的方法,在所有层级上的 mae
得分最低。
3b. 季度
层级 | 指标 | 基础 | 自下而上 | MinTrace(wls_struct) | |
---|---|---|---|---|---|
0 | 年度 | mae-scaled | 1.0 | 0.87 | 0.85 |
1 | 半年度 | mae-scaled | 1.0 | 1.03 | 1.00 |
2 | 季度 | mae-scaled | 1.0 | 1.00 | 0.97 |
3 | 总体 | mae-scaled | 1.0 | 0.97 | 0.94 |
同样,MinTrace(wls_struct)
是总体表现最好的方法,在所有层级上的 mae
得分最低。