交叉验证
在此示例中,我们将实现时间序列交叉验证来评估模型的性能。
前提条件
本教程假定您对
MLForecast
有基本了解。有关最小示例,请访问快速入门
引言
时间序列交叉验证是一种评估模型过去表现的方法。它通过在历史数据上定义一个滑动窗口并预测其后续周期来工作。
MLForecast 提供了一种快速易用的时间序列交叉验证实现。这种实现使得交叉验证成为一种高效的操作,从而减少了时间消耗。在本 notebook 中,我们将使用 M4 竞赛小时数据集的子集来演示。
大纲
- 安装库
- 加载并探索数据
- 训练模型
- 执行时间序列交叉验证
- 评估结果
提示
您可以使用 Colab 交互式运行此 Notebook
安装库
我们假定您已安装 MLForecast
。如果尚未安装,请查阅此指南了解如何安装 MLForecast。
使用 pip install mlforecast
安装必要的包。
加载并探索数据
如引言所述,我们将使用 M4 竞赛小时数据集。我们将首先使用 pandas
从 URL 导入数据。
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 |
MLForecast
的输入是一个采用长格式的数据框,包含三列:unique_id
、ds
和 y
unique_id
(字符串、整数或类别)表示序列的标识符。ds
(日期戳或整数)列应为整数时间索引或 YYYY-MM-DD 或 YYYY-MM-DD HH:MM:SS 格式的日期戳。y
(数值)表示我们要预测的测量值。
此示例中的数据已采用此格式,因此无需进行任何更改。
我们可以使用以下函数绘制我们将处理的时间序列。
定义预测对象
在本示例中,我们将使用 LightGBM。我们首先需要导入它,然后实例化一个新的 MLForecast 对象。
在此示例中,我们仅使用 differences
和 lags
来生成特征。请参阅完整文档以查看所有可用特征。
任何设置都通过构造函数传入。然后调用其 fit
方法并传入历史数据框 df
。
执行时间序列交叉验证
实例化 MLForecast
对象后,我们可以使用 cross_validation 方法。
对于此特定示例,我们将使用 3 个 24 小时窗口。
crossvaldation_df 对象是一个新的数据框,包含以下列
unique_id
:标识每个时间序列。ds
:日期戳或时间索引。cutoff
:n_windows
的最后一个日期戳或时间索引。y
:真实值"model"
:包含模型名称和拟合值的列。
unique_id | ds | cutoff | y | LGBMRegressor | |
---|---|---|---|---|---|
0 | H1 | 677 | 676 | 691.0 | 673.703191 |
1 | H1 | 678 | 676 | 618.0 | 552.306270 |
2 | H1 | 679 | 676 | 563.0 | 541.778027 |
3 | H1 | 680 | 676 | 529.0 | 502.778027 |
4 | H1 | 681 | 676 | 504.0 | 480.778027 |
现在我们将绘制每个截止期的预测结果。
请注意,在每个截止期内,我们仅使用该周期之前的 y
数据生成了未来 24 小时的预测。
评估结果
现在我们可以使用适当的精度指标计算预测的精度。在此,我们将使用均方根误差 (RMSE)。为此,我们可以使用 utilsforecast
,这是 Nixtla 开发的一个 Python 库,其中包含计算 RMSE 的函数。
此度量标准应更好地反映我们模型的预测能力,因为它使用了不同的时间段来测试其精度。
参考文献
Rob J. Hyndman 和 George Athanasopoulos (2018)。“预测原理与实践,时间序列交叉验证”.