本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
DeepAR 预测算法
Amazon SageMaker DeepAR 预测算法是一种自主学习算法,使用递归神经网络 (RNN) 来预测标量(一维)时间序列。经典预测方法,如自回归积分滑动平均模型 (ARIMA) 或指数平滑法 (ETS),将一个模型拟合到各个单独的时间序列。然后,他们使用该模型将时间序列推断到未来。
但是,在很多应用中,您有跨一组具有代表性单元的多个相似时间序列。例如,您可能会针对不同产品的需求、服务器负载和网页请求进行时间序列分组。对于此类应用程序,您可以从所有时间序列中联合训练单个模型中受益。DeepAR 采用这种方法。当数据集包含数百个相关时间序列时,DeepAR 将优于标准 ARIMA 和 ETS 方法。您还可以使用训练过的模型来生成与已训练过的时间序列相似的新时间序列的预测。
DeepAR 算法的训练输入为一个或多个(最好是多个)target
由同一进程或类似进程生成的时间序列。该算法基于此输入数据集训练一个模型,该模型可以学习此过程/流程的近似值,并使用它来预测目标时间序列的演变情况。每个目标时间序列都可以选择性地与cat
字段和动态(时间相关)时间序列矢量由dynamic_feat
字段中返回的子位置类型。SageMaker 通过从训练数据集中的每个目标时间序列中随机抽取训练示例来训练 DeepAR 模型。每个训练示例包括一对具有固定的预定义长度的相邻上下文和预测窗口。要控制网络在过去可以往前看多长时间,请使用context_length
超级参数。要控制未来可以做出预测的距离,请使用prediction_length
超级参数。有关更多信息,请参阅 DeepAR 算法的工作原理。
主题
DeepAR 算法的输入/输出接口
DeepAR 支持两种数据通道。必需的train
频道描述训练数据集。可选的test
channel 描述了算法在训练后用于评估模型准确度的数据集。您可以在中提供培训和测试数据集JSON 行
指定训练和测试数据的路径时,可以指定一个文件或包含多个文件的目录,这些文件可以存储在子目录中。如果指定目录,DeepAR 将使用目录中的所有文件作为相应频道的输入,但以句点 (.) 开头的文件和名为的文件除外_成功. 这可以确保您可以直接使用 Spark 作业生成的输出文件夹作为 DeepAR 培训作业的输入渠道。
默认情况下,DeepAR 模型从文件扩展名 () 确定输入格式。.json
、.json.gz
,或者.parquet
) 在指定的输入路径中。如果路径未以其中一个扩展名结束,则必须在适用于 Python 的 SDK 中明确指定格式。使用content_type
的参数s3_ 输入
输入文件中的记录应包含以下字段:
-
start
一个格式为的字符串YYYY-MM-DD HH:MM:SS
. 开始时间戳不能包含时区信息。 -
target
— 表示时间序列的浮点值或整数的数组。你可以将缺失的值编码为null
文字,或者作为"NaN"
JSON 中的字符串,或者nan
实木复合地板中的浮点值。 -
dynamic_feat
(可选)-表示自定义特征时间序列(动态特征)向量的浮点值或整数的数组。如果设置此字段,则所有记录必须具有相同数量的内部数组(相同数量的要素时间序列)。此外,每个内部数组的长度必须与关联数组的长度相同target
值加上下文的长度。特征中不支持缺少的值。例如,如果目标时间序列代表不同产品的需求,那么关联的dynamic_feat
可能是布尔时间序列,表示促销是否应用于特定商品 (1) (0):{"start": ..., "target": [1, 5, 10, 2], "dynamic_feat": [[0, 1, 1, 0]]}
-
cat
(可选)-可用于对记录所属的组进行编码的分类特征的数组。分类要素必须编码为从 0 开始的正整数序列。例如,分类域名 {R, G, B} 可以编码为 {0, 1, 2}。训练数据集中必须表示每个类别域的所有值。这是因为 DeepAR 算法只能对训练期间观察到的类别进行预测。而且,每个分类要素都嵌入在低维空间中,其维度由embedding_dimension
超级参数。有关更多信息,请参阅 DeepAR 超参数。
如果您使用 JSON 文件,它必须位于JSON 行
{"start": "2009-11-01 00:00:00", "target": [4.3, "NaN", 5.1, ...], "cat": [0, 1], "dynamic_feat": [[1.1, 1.2, 0.5, ...]]} {"start": "2012-01-30 00:00:00", "target": [1.0, -5.0, ...], "cat": [2, 3], "dynamic_feat": [[1.1, 2.05, ...]]} {"start": "1999-01-30 00:00:00", "target": [2.0, 1.0], "cat": [1, 4], "dynamic_feat": [[1.3, 0.4]]}
在此示例中,每个时间序列都有两个关联的分类特征和一个时间序列特征。
对于 Parquet,您使用相同的三个字段作为列。此外,"start"
可以是 datetime
类型。您可以使用 gzip (gzip
) 或 Snappy 压缩库 (snappy
) 来压缩 Parquet 文件。
如果在无 cat
和 dynamic_feat
字段情况下训练该算法,则它学习一个“全局”模型,即跟推理时的目标时间序列的具体身份无关而仅以其形状为条件的模型。
如果模型基于cat
和dynamic_feat
为每个时间序列提供的要素数据,预测可能会受到时间序列的性质的影响,并且相应cat
功能。例如,如果target
时间序列代表服装物品的需求,你可以关联二维cat
用于编码第一个组件中物品类型(例如 0 = 鞋子,1 = 连衣裙)以及第二个组件中物品的颜色(例如 0 = 红色,1 = 蓝色)的矢量。示例输入将如下所示:
{ "start": ..., "target": ..., "cat": [0, 0], ... } # red shoes { "start": ..., "target": ..., "cat": [1, 1], ... } # blue dress
在推理时,您可以通过以下方式请求对目标进行预测cat
是组合的值cat
训练数据中观察到的值,例如:
{ "start": ..., "target": ..., "cat": [0, 1], ... } # blue shoes { "start": ..., "target": ..., "cat": [1, 0], ... } # red dress
以下准则适用于训练数据:
-
时间序列的开始时间和长度可能会有所不同。例如,在营销中,产品通常在不同的日期进入零售目录,因此它们的开始日期自然不同。但是,所有序列必须具有相同的频率、分类特征数和动态特征的数量。
-
根据文件中时间序列的位置将训练文件随机排序。换而言之,时间序列在文件中以随机顺序出现。
-
确保将
start
字段正确。该算法使用start
用于派生内部要素的时间戳。 -
如果您使用分类特征 (
cat
),所有时间序列必须具有相同数目的分类特征。如果数据集包含cat
字段中,算法使用它并从数据集中提取组的基数。默认情况下,cardinality
是"auto"
. 如果数据集包含cat
字段,但您不想使用它,可以通过设置禁用它cardinality
到""
. 如果模型是使用cat
功能,你必须包含它才能推断。 -
如果你的数据集包含
dynamic_feat
字段中,算法会自动使用它。所有时间序列必须具有相同数量的要素时间序列。每个要素时间序列中的时间点与目标中的时间点一对应。此外,中的条目dynamic_feat
字段的长度应与target
. 如果数据集包含dynamic_feat
字段,但您不想使用它,请通过设置 (num_dynamic_feat
到""
)。如果模型是用dynamic_feat
字段中,您必须提供此字段以便推理。此外,每个功能都必须有所提供目标的长度加上prediction_length
. 换句话说,您必须在将来提供特征值。
如果您指定可选的测试通道数据,DeepAR 算法使用不同的准确性指标评估训练后的模型。该算法通过以下方式计算测试数据上的均方根误差 (RMSE):
![RMSE 公式:Sqrt (1/nt (总和 [i, t] (y 帽 (i, t)-y (i, t)) ^2)))))](images/deepar-1.png)
yi,t是时间序列的真正价值i当时t.ŷi,t是平均预测。总和结束了n测试集中的时间序列和每个时间序列的最后时间点,其中对应于预测展望期。您可以通过将prediction_length
超级参数。有关更多信息,请参阅 DeepAR 超参数。
此外,该算法使用加权分位数损失评估预测分布的准确性。对于范围为 [0, 1] 的分位数,加权分位数损失定义如下:

Qi,t(τ)模型预测分布的 τ 分位数。要指定要计算损失的分位数,请将test_quantiles
超级参数。除此之外,还报告了规定的分位数损失的平均值,作为训练记录的一部分。有关信息,请参阅DeepAR 超参数。
为了推断,DeepAR 接受 JSON 格式和以下字段:
-
"instances"
,其中包括 JSON Line 格式的一个或多个时间序列 -
的名字
"configuration"
,其中包括生成预测的参数
有关更多信息,请参阅 DeepAR 推理格式。
使用 DeepAR 算法的最佳实践
准备时间序列数据时,请遵循以下最佳实践以获得最佳结果:
-
除了拆分数据集以进行训练和测试之外,始终提供用于训练、测试和调用模型进行推理时的整个时间序列。无论你怎么设置
context_length
不要分解时间序列或仅提供时间序列的一部分。该模型使用的数据点比中设置的值更早context_length
对于滞后值功能。 -
当优化 DeepAR 模型时,可以拆分数据集以创建训练数据集和测试数据集。在典型的评估中,您将采用训练所用的相同时间序列,但在未来测试模型。
prediction_length
在训练期间可见的最后一个时间点之后紧跟的时间点。您可以使用整个数据集(可用的所有时间序列的完整长度)作为测试集并删除最后个数据集,从而创建和测试满足此条件的训练和测试数据集。prediction_length
每个时间序列的积分用于训练。在训练期间,模型将看不到测试期间评估它的时间点的目标值。在测试过程中,算法会扣留最后一个prediction_length
测试集中每个时间序列的点数并生成预测。然后它将预测与预扣值进行比较。您可以在测试集中多次重复时间序列,但在不同的终端节点处切割它们,从而创建更复杂的评估。通过此方法,准确率指标将与来自不同时间点的多个预测平均。有关更多信息,请参阅 优化 DeepAR 模型。 -
避免对使用非常大的值 (>400)
prediction_length
因为它使模型变慢而且不那么准确。如果您想进一步预测将来的情况,请考虑以较低的频率聚合数据。例如,使用5min
而不是1min
。 -
由于使用滞后,所以模型在时间序列中可以比为指定的值进一步回顾
context_length
. 因此,您不需要将此参数设置为较大的值。我们建议从您使用的值开始。prediction_length
. -
我们建议您在尽可能多的时间序列上训练 DeepAR 模型。尽管在单个时间序列上训练的 DeepAR 模型可能正常工作,但标准预测算法(如 ARIMA 或 ETS)可能提供更准确的结果。当数据集包含数百个相关时间序列时,DeepAR 算法便开始优于标准方法。目前,DeepAR 要求所有训练时间序列中可用的总观察数至少为 300。
DeepAR 算法的 EC2 实例建议
您可以在 GPU 和 CPU 实例上,在单机器和多机器设置中训练 DeepAR。我们建议您从单 CPU 实例开始(例如,ml.c4.2xlarge 或 ml.c4.4xlarge),并仅在必要时切换到 GPU 实例和多机器。使用 GPU 和多台机器只能提高大型模型(每层有多个单元和具有多个层)以及大量小批量大小(例如,大于 512)的吞吐量。
为了推断,DeepAR 仅支持 CPU 实例。
为指定较大的值context_length
、prediction_length
、num_cells
、num_layers
,或者mini_batch_size
可以创建对于小型实例来说太大的模型。在这种情况下,请使用较大的实例类型或减少这些参数的值。运行超参数调整作业时也经常出现此问题。在这种情况下,请使用足够大的实例类型来进行模型调整任务,并考虑限制关键参数的上限值以避免作业失败。
DeepAR 示例笔记本
有关示例笔记本,该笔记本显示如何准备用于训练 SageMaker DeepAR 算法的时间序列数据集以及如何部署训练后的模型以执行推理,请参阅使用 DeepAR 进行时序预测-综合数据