DeepAR 预测算法 - Amazon SageMaker
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

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通道描述算法在训练后用于评估模型准确度的数据集。您可以提供 JSON 行格式的训练和测试数据集。文件可以采用 gzip 或 Parquet 文件格式。

指定训练和测试数据的路径时,您可以指定单个文件或包含多个文件的目录,这些文件可存储在子目录中。如果您指定一个目录, DeepAR 将使用该目录中的所有文件作为相应通道的输入,以句点 (.) 开头的文件以及名为 _SUCCESS 的文件除外。这可确保您可以直接使用 Spark 作业生成的输出文件夹作为DeepAR训练作业的输入通道。

默认情况下DeepAR,模型从指定输入路径的文件扩展名.json.json.gz(、 或 .parquet)中确定输入格式。如果路径未以其中一个扩展名结束,则必须在 中明确指定格式。SDK for Python. 使用 content_types3_input 类的 参数。

输入文件中的记录应包含以下字段:

  • start—格式为 的字符串YYYY-MM-DD HH:MM:SS。 开始时间戳不能包含时区信息。

  • target— 表示时间序列的浮点值或整数的数组。您可以将缺失值编码为null文本,或编码为 JSON 中的"NaN"字符串,或编码为 Parquet 中的nan浮点值。

  • dynamic_feat(可选)— 一个或多个表示自定义特征时间序列(动态特征)向量的浮点值或整数的数组。如果设置此字段,则所有记录必须具有相同数量的内部数组(相同数量的特征时间序列)。此外,每个内部数组的长度必须与关联target值加上下文的长度相同。特征中不支持缺少的值。例如,如果目标时间序列表示不同产品的需求,则关联的 dynamic_feat 可能是布尔时间序列,指示提升是应用于特定产品还是不应用于 (0):

    {"start": ..., "target": [1, 5, 10, 2], "dynamic_feat": [[0, 1, 1, 0]]}
  • cat(可选)— 可用于对记录所属的组进行编码的分类特征的数组。分类特征必须编码为0-based 开始的正整数序列。例如,分类域 {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 文件。

如果在无 catdynamic_feat 字段情况下训练该算法,则它学习一个“全局”模型,即跟推理时的目标时间序列的具体身份无关而仅以其形状为条件的模型。

如果模型以为每个时间序列提供的 catdynamic_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(Sum[i,t](y-hat(i,t)-y(i,t))^2)

yi,t 是时间序列 i 在时间 t 的 t 的 true 值。 i,t 是平均预测。和表示测试集中所有 n 个时间序列的总和,表示每个时间序列的上一个 ping 个时间点,其中 纵向对应于预测范围。您可以通过设置 prediction_length 超参数来指定预测范围的长度。有关更多信息,请参阅DeepAR 超参数.

此外,该算法使用加权分位数损失评估预测分布的准确度。对于范围为 [0, 1] 的分位数,加权分位数损失定义如下:


                分位数损失

qi,t(替换) 是模型预测的分布的分位数。要指定要计算其损失的分位数,请设置 test_quantiles 超参数。除了这些情况之外,所指定分位数损失的平均值也会作为训练日志的一部分报告。有关信息,请参阅 DeepAR 超参数.

对于推理, DeepAR 接受 JSON 格式和以下字段:

  • "instances",包括一个或多个采用 JSON 行格式的时间序列

  • 的名称"configuration",其中包括用于生成预测的参数

有关更多信息,请参阅DeepAR 推理格式.

使用DeepAR算法的最佳实践

在准备时间序列数据时,请遵循以下最佳实践以实现最佳结果:

  • 除了拆分数据集以进行训练和测试之外,始终提供用于训练、测试的整个时间序列以及调用模型进行推理。无论您如何设置 context_length,都不要拆分时间序列或仅提供时间序列的一部分。该模型使用数据点,这些数据点比context_length为滞后值功能设置的值更早。

  • 在优化DeepAR模型时,您可以拆分数据集以创建训练数据集和测试数据集。在典型评估中,您将对用于训练的相同时间序列测试模型,但对在训练期间可见的最后一个时间点之后prediction_length紧接着的未来时间点进行测试。您可以通过使用整个数据集(可用的所有时间序列的完整长度)作为测试集并从每个训练时间序列中删除最后prediction_length的点来创建满足此条件的训练和测试数据集。在训练期间,模型不会看到测试期间评估模型的时间点的目标值。在测试期间,算法保留测试集中每个时间序列的最后 prediction_length 个点并生成预测。然后,它将预测与预留值进行比较。您可以在测试集中多次重复时间序列,但在不同的终端节点处切割它们,从而创建更复杂的评估。使用此方法,对于来自不同时间点的多个预测,准确度指标的平均值。有关更多信息,请参阅优化DeepAR模型.

  • 避免对 使用非常大的值 prediction_length (>400),因为这会降低模型的速度和准确性。如果您想进一步预测将来的情况,请考虑以较低频率聚合数据。例如,使用 5min 而不是 1min

  • 由于使用了滞后,模型在时间序列中看起来可能比为 指定的值更靠后context_length。 因此,您不需要将此参数设置为较大的值。我们建议您从用于 的值开始prediction_length

  • 我们建议在尽可能多的时间序列上训练DeepAR模型。虽然在单个时间序列上训练的DeepAR模型可能正常工作,但标准预测算法(如 ARIMA 或 ETS)可能会提供更准确的结果。当数据集包含数百个相关时间序列时,DeepAR算法开始优于标准方法。目前, DeepAR 要求所有训练时间序列中可用的总观察数至少为 300。

DeepAR 算法的 EC2 实例建议

您可以在 GPU 和 CPU 实例DeepAR上以及在单机器和多机器设置中训练 。我们建议您从单个 CPU 实例(例如c42xlarge 或 c44xlarge开始,并仅在必要时切换到 GPU 实例和多台计算机。使用 GPUs 和多台机器只会提高较大模型(每层和层具有多个单元格)和大型小批量大小(例如,大于 512)的吞吐量。

对于推理, DeepAR 仅支持 CPU 实例。

context_lengthprediction_lengthnum_cellsnum_layers或 指定大型值mini_batch_size可能会创建对小型实例来说过大的模型。在这种情况下,请使用更大的实例类型或减少这些参数的值。在运行超参数优化作业时,也会频繁出现此问题。在这种情况下,请使用足够大的实例类型用于模型优化作业,并考虑限制关键参数的上值以避免作业失败。

DeepAR 示例笔记本

有关演示如何准备时间序列数据集用于训练SageMakerDeepAR算法以及如何部署训练后的模型来执行推理的示例笔记本,请参阅使用 - Synthetic 数据DeepAR进行时间序列预测以及用电量DeepAR演示数据集,这些示例说明了在真实世界数据集DeepAR上的高级功能。有关创建和访问可用于在 SageMaker 中运行示例的 Jupyter 笔记本实例的说明,请参阅使用 Amazon SageMaker 笔记本实例. 创建并打开笔记本实例后,选择 SageMaker Examples (示例) 选项卡以查看所有SageMaker示例的列表。要打开笔记本,请选择其 Use (使用) 选项卡,然后选择 Create copy (创建副本).