概率预测
在本例中,我们将实现预测区间
前提条件
本教程假设您对 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] 的- pandasdataframe。
- forecasts_df: 一个包含列 [- unique_id,- ds] 和模型的- pandasdataframe。
- 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
从这些图表可以看出,每个预测结果的不确定性因所使用的模型而异。对于相同的时间序列,一个模型预测的可能未来值范围可能比其他模型更广。

