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

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

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 将使用目录中的所有文件作为相应频道的输入,但以句点 (.) 开头的文件和名为_ 成功. 这样可以确保您可以直接使用 Spark 作业生成的输出文件夹作为 Deepar 训练作业的输入通道。

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

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

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

  • target-表示时间序列的浮点值或整数的数组。您可以将缺少的值编码为null文字,或作为"NaN"字符串,或作为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 文件。

如果在无 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)) ^2))

yi,t是时间序列的真实值i在当时t.ŷi,t是平均预测。总和是超过所有n时间序列和每个时间序列的最后时间点,其中对应于预测期。您可以通过设置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 模型

  • 避免对使用非常大的值(大于 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_lengthprediction_lengthnum_cellsnum_layers,或者mini_batch_size可以创建对于小型实例来说太大的模型。在这种情况下,请使用较大的实例类型或减少这些参数的值。运行超参数优化作业时,也经常出现此问题。在这种情况下,使用足够大的实例类型进行模型调整作业,并考虑限制关键参数的上限值,以避免作业失败。

DeepAR 示例笔记本

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