分层预测
在预测中,我们经常需要较低和较高(时间)粒度的预测,例如产品需求预测,但也包括产品类别或产品部门预测。这些粒度可以通过使用层次结构来形式化。在分层预测中,我们创建与基础时间序列的预定义层次结构一致的预测。
使用 TimeGPT,我们可以创建多个时间序列的预测。随后,我们可以使用 HierarchicalForecast 的分层预测技术对这些预测进行后处理。
1. 导入软件包
首先,我们导入所需的软件包并初始化 Nixtla 客户端。
👍 使用 Azure AI 端点
要使用 Azure AI 端点,请设置
base_url
参数
nixtla_client = NixtlaClient(base_url="you azure ai endpoint", api_key="your api_key")
2. 加载数据
我们使用澳大利亚旅游数据集,该数据集来自 Forecasting, Principles and Practices,其中包含澳大利亚旅游数据。我们对澳大利亚的 7 个州、27 个区域和 76 个地区的预测感兴趣。这构成了一个层次结构,其中较低级别(例如悉尼、蓝山和亨特等地区)的预测应与较高级别(例如新南威尔士州)的预测一致。
该数据集仅包含最低级别的时间序列,因此我们需要为所有层次结构创建时间序列。
国家 | 区域 | 州 | 目的 | ds | y | |
---|---|---|---|---|---|---|
0 | 澳大利亚 | 阿德莱德 | 南澳大利亚 | 商务 | 1998-01-01 | 135.077690 |
1 | 澳大利亚 | 阿德莱德 | 南澳大利亚 | 商务 | 1998-04-01 | 109.987316 |
2 | 澳大利亚 | 阿德莱德 | 南澳大利亚 | 商务 | 1998-07-01 | 166.034687 |
3 | 澳大利亚 | 阿德莱德 | 南澳大利亚 | 商务 | 1998-10-01 | 127.160464 |
4 | 澳大利亚 | 阿德莱德 | 南澳大利亚 | 商务 | 1999-01-01 | 137.448533 |
5 | 澳大利亚 | 阿德莱德 | 南澳大利亚 | 商务 | 1999-04-01 | 199.912586 |
6 | 澳大利亚 | 阿德莱德 | 南澳大利亚 | 商务 | 1999-07-01 | 169.355090 |
7 | 澳大利亚 | 阿德莱德 | 南澳大利亚 | 商务 | 1999-10-01 | 134.357937 |
8 | 澳大利亚 | 阿德莱德 | 南澳大利亚 | 商务 | 2000-01-01 | 154.034398 |
9 | 澳大利亚 | 阿德莱德 | 南澳大利亚 | 商务 | 2000-04-01 | 168.776364 |
数据集可以按以下分层结构分组。
使用 HierarchicalForecast
中的 aggregate
函数,我们可以获得完整的时间序列集。
注意
您可以使用
pip
安装hierarchicalforecast
unique_id | ds | y | |
---|---|---|---|
0 | 澳大利亚 | 1998-01-01 | 23182.197269 |
1 | 澳大利亚 | 1998-04-01 | 20323.380067 |
2 | 澳大利亚 | 1998-07-01 | 19826.640511 |
3 | 澳大利亚 | 1998-10-01 | 20830.129891 |
4 | 澳大利亚 | 1999-01-01 | 22087.353380 |
5 | 澳大利亚 | 1999-04-01 | 21458.373285 |
6 | 澳大利亚 | 1999-07-01 | 19914.192508 |
7 | 澳大利亚 | 1999-10-01 | 20027.925640 |
8 | 澳大利亚 | 2000-01-01 | 22339.294779 |
9 | 澳大利亚 | 2000-04-01 | 19941.063482 |
我们使用最后两年(8 个季度)作为测试集。
3. 使用 TimeGPT 进行分层预测
首先,我们使用 TimeGPT 为所有时间序列创建基本预测。请注意,我们设置了 add_history=True
,因为我们将需要 TimeGPT 的样本内拟合值。
我们将预测 2 年(8 个季度),从 2016 年 01 月 01 日开始。
📘 Azure AI 中的可用模型
如果您使用 Azure AI 端点,请务必设置
model="azureai"
nixtla_client.forecast(..., model="azureai")
对于公共 API,我们支持两种模型:
timegpt-1
和timegpt-1-long-horizon
。默认情况下,使用
timegpt-1
。关于如何以及何时使用timegpt-1-long-horizon
,请参阅 本教程。
让我们绘制一些预测图,从最高聚合级别 (Australia
) 到最低级别 (Australia/Queensland/Brisbane/Holiday
)。我们可以看到这些预测仍有改进的空间。
我们可以通过使用 NeuralForecast
中的 HierarchicalReconciliation
方法,使这些预测与指定的层次结构一致。我们将使用 MinTrace 方法。
unique_id | ds | TimeGPT | TimeGPT/MinTrace_method-ols | TimeGPT/MinTrace_method-mint_shrink | |
---|---|---|---|---|---|
0 | 澳大利亚 | 2016-01-01 | 24967.19100 | 25044.408634 | 25394.406211 |
1 | 澳大利亚 | 2016-04-01 | 24528.88300 | 24503.089810 | 24327.212355 |
2 | 澳大利亚 | 2016-07-01 | 24221.77500 | 24083.107812 | 23813.826553 |
3 | 澳大利亚 | 2016-10-01 | 24559.44000 | 24548.038797 | 24174.894203 |
4 | 澳大利亚 | 2017-01-01 | 25570.33800 | 25669.248281 | 25560.277473 |
… | … | … | … | … | … |
3395 | Australia/Western Australia/Experience Perth/V… | 2016-10-01 | 427.81146 | 435.423617 | 434.047102 |
3396 | Australia/Western Australia/Experience Perth/V… | 2017-01-01 | 450.71786 | 453.434056 | 459.954598 |
3397 | Australia/Western Australia/Experience Perth/V… | 2017-04-01 | 452.17923 | 460.197847 | 470.009789 |
3398 | Australia/Western Australia/Experience Perth/V… | 2017-07-01 | 450.68683 | 463.034888 | 482.645932 |
3399 | Australia/Western Australia/Experience Perth/V… | 2017-10-01 | 443.31050 | 451.754435 | 474.403379 |
再次,我们绘制一些预测图。我们可以看到预测之间存在一些(主要是微小的)差异。
让我们从数值上验证在不应用后处理步骤的情况下的预测。我们可以为此使用 HierarchicalEvaluation
。
级别 | 指标 | TimeGPT | TimeGPT/MinTrace_method-ols | TimeGPT/MinTrace_method-mint_shrink | |
---|---|---|---|---|---|
0 | 总计 | rmse | 1433.07 | 1436.07 | 1627.43 |
1 | 目的 | rmse | 482.09 | 475.64 | 507.50 |
2 | 州 | rmse | 275.85 | 278.39 | 294.28 |
3 | 区域 | rmse | 49.40 | 47.91 | 47.99 |
4 | 底部 | rmse | 19.32 | 19.11 | 18.86 |
5 | 总体 | rmse | 38.66 | 38.21 | 39.16 |
通过使用 MinTrace(ols)
对预测进行协调,我们使总体 RMSE 略有改进;而使用 MinTrace(mint_shrink)
则使预测略微变差,这表明基础预测本身已经相对较强。
然而,我们现在也获得了协调一致的预测——因此,我们不仅实现了(小幅)精度改进,还通过协调步骤获得了与层次结构的一致性。
参考文献