间歇性数据
在本 Notebook 中,我们将使用 M5 数据集实现针对间歇性或稀疏数据的模型。
间歇性或稀疏数据具有非常少的非零观测值。这类数据很难预测,因为零值增加了数据底层模式的不确定性。此外,一旦出现非零观测值,其大小可能会有相当大的变化。间歇性时间序列在许多行业中都很常见,包括金融、零售、交通和能源。鉴于此类时间序列的普遍性,已经开发了专门的方法来预测它们。第一个方法来自 Croston (1972),随后出现了几种变体以及不同的聚合框架。
NeuralForecast 的模型可以使用 Poisson
分布损失来训练,以建模稀疏或间歇性时间序列。通过本教程,您将很好地理解这些模型及其用法。
大纲
- 安装库
- 加载并探索数据
- 训练间歇性数据模型
- 执行交叉验证
提示
您可以使用 Colab 交互式运行本 Notebook。
警告
为了减少计算时间,建议使用 GPU。使用 Colab 时,请务必激活它。只需前往
Runtime>Change runtime type
并选择 GPU 作为硬件加速器。
1. 安装库
我们假定您已安装 NeuralForecast。如果尚未安装,请查看本指南了解如何安装 NeuralForecast。
使用 pip install neuralforecast
安装必要的包。
2. 加载并探索数据
本例将使用 M5 竞赛数据集的子集。每个时间序列代表特定 Walmart 商店中特定产品的单位销售额。在此层面(产品-商店),大部分数据是间歇性的。我们首先需要导入数据。
为了简化,我们将仅保留一个类别。
使用 StatsForecast
类的 plot
方法绘制一些序列。此方法打印数据集中的 8 个随机序列,有助于进行基础 EDA。
3. 训练间歇性数据模型
每个 Auto
模型都包含一个默认的搜索空间,该空间在多个大规模数据集上进行了广泛测试。此外,用户可以定义针对特定数据集和任务量身定制的搜索空间。
首先,我们为 AutoNHITS
和 AutoTFT
模型创建自定义搜索空间。搜索空间用字典指定,其中键对应于模型的超参数,值是指定超参数如何采样的 Tune
函数。例如,使用 randint
均匀采样整数,使用 choice
采样列表中的值。
要实例化 Auto
模型,您需要定义:
h
:预测范围。loss
:来自neuralforecast.losses.pytorch
的训练和验证损失。config
:超参数搜索空间。如果为None
,则Auto
类将使用预定义的建议超参数空间。search_alg
:搜索算法(来自tune.search
),默认为随机搜索。有关不同搜索算法选项的更多信息,请参阅 https://docs.rayai.org.cn/en-latest/tune/api_docs/suggestion.html。num_samples
:探索的配置数量。
在本例中,我们将预测范围 h
设置为 28,使用 Poisson
分布损失(适用于计数数据)进行训练和验证,并使用默认搜索算法。
提示
样本数量
num_samples
是一个关键参数!较大的值通常会产生更好的结果,因为我们在搜索空间中探索了更多配置,但这会增加训练时间。较大的搜索空间通常需要更多样本。一般规则是,我们建议将num_samples
设置得高于 20。
接下来,我们使用 Neuralforecast
类训练 Auto
模型。在此步骤中,Auto
模型将自动执行超参数调优,训练多个具有不同超参数的模型,在验证集上生成预测,并对其进行评估。最佳配置是根据验证集上的误差选择的。只有最佳模型会被存储并在推理期间使用。
接下来,我们使用 predict
方法使用最优超参数预测未来 28 天。
4. 交叉验证
时间序列交叉验证是一种评估模型在过去表现的方法。其工作原理是在历史数据上定义一个滑动窗口,并预测紧随其后的时期。
NeuralForecast 实现了一种快速易用的时间序列交叉验证。
NeuralForecast
类的 cross_validation
方法接受以下参数。
df
:训练数据框step_size
(int):每个窗口之间的步长。换句话说:您希望多久运行一次预测过程。n_windows
(int):用于交叉验证的窗口数量。换句话说:您希望评估过去多少个预测过程。
cv_df
对象是一个新的数据框,包含以下列:
unique_id
:包含时间序列对应的 IDds
:日期戳或时间索引cutoff
:n_windows
的最后一个日期戳或时间索引。如果n_windows=1
,则有一个唯一的截止值;如果n_windows=2
,则有两个唯一的截止值。y
:真实值"model"
:包含模型名称和拟合值的列。
unique_id | ds | cutoff | AutoNHITS | AutoNHITS-median | AutoNHITS-lo-90 | AutoNHITS-lo-80 | AutoNHITS-hi-80 | AutoNHITS-hi-90 | AutoTFT | AutoTFT-median | AutoTFT-lo-90 | AutoTFT-lo-80 | AutoTFT-hi-80 | AutoTFT-hi-90 | y | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | FOODS_3_001_CA_1 | 2016-02-29 | 2016-02-28 | 0.550 | 0.0 | 0.0 | 0.0 | 2.0 | 2.0 | 0.775 | 1.0 | 0.0 | 0.0 | 2.0 | 2.0 | 0.0 |
1 | FOODS_3_001_CA_1 | 2016-03-01 | 2016-02-28 | 0.611 | 0.0 | 0.0 | 0.0 | 2.0 | 2.0 | 0.746 | 1.0 | 0.0 | 0.0 | 2.0 | 2.0 | 1.0 |
2 | FOODS_3_001_CA_1 | 2016-03-02 | 2016-02-28 | 0.567 | 0.0 | 0.0 | 0.0 | 2.0 | 2.0 | 0.750 | 1.0 | 0.0 | 0.0 | 2.0 | 2.0 | 1.0 |
3 | FOODS_3_001_CA_1 | 2016-03-03 | 2016-02-28 | 0.554 | 0.0 | 0.0 | 0.0 | 2.0 | 2.0 | 0.750 | 1.0 | 0.0 | 0.0 | 2.0 | 2.0 | 0.0 |
4 | FOODS_3_001_CA_1 | 2016-03-04 | 2016-02-28 | 0.627 | 0.0 | 0.0 | 0.0 | 2.0 | 2.0 | 0.788 | 1.0 | 0.0 | 0.0 | 2.0 | 3.0 | 0.0 |
评估
在本节中,我们将使用 MSE 指标评估每个模型在每个交叉验证窗口中的性能。
指标 | AutoNHITS | AutoTFT | cutoff | |
---|---|---|---|---|
0 | mse | 10.059308 | 10.909020 | 2016-02-28 |
1 | mae | 1.485914 | 1.554572 | 2016-02-28 |
0 | mse | 9.590549 | 10.253903 | 2016-03-27 |
1 | mae | 1.494229 | 1.561868 | 2016-03-27 |
0 | mse | 9.596170 | 10.300666 | 2016-04-24 |
1 | mae | 1.501949 | 1.564157 | 2016-04-24 |
参考资料
- Croston, J. D. (1972). Forecasting and stock control for intermittent demands. Journal of the Operational Research Society, 23(3), 289-303.
- Cristian Challu, Kin G. Olivares, Boris N. Oreshkin, Federico Garza, Max Mergenthaler-Canseco, Artur Dubrawski (2021). N-HiTS: Neural Hierarchical Interpolation for Time Series Forecasting. Accepted at AAAI 2023.