本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
DeepAR 预测算法
Amazon SageMaker DeepAR 预测算法是一种监督学习算法,可使用递归神经网络 (RNN) 来预测标量(一维)时间序列。经典预测方法,如自回归积分滑动平均模型 (ARIMA) 或指数平滑法 (ETS),将一个模型拟合到各个单独的时间序列。然后,他们使用该模型将时间序列推断到future。
但是,在很多应用中,您有跨一组具有代表性单元的多个相似时间序列。例如,您可能具有针对不同产品的需求、服务器负载和网页请求的时间序列分组。对于此类应用程序,联合所有时间序列来训练单个模型会非常有益。DeepAR 采用此方法。当您的数据集包含数百个相关时间序列时,DeepAR 方法将执行标准 ARIMA 和 ETS 方法。您还可以使用训练过的模型来生成与已训练过的时间序列相似的新时间序列的预测。
DeepAR 算法的训练输入是一个或多个,最好是多个target
由相同进程或类似进程生成的时间序列。基于此输入数据集,该算法训练一个模型,该模型学习此过程/过程的近似值,并使用它来预测目标时间序列的演变方式。每个目标时间序列可以选择性地与静态(与时间无关)分类特征的矢量相关联cat
字段和动态(随时间变化)时间序列的矢量由dynamic_feat
字段中返回的子位置类型。 SageMaker 通过从训练数据集中的每个目标时间序列中随机抽取训练示例来训练 DeepAR 模型。每个训练示例包括一对具有固定的预定义长度的相邻上下文和预测窗口。要控制网络可以往前查看多长时间,请使用context_length
超参数。要控制在future 多长时间内可以进行预测,请使用prediction_length
超参数。有关更多信息,请参阅 DepAR 算法的运算背景的更多信息。
主题
DeepAR 算法的输入/输出接口
DeepAR 支持两种数据通道。必需train
channel 描述训练数据集。可选的test
channel 描述了算法用于在训练后评估模型精度的数据集。您可以在中提供训练和测试数据集JSON 行
指定训练和测试数据的路径时,可以指定单个文件或包含多个文件的目录,这些文件可以存储在子目录中。如果您指定一个目录,DeepAR 将使用该目录中的所有文件作为相应频道的输入,但以句点 (.) 开头的文件和名为的文件除外_成功. 这样可以确保您可以直接使用 Spark 作业生成的输出文件夹作为 DeepAR 训练作业的输入通道。
默认情况下,DeepAR 模型从文件扩展名 (.json
、.json.gz
,或者.parquet
) 在指定的输入路径中。如果路径未以其中一个扩展名结束,则必须在适用于 Python 的 SDK 中明确指定格式。使用content_type
的参数s3_input
输入文件中的记录应包含以下字段:
-
start
—格式为的字符串YYYY-MM-DD HH:MM:SS
. 开始时间戳不能包含时区信息。 -
target
表示时间序列的浮点值或整数的数组。你可以将缺失的值编码为null
字面值,或者作为"NaN"
JSON 中的字符串或作为nan
Parquet 中的浮点值。 -
dynamic_feat
(可选)-一个或多个表示自定义特征时间序列(动态特征)向量的浮点值或整数的数组。如果设置此字段,则所有记录必须具有相同数量的内部数组(相同数量的要素时间序列)。此外,每个内部数组的长度必须与关联的数组相同target
超值 plusprediction_length
. 特征中不支持缺少的值。例如,如果目标时间序列表示不同产品的需求,则关联的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
feature,则必须将其包含在内才能进行推断。 -
如果您的数据集包含
dynamic_feat
字段中,算法会自动使用它。所有时间序列必须具有相同数量的特征时间序列。每个要素时间序列中的时间点对应 one-to-one 到目标中的时间点。此外,在dynamic_feat
字段的长度应与的长度相同target
. 如果数据集包含dynamic_feat
字段,但您不想使用它,请通过设置 (num_dynamic_feat
到""
)。如果模型是使用dynamic_feat
字段中,您必须提供此字段以进行推理。此外,每个要素都必须具有所提供目标的长度加上prediction_length
. 换句话说,您必须在将来提供特征值。
如果您指定可选的测试通道数据,DeepAR 算法使用不同的准确性指标评估训练后的模型。该算法通过以下方式计算测试数据上的均方根误差 (RMSE):

yi,t是时间序列的真实值i当时t.ŷi,t是均值预测。总而言之n测试集中的时间序列以及每个时间序列的最后 T 个时间点,其中对应于预测期。您可以通过设置prediction_length
超参数。有关更多信息,请参阅 DeepAR 超参数。
此外,此算法使用加权分位数损失评估预测分布的准确度。对于范围为 [0, 1] 的分位数,加权分位数损失定义如下:

qi,t()是模型预测分布的分位数。要指定要计算损失的分位数,请将test_quantiles
超参数。除此之外,规定的分位数损失的平均值也作为训练日志的一部分进行报告。有关信息,请参阅DeepAR 超参数。
为了推断,DeepAR 接受 JSON 格式和以下字段:
-
"instances"
,其中包含一个或多个 JSON 行格式的时间序列 -
的名字
"configuration"
,其中包括用于生成预测的参数
有关更多信息,请参阅 DeepAR 推理格式。
使用 DeepAR 算法的最佳实践
准备时间序列数据时,请遵循以下最佳做法以获得最佳结果:
-
除了分割用于训练和测试的数据集之外,始终提供整个时间序列来训练、测试和调用模型进行推断。不管你怎么设置
context_length
,不要分解时间序列或仅提供时间序列的一部分。该模型使用比中设置的值更远的数据点context_length
用于滞后值功能。 -
优化 DeepAR 模型时,您可以拆分数据集以创建训练数据集和测试数据集。在典型的评估中,您可以在训练所用的相同时间序列上测试模型,但在将future 时间序列上测试模型
prediction_length
在训练期间可见的最后一个时间点之后紧接着的时间点。您可以在测试集中使用整个数据集(完整长度作为测试集并删除最后个数据集),从而创建和测试满足此条件的训练和测试数据集prediction_length
每个时间序列中的分数用于训练。在训练过程中,模型在测试期间不会看到评估它的时间点的目标值。在测试期间,算法保留最后一个prediction_length
测试集中的每个时间序列的点,然后生成一个预测。然后,它将预测值与预扣金额进行比较。您可以在测试集中多次重复时间序列,但在不同的终端节点处切割它们,从而创建更复杂的评估。使用此方法,可以在不同时间点的多个预测平均准确率指标。有关更多信息,请参阅 调整 DDeepAR 模型。 -
避免对使用非常大的值 (>400)
prediction_length
因为它会使模型变慢且不够准确。如果您想进一步预测将future 情况,请考虑以更低的频率聚合数据。例如,使用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 进行时间序列预测 - 综合数据