预测间歇性需求
在本教程中,我们将展示如何在有许多零值的间歇性序列上使用 TimeGPT。在这里,我们使用 M5 数据集的一个子集,该数据集跟踪加州一家商店食品项目的需求。该数据集还包括外部变量,如销售价格和特定日期发生的事件类型。
TimeGPT 在平均绝对误差 (MAE) 为 0.49 时达到最佳性能,这比专门用于处理间歇性时间序列数据的最佳统计模型提高了 14%。
使用 TimeGPT 进行预测耗时 6.8 秒,而使用统计模型进行拟合和预测耗时 5.2 秒。从技术上讲,TimeGPT 速度较慢,但仅约 1 秒的时间差,我们使用 TimeGPT 获得了更好的预测结果。
初始设置
我们首先导入本教程所需的包,并创建 NixtlaClient
的实例。
👍 使用 Azure AI 端点
要使用 Azure AI 端点,请记住也要设置
base_url
参数
nixtla_client = NixtlaClient(base_url="you azure ai endpoint", api_key="your api_key")
现在我们读取数据集并进行绘制。
unique_id | ds | y | sell_price | event_type_Cultural | event_type_National | event_type_Religious | event_type_Sporting | |
---|---|---|---|---|---|---|---|---|
0 | FOODS_1_001 | 2011-01-29 | 3 | 2.0 | 0 | 0 | 0 | 0 |
1 | FOODS_1_001 | 2011-01-30 | 0 | 2.0 | 0 | 0 | 0 | 0 |
2 | FOODS_1_001 | 2011-01-31 | 0 | 2.0 | 0 | 0 | 0 | 0 |
3 | FOODS_1_001 | 2011-02-01 | 1 | 2.0 | 0 | 0 | 0 | 0 |
4 | FOODS_1_001 | 2011-02-02 | 4 | 2.0 | 0 | 0 | 0 | 0 |
在上图中,我们可以看到该数据集的间歇性特征,许多时期需求为零。
现在,让我们使用 TimeGPT 来预测每种产品的需求。
有界预测
为了避免模型产生负面预测,我们对数据使用对数变换。这样,模型将被迫只预测正值。
请注意,由于数据集中存在零值,我们在取对数之前对所有点都加一。
unique_id | ds | y | sell_price | event_type_Cultural | event_type_National | event_type_Religious | event_type_Sporting | |
---|---|---|---|---|---|---|---|---|
0 | FOODS_1_001 | 2011-01-29 | 1.386294 | 2.0 | 0 | 0 | 0 | 0 |
1 | FOODS_1_001 | 2011-01-30 | 0.000000 | 2.0 | 0 | 0 | 0 | 0 |
2 | FOODS_1_001 | 2011-01-31 | 0.000000 | 2.0 | 0 | 0 | 0 | 0 |
3 | FOODS_1_001 | 2011-02-01 | 0.693147 | 2.0 | 0 | 0 | 0 | 0 |
4 | FOODS_1_001 | 2011-02-02 | 1.609438 | 2.0 | 0 | 0 | 0 | 0 |
现在,我们保留最后 28 个时间步作为测试集,其余部分用作模型的输入。
使用 TimeGPT 进行预测
📘 Azure AI 中的可用模型
如果您使用的是 Azure AI 端点,请务必设置
model="azureai"
nixtla_client.forecast(..., model="azureai")
对于公共 API,我们支持两种模型:
timegpt-1
和timegpt-1-long-horizon
。默认情况下,使用
timegpt-1
。请参阅本教程,了解如何以及何时使用timegpt-1-long-horizon
。
太好了!TimeGPT 在 5.8 秒内完成,现在我们有了预测结果。然而,这些预测结果是经过转换的,因此我们需要进行逆转换以恢复到原始比例。因此,我们对每个数据点取指数并减去一。
unique_id | ds | TimeGPT | TimeGPT-lo-80 | TimeGPT-hi-80 | |
---|---|---|---|---|---|
0 | FOODS_1_001 | 2016-05-23 | 0.286841 | -0.267101 | 1.259465 |
1 | FOODS_1_001 | 2016-05-24 | 0.320482 | -0.241236 | 1.298046 |
2 | FOODS_1_001 | 2016-05-25 | 0.287392 | -0.362250 | 1.598791 |
3 | FOODS_1_001 | 2016-05-26 | 0.295326 | -0.145489 | 0.963542 |
4 | FOODS_1_001 | 2016-05-27 | 0.315868 | -0.166516 | 1.077437 |
评估
在衡量性能指标之前,让我们绘制预测值与实际值的对比图。
最后,我们可以衡量模型的平均绝对误差 (MAE)。
使用统计模型进行预测
Nixtla 的 statsforecast
库提供了一系列专门为间歇性预测构建的统计模型,例如 Croston、IMAPA 和 TSB。让我们使用这些模型,看看它们与 TimeGPT 的性能对比如何。
在这里,我们使用四种模型:两个版本的 Croston、IMAPA 和 TSB。
然后,我们可以在数据上拟合模型。
在这里,使用四种统计模型进行拟合和预测耗时 5.2 秒,而 TimeGPT 耗时 5.8 秒,因此 TimeGPT 仅慢了 0.6 秒。
同样,我们需要进行逆转换。请记住,训练数据之前已使用对数函数进行转换。
ds | CrostonClassic | CrostonOptimized | IMAPA | TSB | |
---|---|---|---|---|---|
unique_id | |||||
FOODS_1_001 | 2016-05-23 | 0.599093 | 0.599093 | 0.445779 | 0.396258 |
FOODS_1_001 | 2016-05-24 | 0.599093 | 0.599093 | 0.445779 | 0.396258 |
FOODS_1_001 | 2016-05-25 | 0.599093 | 0.599093 | 0.445779 | 0.396258 |
FOODS_1_001 | 2016-05-26 | 0.599093 | 0.599093 | 0.445779 | 0.396258 |
FOODS_1_001 | 2016-05-27 | 0.599093 | 0.599093 | 0.445779 | 0.396258 |
评估
现在,让我们结合所有方法的预测结果,看看哪种方法表现最好。
unique_id | ds | y | sell_price | event_type_Cultural | event_type_National | event_type_Religious | event_type_Sporting | TimeGPT | TimeGPT-lo-80 | TimeGPT-hi-80 | CrostonClassic | CrostonOptimized | IMAPA | TSB | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | FOODS_1_001 | 2016-05-23 | 1.386294 | 2.24 | 0 | 0 | 0 | 0 | 0.286841 | -0.267101 | 1.259465 | 0.599093 | 0.599093 | 0.445779 | 0.396258 |
1 | FOODS_1_001 | 2016-05-24 | 0.000000 | 2.24 | 0 | 0 | 0 | 0 | 0.320482 | -0.241236 | 1.298046 | 0.599093 | 0.599093 | 0.445779 | 0.396258 |
2 | FOODS_1_001 | 2016-05-25 | 0.000000 | 2.24 | 0 | 0 | 0 | 0 | 0.287392 | -0.362250 | 1.598791 | 0.599093 | 0.599093 | 0.445779 | 0.396258 |
3 | FOODS_1_001 | 2016-05-26 | 0.000000 | 2.24 | 0 | 0 | 0 | 0 | 0.295326 | -0.145489 | 0.963542 | 0.599093 | 0.599093 | 0.445779 | 0.396258 |
4 | FOODS_1_001 | 2016-05-27 | 1.945910 | 2.24 | 0 | 0 | 0 | 0 | 0.315868 | -0.166516 | 1.077437 | 0.599093 | 0.599093 | 0.445779 | 0.396258 |
TimeGPT | CrostonClassic | CrostonOptimized | IMAPA | TSB | |
---|---|---|---|---|---|
metric | |||||
mae | 0.492559 | 0.564563 | 0.580922 | 0.571943 | 0.567178 |
在上表中,我们可以看到 TimeGPT 实现了最低的平均绝对误差 (MAE),比性能最佳的统计模型提高了 12.8%。
目前,这是在未使用任何可用外部特征的情况下完成的。虽然统计模型不支持这些特征,但我们尝试将它们包含在 TimeGPT 中。
使用 TimeGPT 和外部变量进行预测
要使用外部变量进行预测,我们需要指定它们在预测范围内的未来值。因此,我们只需选取事件类型,因为这些日期是提前已知的。
unique_id | ds | event_type_Cultural | event_type_National | event_type_Religious | event_type_Sporting | |
---|---|---|---|---|---|---|
0 | FOODS_1_001 | 2016-05-23 | 0 | 0 | 0 | 0 |
1 | FOODS_1_001 | 2016-05-24 | 0 | 0 | 0 | 0 |
2 | FOODS_1_001 | 2016-05-25 | 0 | 0 | 0 | 0 |
3 | FOODS_1_001 | 2016-05-26 | 0 | 0 | 0 | 0 |
4 | FOODS_1_001 | 2016-05-27 | 0 | 0 | 0 | 0 |
然后,我们只需调用 forecast
方法,并在 X_df
参数中传入 futr_exog_df
。
📘 Azure AI 中的可用模型
如果您使用的是 Azure AI 端点,请务必设置
model="azureai"
nixtla_client.forecast(..., model="azureai")
对于公共 API,我们支持两种模型:
timegpt-1
和timegpt-1-long-horizon
。默认情况下,使用
timegpt-1
。请参阅本教程,了解如何以及何时使用timegpt-1-long-horizon
。
太好了!请记住预测结果是经过转换的,因此我们必须再次进行逆转换。
unique_id | ds | TimeGPT_ex | TimeGPT-lo-80 | TimeGPT-hi-80 | |
---|---|---|---|---|---|
0 | FOODS_1_001 | 2016-05-23 | 0.281922 | -0.269902 | 1.250828 |
1 | FOODS_1_001 | 2016-05-24 | 0.313774 | -0.245091 | 1.286372 |
2 | FOODS_1_001 | 2016-05-25 | 0.285639 | -0.363119 | 1.595252 |
3 | FOODS_1_001 | 2016-05-26 | 0.295037 | -0.145679 | 0.963104 |
4 | FOODS_1_001 | 2016-05-27 | 0.315484 | -0.166760 | 1.076830 |
评估
最后,让我们评估使用外部特征的 TimeGPT 的性能。
unique_id | ds | y | sell_price | event_type_Cultural | event_type_National | event_type_Religious | event_type_Sporting | TimeGPT | TimeGPT-lo-80 | TimeGPT-hi-80 | CrostonClassic | CrostonOptimized | IMAPA | TSB | TimeGPT_ex | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | FOODS_1_001 | 2016-05-23 | 1.386294 | 2.24 | 0 | 0 | 0 | 0 | 0.286841 | -0.267101 | 1.259465 | 0.599093 | 0.599093 | 0.445779 | 0.396258 | 0.281922 |
1 | FOODS_1_001 | 2016-05-24 | 0.000000 | 2.24 | 0 | 0 | 0 | 0 | 0.320482 | -0.241236 | 1.298046 | 0.599093 | 0.599093 | 0.445779 | 0.396258 | 0.313774 |
2 | FOODS_1_001 | 2016-05-25 | 0.000000 | 2.24 | 0 | 0 | 0 | 0 | 0.287392 | -0.362250 | 1.598791 | 0.599093 | 0.599093 | 0.445779 | 0.396258 | 0.285639 |
3 | FOODS_1_001 | 2016-05-26 | 0.000000 | 2.24 | 0 | 0 | 0 | 0 | 0.295326 | -0.145489 | 0.963542 | 0.599093 | 0.599093 | 0.445779 | 0.396258 | 0.295037 |
4 | FOODS_1_001 | 2016-05-27 | 1.945910 | 2.24 | 0 | 0 | 0 | 0 | 0.315868 | -0.166516 | 1.077437 | 0.599093 | 0.599093 | 0.445779 | 0.396258 | 0.315484 |
TimeGPT | CrostonClassic | CrostonOptimized | IMAPA | TSB | TimeGPT_ex | |
---|---|---|---|---|---|---|
metric | ||||||
mae | 0.492559 | 0.564563 | 0.580922 | 0.571943 | 0.567178 | 0.485352 |
从上表中可以看出,使用外部特征提高了 TimeGPT 的性能。现在,它比最佳统计模型提高了 14%。
使用带外部特征的 TimeGPT 耗时 6.8 秒。这比统计模型慢 1.6 秒,但获得了更好的预测结果。