概率预测
在本例中,我们将实现预测区间
前提条件
本教程假设您对 MLForecast 有基本了解。有关最小示例,请访问快速入门
引言
生成预测时,我们通常会得到一个单一的值,称为点预测。然而,这个值并没有告诉我们与预测相关的不确定性。为了衡量这种不确定性,我们需要预测区间。
预测区间是预测值在给定概率下可能落入的范围。因此,一个 95% 的预测区间应包含一个范围,其中包含实际未来值的概率为 95%。概率预测旨在生成完整的预测分布。另一方面,点预测通常返回所述分布的平均值或中位数。然而,在现实世界中,最好不仅预测最可能的未来结果,还要预测许多替代结果。
使用MLForecast,您可以训练 sklearn
模型来生成点预测。它还利用 ConformalPrediction
来生成相同的点预测并为其添加预测区间。在本教程结束时,您将很好地了解如何为时间序列预测中的 sklearn
模型添加概率区间。此外,您还将学习如何使用历史数据、点预测和预测区间生成图表。
重要
尽管这些术语经常混淆,但预测区间与置信区间不同。
警告
实际上,大多数预测区间都太窄,因为模型没有考虑到所有不确定性来源。有关此问题的讨论可在此处找到。
大纲
- 安装库
- 加载和探索数据
- 训练模型
- 绘制预测区间
提示
您可以使用 Colab 交互式运行此 Notebook
安装库
使用 pip install mlforecast utilsforecast
安装必需的软件包
加载和探索数据
在本例中,我们将使用M4 竞赛中的每小时数据集。我们首先需要从 URL 下载数据,然后将其加载为 pandas
dataframe。请注意,我们将分别加载训练数据和测试数据。我们还将把测试数据的 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 | |
---|---|---|---|
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 个序列以减少总计算时间。
我们可以使用utilsforecast库中的 plot_series
函数绘制这些序列。此函数有多个参数,本 Notebook 中生成图表所需的参数如下所示。
df
: 一个包含列 [unique_id
,ds
,y
] 的pandas
dataframe。forecasts_df
: 一个包含列 [unique_id
,ds
] 和模型的pandas
dataframe。plot_random
: bool =True
。随机绘制时间序列。models
: List[str]。包含我们要绘制的模型的列表。level
: List[float]。包含我们要绘制的预测区间的列表。engine
: str =matplotlib
。也可以是plotly
。plotly
生成交互式图表,而matplotlib
生成静态图表。
训练模型
MLForecast 可以高效地在不同的时间序列上训练遵循 sklearn
语法(fit
和 predict
)的多个模型。
在本例中,我们将使用以下 sklearn
基线模型
要使用这些模型,我们首先需要从 sklearn
导入它们,然后实例化它们。
要实例化一个新的 MLForecast 对象,我们需要以下参数
models
: 上一步中定义的模型列表。target_transforms
: 在计算特征之前应用于目标变量的变换。这些变换在预测步骤中会恢复。lags
: 用作特征的目标变量滞后值。
现在我们准备生成点预测和预测区间。为此,我们将使用 fit
方法,该方法接受以下参数:
data
: 长格式的序列数据。id_col
: 标识每个序列的列。在本例中为unique_id
。time_col
: 标识每个时间步的列,其值可以是时间戳或整数。在本例中为ds
。target_col
: 包含目标变量的列。在本例中为y
。prediction_intervals
: 一个PredicitonIntervals
类。该类接受两个参数:n_windows
和h
。n_windows
表示用于校准区间的交叉验证窗口数量,h
是预测范围。该策略将针对每个预测范围步骤调整区间,从而导致每个步骤的宽度不同。
拟合模型后,我们将调用 predict
方法生成带预测区间的预测结果。该方法接受以下参数:
horizon
: 表示预测范围的整数。在本例中,我们将预测未来 48 小时。level
: 一个浮点数列表,表示预测区间的置信水平。例如,level=[95]
意味着值范围应包含实际未来值,概率为 95%。
unique_id | ds | Ridge | Lasso | LinearRegression | KNeighborsRegressor | MLPRegressor | Ridge-lo-95 | Ridge-lo-80 | Ridge-lo-50 | … | KNeighborsRegressor-lo-50 | KNeighborsRegressor-hi-50 | KNeighborsRegressor-hi-80 | KNeighborsRegressor-hi-95 | MLPRegressor-lo-95 | MLPRegressor-lo-80 | MLPRegressor-lo-50 | MLPRegressor-hi-50 | MLPRegressor-hi-80 | MLPRegressor-hi-95 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | H1 | 701 | 612.418170 | 612.418079 | 612.418170 | 615.2 | 612.651532 | 590.473256 | 594.326570 | 603.409944 | … | 609.45 | 620.95 | 627.20 | 631.310 | 584.736193 | 591.084898 | 597.462107 | 627.840957 | 634.218166 | 640.566870 |
1 | H1 | 702 | 552.309298 | 552.308073 | 552.309298 | 551.6 | 548.791801 | 498.721501 | 518.433843 | 532.710850 | … | 535.85 | 567.35 | 569.16 | 597.525 | 497.308756 | 500.417799 | 515.452396 | 582.131207 | 597.165804 | 600.274847 |
2 | H1 | 703 | 494.943384 | 494.943367 | 494.943384 | 509.6 | 490.226796 | 448.253304 | 463.266064 | 475.006125 | … | 492.70 | 526.50 | 530.92 | 544.180 | 424.587658 | 436.042788 | 448.682502 | 531.771091 | 544.410804 | 555.865935 |
3 | H1 | 704 | 462.815779 | 462.815363 | 462.815779 | 474.6 | 459.619069 | 409.975219 | 422.243593 | 436.128272 | … | 451.80 | 497.40 | 510.26 | 525.500 | 379.291083 | 392.580306 | 413.353178 | 505.884959 | 526.657832 | 539.947054 |
4 | H1 | 705 | 440.141034 | 440.140586 | 440.141034 | 451.6 | 438.091712 | 377.999588 | 392.523016 | 413.474795 | … | 427.40 | 475.80 | 488.96 | 503.945 | 348.618034 | 362.503767 | 386.303325 | 489.880099 | 513.679657 | 527.565389 |
绘制预测区间
为了绘制点预测和预测区间,我们将再次使用 plot_series
函数。请注意,现在我们还需要指定要绘制的模型和级别。
KNeighborsRegressor
Lasso
LineaRegression
MLPRegressor
Ridge
从这些图表可以看出,每个预测结果的不确定性因所使用的模型而异。对于相同的时间序列,一个模型预测的可能未来值范围可能比其他模型更广。