概率预测
在本例中,我们将实现预测区间
先决条件
本教程假定您对 StatsForecast 有基本了解。如需一个简单示例,请访问快速入门
简介
生成预测时,我们通常会产生一个单一值,称为点预测。然而,这个值并不能告诉我们与预测相关的任何不确定性信息。为了衡量这种不确定性,我们需要预测区间。
预测区间是预测值在给定概率下可能出现的范围。因此,95% 的预测区间应该包含一个值范围,其中包含实际未来值的概率为 95%。概率预测旨在生成完整的预测分布。点预测则通常返回该分布的均值或中位数。然而,在现实世界中,最好不仅预测最可能的未来结果,还要预测许多替代结果。
StatsForecast 提供了许多可以生成点预测的模型。它也包含可以生成相同点预测及其预测区间的概率模型。这些模型是随机数据生成过程,可以产生完整的预测分布。在本教程结束时,您将对 StatsForecast 中可用的概率模型有很好的理解,并能够使用它们生成点预测和预测区间。此外,您还将学习如何使用历史数据、点预测和预测区间生成图表。
重要提示
尽管这些术语经常混淆,但预测区间与置信区间不同。
警告
实际上,大多数预测区间都太窄了,因为模型没有考虑所有不确定性来源。有关此内容的讨论可以在此处找到。
目录
- 安装库
- 加载和探索数据
- 训练模型
- 绘制预测区间
提示
您可以使用 Colab 交互式地运行此 Notebook
安装库
我们假定您已安装 StatsForecast。如果尚未安装,请查看此指南了解如何安装 StatsForecast
使用 pip install statsforecast
安装所需的包
加载和探索数据
在本例中,我们将使用来自M4 竞赛的每小时数据集。我们首先需要从 URL 下载数据,然后将其加载为 pandas
数据帧。请注意,我们将分别加载训练数据和测试数据。我们还会将测试数据的 y
列重命名为 y_test
。
unique_id | ds | y | |
---|---|---|---|
0 | H1 | 1 | 605.0 |
1 | H1 | 2 | 586.0 |
2 | H1 | 3 | 586.0 |
3 | H1 | 4 | 559.0 |
4 | H1 | 5 | 511.0 |
unique_id | ds | y_test | |
---|---|---|---|
0 | H1 | 701 | 619.0 |
1 | H1 | 702 | 565.0 |
2 | H1 | 703 | 532.0 |
3 | H1 | 704 | 495.0 |
4 | H1 | 705 | 481.0 |
由于此 notebook 的目标是生成预测区间,我们将仅使用数据集中的前 8 个序列以减少总计算时间。
我们可以使用 StatsForecast 类中的 statsforecast.plot
方法绘制这些序列。此方法有多个参数,下文解释了在此 notebook 中生成图表所需的参数。
df
: 一个包含列 [unique_id
,ds
,y
] 的pandas
数据帧。forecasts_df
: 一个包含列 [unique_id
,ds
] 和模型的pandas
数据帧。plot_random
: bool =True
。随机绘制时间序列。models
: List[str]。一个包含我们想要绘制的模型列表。level
: List[float]。一个包含我们想要绘制的预测区间列表。engine
: str =plotly
。也可以是matplotlib
。plotly
生成交互式图表,而matplotlib
生成静态图表。
训练模型
StatsForecast 可以有效地在不同时间序列上训练多种模型。这些模型中的大多数都可以生成概率预测,这意味着它们既可以生成点预测,也可以生成预测区间。
在本例中,我们将使用AutoETS 和以下基线模型
要使用这些模型,我们首先需要从 statsforecast.models
中导入它们,然后实例化它们。考虑到我们正在处理每小时数据,对于需要此参数的模型,我们需要设置 seasonal_length=24
。
要实例化一个新的 StatsForecast 对象,我们需要以下参数
df
: 包含训练数据的数据帧。models
: 在上一步中定义的模型列表。freq
: 一个字符串,指示数据的频率。请参阅pandas 可用的频率。n_jobs
: 一个整数,表示并行处理中使用的作业数。使用 -1 选择所有核心。
现在我们准备生成点预测和预测区间。为此,我们将使用 forecast
方法,该方法接受两个参数
h
: 一个整数,表示预测范围。在本例中,我们将预测未来 48 小时。level
: 一个浮点数列表,表示预测区间的置信水平。例如,level=[95]
表示值范围应以 95% 的概率包含实际未来值。
unique_id | ds | AutoETS | AutoETS-lo-99 | AutoETS-lo-95 | AutoETS-lo-90 | AutoETS-lo-80 | AutoETS-hi-80 | AutoETS-hi-90 | AutoETS-hi-95 | … | RWD-hi-99 | SeasonalNaive | SeasonalNaive-lo-80 | SeasonalNaive-lo-90 | SeasonalNaive-lo-95 | SeasonalNaive-lo-99 | SeasonalNaive-hi-80 | SeasonalNaive-hi-90 | SeasonalNaive-hi-95 | SeasonalNaive-hi-99 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | H1 | 701 | 631.889598 | 533.371822 | 556.926831 | 568.978861 | 582.874079 | 680.905116 | 694.800335 | 706.852365 | … | 789.416619 | 691.0 | 613.351903 | 591.339747 | 572.247484 | 534.932739 | 768.648097 | 790.660253 | 809.752516 | 847.067261 |
1 | H1 | 702 | 559.750830 | 460.738592 | 484.411824 | 496.524343 | 510.489302 | 609.012359 | 622.977317 | 635.089836 | … | 833.254152 | 618.0 | 540.351903 | 518.339747 | 499.247484 | 461.932739 | 695.648097 | 717.660253 | 736.752516 | 774.067261 |
2 | H1 | 703 | 519.235476 | 419.731233 | 443.522100 | 455.694808 | 469.729161 | 568.741792 | 582.776145 | 594.948853 | … | 866.990616 | 563.0 | 485.351903 | 463.339747 | 444.247484 | 406.932739 | 640.648097 | 662.660253 | 681.752516 | 719.067261 |
3 | H1 | 704 | 486.973364 | 386.979536 | 410.887460 | 423.120060 | 437.223465 | 536.723263 | 550.826668 | 563.059268 | … | 895.510095 | 529.0 | 451.351903 | 429.339747 | 410.247484 | 372.932739 | 606.648097 | 628.660253 | 647.752516 | 685.067261 |
4 | H1 | 705 | 464.697366 | 364.216339 | 388.240749 | 400.532950 | 414.705071 | 514.689661 | 528.861782 | 541.153983 | … | 920.702904 | 504.0 | 426.351903 | 404.339747 | 385.247484 | 347.932739 | 581.648097 | 603.660253 | 622.752516 | 660.067261 |
现在我们将把预测结果及其预测区间与测试集合并。这将使我们能够生成每个概率模型的图表。
绘制预测区间
要绘制点和预测区间,我们将再次使用 statsforecast.plot
方法。请注意,现在我们还需要指定要绘制的模型和置信水平。
AutoETS
历史平均
Naive
带漂移的随机游走
季节性朴素法
从这些图表中,我们可以得出结论,围绕每个预测的不确定性因所使用的模型而异。对于同一时间序列,一个模型预测的未来可能值范围可能比其他模型更宽。
参考文献
Rob J. Hyndman 和 George Athanasopoulos (2018)。“预测原则与实践,统计预测视角”.