使用 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 得分最低。

