Amazon Forecast 与 StatsForecast 对比
亚马逊的 AutoML 与开源统计方法对比
数据
我们将使用 Walmart 提供的M5 竞赛数据集。该数据集的有趣之处在于其规模庞大,并且包含许多发生频率较低的时间序列。这类时间序列在零售场景中很常见,传统的时间序列预测技术很难处理。
数据可从以下 URL 下载
- 训练集:
https://m5-benchmarks.s3.amazonaws.com/data/train/target.parquet
- 时间外部变量(供 AmazonForecast 使用):
https://m5-benchmarks.s3.amazonaws.com/data/train/temporal.parquet
- 静态外部变量(供 AmazonForecast 使用):
https://m5-benchmarks.s3.amazonaws.com/data/train/static.parquet
有关数据的更详细描述,请参见此处。
警告
M5 竞赛具有层级结构。也就是说,需要针对不同聚合级别(国家、州、商店等)进行预测。在本实验中,我们仅使用底层数据生成预测。评估通过自下而上的协调方法进行,以获得更高层级的预测。
Amazon Forecast
Amazon Forecast 是一个全自动时间序列预测解决方案。该解决方案可以接收待预测的时间序列和外部变量(时间性和静态性)。在本实验中,我们按照本教程的步骤使用了 Amazon Forecast 的 AutoPredict 功能。关于该数据集的具体步骤的详细描述,请参见此处。
Amazon Forecast 使用 AutoPredictor 创建预测器,它会将最优算法组合应用于数据集中每个时间序列。预测器是 Amazon Forecast 模型,使用您的目标时间序列、相关时间序列、项目元数据以及您包含的任何其他数据集进行训练。
包含的算法范围广泛,从常用的统计算法(如自回归积分移动平均 (ARIMA))到复杂的神经网络算法(如 CNN-QR 和 DeepAR+)。包括:CNN-QR、DeepAR+、Prophet、NPTS、ARIMA 和 ETS。
为了利用 Amazon Forecast 的概率特性并启用置信区间进行进一步分析,我们预测了以下分位数:0.1 | 0.5 | 0.9。
Amazon Forecast 的完整管道耗时 4.1 小时,结果可在以下位置找到:s3://m5-benchmarks/forecasts/amazonforecast-m5.parquet
Nixtla 的 StatsForecast
安装必要的库
我们假设您已经安装了 StatsForecast。有关如何安装 StatsForecast的说明,请参阅本指南。
此外,我们将安装 s3fs
以从 AWS 的 S3 文件系统读取数据。(如果您不想使用云存储提供商,可以使用 pandas 在本地读取文件)
输入格式
我们将使用 pandas 读取存储在 parquet 文件中的数据集以提高效率。您可以使用普通的 pandas 操作读取 .csv
等其他格式的数据。
StatsForecast 的输入始终是长格式的数据帧,包含三列:unique_id
、ds
和 y
-
unique_id
(字符串、整数或类别)表示序列的标识符。 -
ds
(日期戳)列应采用 Pandas 期望的格式,日期格式最好是 YYYY-MM-DD,时间戳格式最好是 YYYY-MM-DD HH:MM:SS。 -
y
(数值型)表示我们希望预测的测量值。我们将重命名
因此,我们将重命名原始列,使其与 StatsForecast 兼容。
根据您的互联网连接速度,此步骤大约需要 20 秒。
警告
我们正在从 S3 读取文件,因此您需要安装 s3fs 库。要安装它,请运行
! pip install s3fs
读取数据
unique_id | ds | y | |
---|---|---|---|
0 | FOODS_1_001_CA_1 | 2011-01-29 | 3.0 |
1 | FOODS_1_001_CA_1 | 2011-01-30 | 0.0 |
2 | FOODS_1_001_CA_1 | 2011-01-31 | 0.0 |
3 | FOODS_1_001_CA_1 | 2011-02-01 | 1.0 |
4 | FOODS_1_001_CA_1 | 2011-02-02 | 4.0 |
训练统计模型
我们通过实例化一个新的 StatsForecast
对象并传入以下参数来拟合模型:
-
models
: 模型列表。从模型中选择您想要的模型并导入。在本例中,我们将使用AutoETS
和DynamicOptimizedTheta
。我们将season_length
设置为 7,因为我们期望每周都有季节性效应。(参见:季节周期) -
freq
: 一个字符串,指示数据的频率。(参见 pandas 可用的频率。) -
n_jobs
: n_jobs: int,并行处理中使用的作业数量,使用 -1 表示所有核心。 -
fallback_model
: 如果某个模型失败时使用的备用模型。
任何设置都通过构造函数传入。然后调用其 fit 方法并传入历史数据帧。
注意
StatsForecast 通过 Numba 进行 JIT 编译实现极快的速度。第一次调用 statsforecast 类时,fit 方法大约需要 5 秒。第二次——一旦 Numba 编译了您的设置——应该不到 0.2 秒。
-
SeasonalNaive
: 内存高效的季节性朴素预测。参考:SeasonalNaive
。 -
DynamicOptimizedTheta
: 将两条 theta 线拟合到去季节化的时间序列,使用不同的技术获得并组合这两条 theta 线以生成最终预测。参考:DynamicOptimizedTheta
。
forecast
方法接受两个参数:预测接下来的 h
步(horizon)和 level
。
-
h
(int): 表示未来 h 步的预测。在本例中,是未来 12 个月。 -
level
(list of floats): 此可选参数用于概率预测。设置预测区间的level
(或置信度百分位数)。例如,level=[90]
意味着模型期望实际值在 90% 的时间内落在此区间内。
这里的预测对象是一个新的数据帧,包含模型的名称列、y hat 值列以及不确定性区间的列。
注意
forecast
方法旨在与分布式集群兼容,因此它不存储任何模型参数。如果您想为每个模型存储参数,可以使用fit
和predict
方法。但是,这些方法并未为 Spark、Ray 或 Dask 等分布式引擎定义。
存储结果以进行进一步评估。
评估
本节评估 StatsForecast
和 AmazonForecast
的性能。为此,我们首先需要安装 datasetsforecast,这是一个由 Nixtla 开发的 Python 库,包含大量基准数据集和评估工具。该库将使我们能够使用竞赛中使用的原始评估方法计算模型的性能。
以下函数将允许我们评估输入数据帧中包含的特定模型。该函数对于评估不同模型很有用。
现在让我们读取为每个解决方案生成的预测。
最后,让我们使用预定义的函数计算每个模型的性能。
总计 | 层级 1 | 层级 2 | 层级 3 | 层级 4 | 层级 5 | 层级 6 | 层级 7 | 层级 8 | 层级 9 | 层级 10 | 层级 11 | 层级 12 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
StatsForecast_ThETS_wrmsse | 0.669606 | 0.424331 | 0.515777 | 0.580670 | 0.474098 | 0.552459 | 0.578092 | 0.651079 | 0.642446 | 0.725324 | 1.009390 | 0.967537 | 0.914068 |
StatsForecast_AutoETS_wrmsse | 0.672404 | 0.430474 | 0.516340 | 0.580736 | 0.482090 | 0.559721 | 0.579939 | 0.655362 | 0.643638 | 0.727967 | 1.010596 | 0.968168 | 0.913820 |
StatsForecast_DynamicOptimizedTheta_wrmsse | 0.675333 | 0.429670 | 0.521640 | 0.589278 | 0.478730 | 0.557520 | 0.584278 | 0.656283 | 0.650613 | 0.731735 | 1.013910 | 0.971758 | 0.918576 |
AmazonForecast_p50_wrmsse | 1.617815 | 1.912144 | 1.786991 | 1.736382 | 1.972658 | 2.010498 | 1.805926 | 1.819329 | 1.667225 | 1.619216 | 1.156432 | 1.012942 | 0.914040 |
结果(包括处理时间和成本)可总结在下表中。