

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

# 用于时间序列数据的内置 SageMaker AI 算法
<a name="algorithms-time-series"></a>

SageMaker AI 提供为分析时间序列数据而量身定制的算法，可用于预测产品需求、服务器负载、网页请求等。
+ [使用 SageMaker AI Deepar 预测算法](deepar.md) – 一种有监督学习算法，可使用递归神经网络 (RNN) 来预测标量（一维）时间序列。


| 算法名称 | 渠道名称 | 训练输入模式 | 文件类型 | 实例类 | 可并行化 | 
| --- | --- | --- | --- | --- | --- | 
| DeepAR 预测 | 训练和 (可选) 测试 | 文件 | JSON 行或 Parquet | GPU 或 CPU | 是 | 

# 使用 SageMaker AI Deepar 预测算法
<a name="deepar"></a>

Amazon SageMaker AI Deepar 预测算法是一种监督学习算法，用于使用循环神经网络 (RNN) 预测标量（一维）时间序列。经典预测方法，如自回归积分滑动平均模型 (ARIMA) 或指数平滑法 (ETS)，会将一个模型拟合到各个单独的时间序列。然后使用该模型，将时间序列外推到未来。

但是，在很多应用中，您有跨一组具有代表性单元的多个相似时间序列。例如，您可以根据对不同产品、服务负载和网页请求的需求，将时间序列分组。对于这种类型的应用程序，您可以通过对所有时间序列共同训练单个模型中来受益。DeepAR 采用此方法。当您的数据集包含数百个相关的时间序列时，DeepAR 要优于标准 ARIMA 和 ETS 方法。您还可以使用训练过的模型来生成与已训练过的时间序列相似的新时间序列的预测。

DeepAR 算法的训练输入是一个或者（最好是）多个 `target` 时间序列，由同一进程或类似进程生成。基于此输入数据集，该算法训练一个模型，该模型学习其近似值， process/processes 并使用它来预测目标时间序列的演变方式。每个目标时间序列都可以选择关联一个由 `cat` 字段提供静态（与时间无关）分类特征向量，以及一个由 `dynamic_feat` 字段提供的动态（与时间相关）时间序列向量。 SageMaker AI 通过对训练数据集中每个目标时间序列的训练示例进行随机采样来训练 Deepar 模型。每个训练示例包括一对具有固定的预定义长度的相邻上下文和预测窗口。要控制网络可以向过去追溯的时间长度，请使用 `context_length` 超参数。要控制可以对未来进行预测的时间长度，请使用 `prediction_length` 超参数。有关更多信息，请参阅 [DeepAR 算法的工作方式](deepar_how-it-works.md)。

**Topics**
+ [DeepAR 算法的输入/输出接口](#deepar-inputoutput)
+ [使用 DeepAR 算法的最佳实践](#deepar_best_practices)
+ [DeepAR 算法的 EC2 实例建议](#deepar-instances)
+ [DeepAR 示例笔记本](#deepar-sample-notebooks)
+ [DeepAR 算法的工作方式](deepar_how-it-works.md)
+ [DeepAR 超参数](deepar_hyperparameters.md)
+ [调整 DeepAR 模型](deepar-tuning.md)
+ [DeepAR 推理格式](deepar-in-formats.md)

## DeepAR 算法的输入/输出接口
<a name="deepar-inputoutput"></a>

DeepAR 支持两种数据通道。必需的 `train` 通道描述训练数据集。可选的 `test` 通道描述在训练后，算法在评估模型准确性时使用的数据集。您可以通过 [JSON 行](http://jsonlines.org/)格式提供训练和测试数据集。文件还可以采用 gzip 或 [Parquet](https://parquet.apache.org/) 文件格式。

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

默认情况下，DeepAR 模型通过指定输入路径中的文件扩展名（`.json`、`.json.gz` 或 `.parquet`）确定输入格式。如果路径未以其中一个扩展名结束，则必须在 SDK for Python 中明确指定格式。使用 [s3\$1input](https://sagemaker.readthedocs.io/en/stable/session.html#sagemaker.session.s3_input) 类的 `content_type` 参数。

输入文件中的记录中应包含以下字段：
+ `start` – 格式为 `YYYY-MM-DD HH:MM:SS` 的字符串。开始时间戳不能包含时区信息。
+ `target` – 表示时间序列的浮点值或整数的数组。您可以将缺失的值编码为 `null` 文字，在 JSON 中作为 `"NaN"` 字符串，或者在 Parquet 中作为 `nan` 浮点值。
+ `dynamic_feat`（可选）– 表示自定义特征时间序列（动态特征）向量的浮点值或整数的一个或多个数组。如果设置此字段，则所有记录必须具有相同数量的内部数组（与特征时间序列数量相同）。此外，每个内部数组的长度必须与关联的 `target` 值加上 `prediction_length` 的长度相同。特征中不支持缺少的值。例如，如果目标时间序列代表对不同产品的需求，那么关联的 `dynamic_feat` 可能是布尔值时间序列，表示对特定产品应用了 (1) 还是没有应用 (0) 促销：

  ```
  {"start": ..., "target": [1, 5, 10, 2], "dynamic_feat": [[0, 1, 1, 0]]}
  ```
+ `cat`（可选）– 可用于对记录所属的组进行编码的分类特征的数组。分类特征必须编码为从 0 开始的正整数序列。例如，分类域 \$1R, G, B\$1 可以编码为 \$10, 1, 2\$1。每个分类域的所有值必须均存在于训练数据集中。这是因为 DeepAR 算法只能对训练期间观察到的类别进行预测。而且，每个分类特征都嵌入在低维度空间中，其维度由 `embedding_dimension` 超参数控制。有关更多信息，请参阅 [DeepAR 超参数](deepar_hyperparameters.md)。

如果您使用 JSON 文件，它必须采用 [JSON 行](http://jsonlines.org/)格式。例如：

```
{"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` 字段，则算法会自动使用它。所有时间序列必须具有相同数量的特征时间序列。每个特征时间序列中的时间点 one-to-one对应于目标中的时间点。此外，`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))\]](http://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/images/deepar-1.png)


*y**i*,*t* 是时间序列 *i* 在时间 *t* 的真实值。*ŷ**i*,*t* 是均值预测。总和基于测试集中的全部 *n* 个时间序列，并基于每个时间序列的最后 T 个时间点，其中 Τ 对应于预测期。您可以通过设置 `prediction_length` 超参数来指定预测期的长度。有关更多信息，请参阅 [DeepAR 超参数](deepar_hyperparameters.md)。

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

![\[加权分位数损失方程。\]](http://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/images/deepar-2.png)


 *q**i*,*t*(τ) 是模型预测的分布的 τ 分位数。如需指定要计算损失的分位数，请设置 `test_quantiles` 超参数。除此之外，在训练日志中，还报告了规定的分位数损失的平均值。有关信息，请参阅[DeepAR 超参数](deepar_hyperparameters.md)。

对于推理，DeepAR 接受 JSON 格式和以下字段：
+  `"instances"`，其中包括 JSON 行格式的一个或多个时间序列
+  `"configuration"` 的名称，其中包括用于生成预测的参数 

有关更多信息，请参阅 [DeepAR 推理格式](deepar-in-formats.md)。

## 使用 DeepAR 算法的最佳实践
<a name="deepar_best_practices"></a>

准备时间序列数据时，请遵循以下最佳实践以获得最佳结果：
+ 除了为训练和测试而拆分数据集之外，在训练、测试以及在调用模型进行推理时，请始终提供整个时间序列。无论您如何设置 `context_length`，都不要拆分时间序列或仅提供时间序列的一部分。对于滞后值特征，模型将使用比 `context_length` 中设置的值更早的数据点。
+ 对于 DeepAR 模型调整，您可以拆分数据集以创建训练数据集和测试数据集。在典型的评估中，您应该在训练所用的相同时间序列上，但在未来的 `prediction_length` 个时间点（紧跟训练期间可见的最后一个时间点）上测试模型。在训练期间，要创建满足此标准的训练和测试数据集，您可以使用整个数据集（所有可用时间序列的完整长度）作为测试集，并从每个时间序列中删除最后 `prediction_length` 个点来进行训练。在训练期间，模型将看不到所要评估的时间点的目标值。在测试期间，算法会保留测试数据集中每个时间序列的最后 `prediction_length` 个点并生成预测。然后将预测值与保留值进行比较。您可以在测试数据集中多次重复时间序列，但在不同的端点处切割它们，从而创建更复杂的评估。通过这种方法，将对不同时间点的多个预测取平均值来生成准确性指标。有关更多信息，请参阅 [调整 DeepAR 模型](deepar-tuning.md)。
+ 避免对 `prediction_length` 使用非常大的值（大于 400），因为这会降低模型的速度和准确性。如果您想进一步预测将来的情况，请考虑以较低的频率聚合数据。例如，使用 `5min` 而不是 `1min`。
+ 由于使了用滞后，模型可以向后追溯到比为 `context_length` 指定的值更早的时间序列。因此，您不必将此参数设置为较大的值。我们建议您从用于 `prediction_length` 的值开始。
+ 我们建议在尽可能多的时间序列上训练 DeepAR 模型。尽管在单个时间序列上训练的 DeepAR 模型可能正常工作，但标准预测方法（如 ARIMA 或 ETS）可能会提供更准确的结果。当数据集包含数百个相关时间序列时，DeepAR 算法便开始优于标准方法。目前，DeepAR 要求所有训练时间序列中可用的观察数据总数至少为 300。

## DeepAR 算法的 EC2 实例建议
<a name="deepar-instances"></a>

您可以在 GPU 和 CPU 实例上，在单机器和多机器设置中训练 DeepAR。我们建议您从单 CPU 实例开始（例如，ml.c4.2xlarge 或 ml.c4.4xlarge），并仅在必要时切换到 GPU 实例和多机器。只有在较大的模型（每层有许多单元 GPUs 和许多层）和较大的小批量（例如，大于 512）时，使用多台计算机才能提高吞吐量。

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

为 `context_length`、`prediction_length`、`num_cells`、`num_layers` 或者 `mini_batch_size` 指定较大的值，可能会创建对于小型实例来说太大的模型。在这种情况下，请使用较大的实例类型或减少这些参数的值。此问题在运行超参数调整作业时也会经常出现。在这种情况下，请为模型调整作业使用足够大的实例类型，并考虑限制关键参数的上限值以避免作业失败。

## DeepAR 示例笔记本
<a name="deepar-sample-notebooks"></a>

有关演示如何准备用于训练 SageMaker AI DeepAR 算法的时间序列数据集以及如何部署经过训练的模型进行推断的示例笔记本，请参阅[电力数据集上的 DeepAR 演示，其中说明了 DeepAR 在现实世界数据集上的](https://sagemaker-examples.readthedocs.io/en/latest/introduction_to_amazon_algorithms/deepar_electricity/DeepAR-Electricity.html)高级功能。有关创建和访问可用于在 SageMaker AI 中运行示例的 Jupyter 笔记本实例的说明，请参阅。[Amazon SageMaker 笔记本实例](nbi.md)创建并打开笔记本实例后，选择 **SageMaker AI 示例**选项卡以查看所有 SageMaker AI 示例的列表。要打开笔记本，请选择其 **Use (使用)** 选项卡，然后选择 **Create copy (创建副本)**。

有关 Amazon A SageMaker I Deepar 算法的更多信息，请参阅以下博客文章：
+ [现已在 Amazon A SageMaker I：Deepar 算法中推出，可实现更准确的时间序列预测](https://aws.amazon.com/blogs/machine-learning/now-available-in-amazon-sagemaker-deepar-algorithm-for-more-accurate-time-series-forecasting/)
+ [使用 Amazon A SageMaker I 进行深度需求预测](https://aws.amazon.com/blogs/machine-learning/deep-demand-forecasting-with-amazon-sagemaker/)

# DeepAR 算法的工作方式
<a name="deepar_how-it-works"></a>

在训练过程中，DeepAR 接受训练数据集和可选的测试数据集。它将使用测试数据集评估训练后的模型。通常，数据集不必包含相同的时间序列集。您可以使用在给定训练集上训练的模型来生成训练集中时间序列的未来以及其他时间序列的预测。训练数据集和测试数据集都由一个或（最好是）多个目标时间序列组成。每个目标时间序列可以选择关联到一个特征时间序列向量和一个分类特征向量。有关更多信息，请参阅 [DeepAR 算法的输入/输出接口](deepar.md#deepar-inputoutput)。

例如，以下是用 *i* 编制索引的训练数据集元素，其中包含一个目标时间序列 *Zi,t*，以及两个关联的特征时间序列 *Xi,1,t* 和 *Xi,2,t*：

![\[图 1：目标时间序列和关联的特征时间序列\]](http://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/images/ts-full-159.base.png)


目标时间序列可能包含缺失值，这些值由时间系列中的换行符表示。DeepAR 仅支持将来已知的特征时间序列。这让您可以运行“假设” 场景。例如，如果我以某种方式改变产品价格，会发生什么？ 

每个目标时间序列也可以与大量分类特征关联。您可以使用这些特征对时间序列所属的特定分组进行编码。通过分类特征，模型可以学习这些分组的典型行为，这可以提高准确性。为了实施此功能，DeepAR 对各个组的嵌入向量进行学习，这些向量收集了组中所有时间序列的通用属性。

## DeepAR 算法中特征时间序列的工作方式
<a name="deepar_under-the-hood"></a>

为了推动学习与时间相关的模式（如周末的峰值），DeepAR 根据目标时间序列的频率，自动创建特征时间序列。它将这些派生的特征时间序列，与您在训练和推理期间提供的自定义特征时间序列结合使用。下图显示了这样两个派生的时间序列特征：*ui,1,t* 表示一天中的几点，*ui,2,t* 表示一周中的某天。

![\[图 2：派生时间序列\]](http://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/images/ts-full-159.derived.png)


DeepAR 算法会自动生成这些特征时间序列。下表列出了可为支持的基本时间频率派生的特征。


| 时间序列的频率 | 派生的特征 | 
| --- | --- | 
| Minute |  `minute-of-hour`, `hour-of-day`, `day-of-week`, `day-of-month`, `day-of-year`  | 
| Hour |  `hour-of-day`, `day-of-week`, `day-of-month`, `day-of-year`  | 
| Day |  `day-of-week`, `day-of-month`, `day-of-year`  | 
| Week |  `day-of-month`, `week-of-year`  | 
| Month |  month-of-year  | 

DeepAR 从训练数据集中的每个时间序列中随机抽取多个训练示例来训练模型。每个训练示例包括一对具有固定的预定义长度的相邻上下文和预测窗口。`context_length` 超参数控制网络可以向过去追溯的时间长度，`prediction_length` 参数控制可以对未来进行预测的时间长度。在训练过程中，如果训练集元素包含的时间序列要短于指定的预测时间长度，则忽略该元素。下图显示了从元素 *i* 中提取的 5 个示例，其中上下文长度为 12 个小时，预测长度为 6 个小时。为简单起见，我们省略了特征时间序列 *xi,1,t* 和 *ui,2,t*。

![\[图 3：采样时间序列\]](http://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/images/ts-full-159.sampled.png)


为了捕获季节性模式，DeepAR 还自动提供目标时间序列中的滞后值。在我们的以小时频率采样的示例中，对于每个时间索引 *t = T*，模型会公开 *zi,t* 值，过去大约 1 天、2 天和 3 天执行此操作一次。

![\[图 4：滞后的时间序列\]](http://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/images/ts-full-159.lags.png)


对于推理，训练后的模型获取输入目标时间序列（这些时间序列在训练期间可能已使用，也可能未使用），并预测后续的 `prediction_length` 值的概率分布。由于 DeepAR 是在整个数据集上进行训练的，因此，预测会考虑从类似时间序列中学习的模式。

有关 DeepAR 数学运算背景的更多信息，请参阅 [DeepAR：概率性预测与自回归递归网络](https://arxiv.org/abs/1704.04110)。

# DeepAR 超参数
<a name="deepar_hyperparameters"></a>

下表列出了在使用 Amazon A SageMaker I Deepar 预测算法进行训练时可以设置的超参数。


| 参数名称 | 说明 | 
| --- | --- | 
| context\$1length |  在进行预测之前，模型需要获取查看的时间点数量。此参数的值应该与 `prediction_length` 大致相同。此模型还接收来自目标的滞后输入，因此 `context_length` 可以比典型的季节性小得多。例如，每日时间序列可以具有每年的季节性。模型自动包括一年的滞后，因此上下文长度可以短于一年。模型选取的滞后值取决于时间序列的频率。例如，每日频率的滞后值为：前 1 周、2 周、3 周、4 周和 1 年。 **必填** 有效值：正整数  | 
| epochs |  扫描训练数据的最大次数。最佳值取决于您的数据大小和学习率。另请参阅`early_stopping_patience`。典型值范围为 10 到 1000。 **必填** 有效值：正整数  | 
| prediction\$1length |  训练模型来预测的时间步长数，也称为预测期。训练后的模型始终生成此长度的预测。它无法生成更长的预测。在训练模型时，`prediction_length` 是固定的，以后无法更改。 **必填** 有效值：正整数  | 
| time\$1freq |  数据集中时间序列的粒度。使用 `time_freq` 选择适当的日期特征和滞后。该模型支持以下基本频率。它还支持这些基本频率的倍数。例如，`5min` 指定 5 分钟的频率。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/deepar_hyperparameters.html) **必填** 有效值：一个整数，后跟 *M*、*W*、*D*、*H* 或 *min*。例如，`5min`。  | 
| cardinality |  在使用分类特征 (`cat`) 时，`cardinality` 是一个数组，指定每个分类特征的类别（组）数。将此项设置为 `auto` 可从数据中推理基数。在数据集中未使用分类特征时，`auto` 模式也适用。这是该参数的推荐设置。 将基数设置为 `ignore` 可强制 DeepAR 不使用分类特征，即使数据中存在分类特征。 要执行额外的数据验证，可以将此参数明确设置为实际值。例如，如果提供了两个分类特征，第一个有 2 个可能值，另一个有 3 个可能值，则将此项设置为 [2, 3]。 有关如何使用分类特征的更多信息，请参阅 DeepAR 主文档页面上的数据部分。 **可选** 有效值：`auto`、`ignore`、正整数数组、空字符串或  默认值：`auto`  | 
| dropout\$1rate |  训练期间使用的丢弃比率。该模型使用 zoneout 正则化。对于每次迭代，不更新隐藏神经元的随机子集。典型值小于 0.2。 **可选** 有效值：浮点值 默认值：0.1  | 
| early\$1stopping\$1patience |  如果设置此参数，则在指定的 `epochs` 次数后没有取得进展时，训练将停止。返回具有最低损失的模型作为最后的模型。 **可选** 有效值：整数  | 
| embedding\$1dimension |  每个分类特征学习的嵌入向量的大小（对所有分类特征使用相同的值）。 在提供了分类分组特征时，DeepAR 模型可以学习组级别的时间序列模式。为此，模型学习每个组大小为 `embedding_dimension` 的嵌入向量，该向量捕获组中所有时间序列的通用属性。较大的 `embedding_dimension` 允许模式捕获更复杂的模式。但是，由于增加 `embedding_dimension` 会增加模型中的参数数量，准确学习这些参数需要更多训练数据。此参数的典型值在 10 至 100 之间。 **可选** 有效值：正整数 默认值：10  | 
| learning\$1rate |  训练中使用的学习率。典型值范围从 1e-4 到 1e-1。 **可选** 有效值：浮点值 默认值：1e-3  | 
| likelihood |  模型生成一个概率预测，并可以提供分布的分位数和返回样本。根据您的数据，选择用于不确定性估算的相应可能性（噪声模型）。可以选择以下可能性： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/deepar_hyperparameters.html) **可选** 有效值：*gaussian (高斯)*、*beta*、*negative-binomial (负二项式)*、*student-T (T 检验)* 或 *deterministic-L1 (确定性 L1)* 之一。 默认值：`student-T`  | 
| mini\$1batch\$1size |  训练期间使用的小批次的大小。典型值范围为 32 到 512。 **可选** 有效值：正整数 默认值：128  | 
| num\$1cells |  RNN 的各个隐藏层中使用的单元数。典型值范围为 30 到 100。 **可选** 有效值：正整数 默认值：40  | 
| num\$1dynamic\$1feat |  `dynamic_feat` 的数量在数据中提供。将此项设置为 `auto` 可从数据中推理动态特征的数量。在数据集中未使用动态特征时，`auto` 模式也适用。这是该参数的推荐设置。 要强制 DeepAR 不使用动态特征（即使数据中存在动态特征），请将 `num_dynamic_feat` 设置为 `ignore`。 要执行额外的数据验证，可以将此参数明确设置为实际整数值。例如，如果提供了两个动态特征，则将此项设置为 2。 **可选** 有效值：`auto`、`ignore`、正整数或空字符串 默认值：`auto`  | 
| num\$1eval\$1samples |  在计算测试准确性指标时，每个时间序列使用的样本数量。此参数对训练或最终模型没有任何影响。具体而言，可以使用不同数量的样本来查询模型。此参数仅影响训练后测试通道上报告的准确性分数。值越小，评估越快，但评估分数通常会更差且更不确定。当使用更高的分位数（例如 0.95）进行评估时，增加评估样本的数量可能会非常重要。 **可选** 有效值：整数 默认值：100  | 
| num\$1layers |  RNN 中的隐藏层数。典型值范围为 1 到 4。 **可选** 有效值：正整数 默认值：2  | 
| test\$1quantiles |  用于计算测试通道上的分位数损失的分位数。 **可选** 有效值：浮点数数组 默认值：[0.1、0.2、0.3、0.4、0.5、0.6、0.7、0.8、0.9]  | 

# 调整 DeepAR 模型
<a name="deepar-tuning"></a>

*自动模型优化*（也称作超参数优化）通过运行很多在数据集上测试一系列超参数的作业来查找模型的最佳版本。您可以选择可优化超参数、每个超参数的值范围和一个目标指标。您可以从算法计算的指标中选择目标指标。自动模型优化将搜索所选超参数以找到导致优化目标指标的模型的值组合。

有关模型优化的更多信息，请参阅[使用 SageMaker AI 自动调整模型](automatic-model-tuning.md)。

## DeepAR 算法计算的指标
<a name="deepar-metrics"></a>

DeepAR 算法报告在训练期间计算的三个指标。在调整模型时，请选择这些指标之一作为目标指标。对于目标，请使用所提供测试通道上的预测准确性（推荐）或训练损失。有关 Deepar 算法的 training/test 拆分建议，请参阅。[使用 DeepAR 算法的最佳实践](deepar.md#deepar_best_practices)


| 指标名称 | 说明 | 优化方向 | 
| --- | --- | --- | 
| test:RMSE |  在测试集上计算的预测与实际目标之间的均方根误差。  |  最小化  | 
| test:mean\$1wQuantileLoss |  在测试集上计算出的平均总体分位数损失。要控制使用什么分位数，请设置 `test_quantiles` 超参数。  |  最小化  | 
| train:final\$1loss |  训练负对数似然损失，对模型在上一个训练纪元取平均值。  |  最小化  | 

## DeepAR 算法的可调整超参数。
<a name="deepar-tunable-hyperparameters"></a>

使用以下超参数调整 DeepAR 模型。对 DeepAR 目标指标产生最大影响的超参数（从影响最大到最小的顺序列出）包括：`epochs`、`context_length`、`mini_batch_size`、`learning_rate` 和 `num_cells`。


| 参数名称 | 参数类型 | 建议的范围 | 
| --- | --- | --- | 
| epochs |  `IntegerParameterRanges`  |  MinValue: 1, MaxValue: 1000  | 
| context\$1length |  `IntegerParameterRanges`  |  MinValue: 1, MaxValue: 200  | 
| mini\$1batch\$1size |  `IntegerParameterRanges`  |  MinValue: 32， MaxValue: 1028  | 
| learning\$1rate |  `ContinuousParameterRange`  |  MinValue: 1e-5， MaxValue: 1e-1  | 
| num\$1cells |  `IntegerParameterRanges`  |  MinValue: 30， MaxValue: 200  | 
| num\$1layers |  `IntegerParameterRanges`  |  MinValue: 1, MaxValue: 8  | 
| dropout\$1rate |  `ContinuousParameterRange`  |  MinValue: 0.00， MaxValue: 0.2  | 
| embedding\$1dimension |  `IntegerParameterRanges`  |  MinValue: 1, MaxValue: 50  | 

# DeepAR 推理格式
<a name="deepar-in-formats"></a>

以下页面描述了使用 Amazon A SageMaker I Deepar 模型进行推理的请求和响应格式。

## DeepAR JSON 请求格式
<a name="deepar-json-request"></a>

使用模型的终端节点查询经过训练的模型。终端节点采用以下 JSON 请求格式。

在请求中，`instances` 字段对应于应由模型预测的时间序列。

如果模型通过类别进行训练，则您必须为每个实例提供 `cat`。如果模型训练时未使用 `cat` 字段，则可以省略。

如果模型使用自定义特征时间序列 (`dynamic_feat`) 进行训练，则您必须为每个实例提供相同数量的 `dynamic_feat`。每个值都应具有 `length(target) + prediction_length` 给出的长度，最后一个 `prediction_length` 值与将要预测的未来时间点相对应。如果模型在没有自定义特征时间序列的情况下训练，则该字段不应包括在请求中。

```
{
    "instances": [
        {
            "start": "2009-11-01 00:00:00",
            "target": [4.0, 10.0, "NaN", 100.0, 113.0],
            "cat": [0, 1],
            "dynamic_feat": [[1.0, 1.1, 2.1, 0.5, 3.1, 4.1, 1.2, 5.0, ...]]
        },
        {
            "start": "2012-01-30",
            "target": [1.0],
            "cat": [2, 1],
            "dynamic_feat": [[2.0, 3.1, 4.5, 1.5, 1.8, 3.2, 0.1, 3.0, ...]]
        },
        {
            "start": "1999-01-30",
            "target": [2.0, 1.0],
            "cat": [1, 3],
            "dynamic_feat": [[1.0, 0.1, -2.5, 0.3, 2.0, -1.2, -0.1, -3.0, ...]]
        }
    ],
    "configuration": {
         "num_samples": 50,
         "output_types": ["mean", "quantiles", "samples"],
         "quantiles": ["0.5", "0.9"]
    }
}
```

`configuration` 字段可选。`configuration.num_samples` 设置模型为估计均值和分位数生成的样本路径数。`configuration.output_types` 描述了将在请求中返回的信息。有效值为 `"mean"`、`"quantiles"` 和 `"samples"`。如果您指定 `"quantiles"`，则返回 `configuration.quantiles` 中的每个分位数值作为时间序列。如果您指定 `"samples"`，则模型还将返回用于计算其他输出的原始样本。

## DeepAR JSON 响应格式
<a name="deepar-json-response"></a>

以下是响应的格式，其中 `[...]` 是数字数组：

```
{
    "predictions": [
        {
            "quantiles": {
                "0.9": [...],
                "0.5": [...]
            },
            "samples": [...],
            "mean": [...]
        },
        {
            "quantiles": {
                "0.9": [...],
                "0.5": [...]
            },
            "samples": [...],
            "mean": [...]
        },
        {
            "quantiles": {
                "0.9": [...],
                "0.5": [...]
            },
            "samples": [...],
            "mean": [...]
        }
    ]
}
```

DeepAR 的响应超时为 60 秒。在单个请求中传递多个时间序列时，将按顺序生成预测。由于每个时间序列的预测通常需要大约 300 至 1000 毫秒甚至更长（具体取决于模型大小），因此在单个请求中传递太多的时间序列可能会导致超时。最好是减少每个请求发送的时间序列数量并发送更多的请求。由于 DeepAR 算法的每个实例使用多个工作线程，您可以通过并行发送多个请求来实现更高的吞吐量。

默认情况下，如果每个 CPU 有足够的内存，DeepAR 为每个工作线程使用一个 CPU 进行推理。如果模型很大，并且没有足够的内存来在每个 CPU 上运行模型，则会减少工作线程的数量。在调用 AI AP SageMaker I [https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateModel.html](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateModel.html)时，可以使用环境变量（例如，通过设置`MODEL_SERVER_WORKERS=1`）覆盖`MODEL_SERVER_WORKERS`用于推理的工作程序数量。

## 批量转换与 DeepAR 算法
<a name="deepar-batch"></a>

DeepAR 预测支持对 JSON 行格式的数据，使用批量转换来获取推理。在此格式中，每条记录在一个行上表示为 JSON 对象，并且行由换行符分隔。该格式与用于模型训练的 JSON 行格式相同。有关信息，请参阅[DeepAR 算法的输入/输出接口](deepar.md#deepar-inputoutput)。例如：

```
{"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]]}
```

**注意**  
在使用 [https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTransformJob.html](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTransformJob.html) 创建转换作业时，将 `BatchStrategy` 值设置为 `SingleRecord` 并将[https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_TransformInput.html](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_TransformInput.html) 配置中的 `SplitType` 值设置为 `Line`，因为默认值当前会导致运行时故障。

与托管终端节点推理请求格式类似，如果满足以下两个条件，则每个实例的 `cat` 和 `dynamic_feat` 字段都是必填的：
+ 模型在同时包含 `cat` 和 `dynamic_feat` 字段的数据集上训练。
+ 训练作业中使用的对应 `cardinality` 和 `num_dynamic_feat` 值未设置为 `"".`

与托管终端节点推理不同，使用名为 `DEEPAR_INFERENCE_CONFIG` 的环境变量为整个批量推理作业设置一次配置字段。在通过调用 [https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTransformJob.html](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTransformJob.html) API 创建模型时，可以传递 `DEEPAR_INFERENCE_CONFIG` 的值。如果容器环境中缺少 `DEEPAR_INFERENCE_CONFIG`，则推理容器使用以下默认值：

```
{
    "num_samples": 100,
    "output_types": ["mean", "quantiles"],
    "quantiles": ["0.1", "0.2", "0.3", "0.4", "0.5", "0.6", "0.7", "0.8", "0.9"]
}
```

输出也采用 JSON 行格式，每个预测对应一行，其顺序与相应输入文件中的实例顺序相同。对预测进行编码所用的格式，需要与在线推理模式中响应返回的对象格式相同。例如：

```
{ "quantiles": { "0.1": [...], "0.2": [...] }, "samples": [...], "mean": [...] }
```

请注意，在 SageMaker AI [https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTransformJob.html](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTransformJob.html)请求的[https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_TransformInput.html](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_TransformInput.html)配置中，客户端必须将该`AssembleWith`值显式设置为`Line`，因为默认值`None`会将所有 JSON 对象连接在同一行上。

例如，以下是针对带有自定义的 Deepar 任务的 A SageMaker I [https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTransformJob.html](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTransformJob.html)请求：`DEEPAR_INFERENCE_CONFIG`

```
{
   "BatchStrategy": "SingleRecord",
   "Environment": { 
      "DEEPAR_INFERENCE_CONFIG" : "{ \"num_samples\": 200, \"output_types\": [\"mean\"] }",
      ...
   },
   "TransformInput": {
      "SplitType": "Line",
      ...
   },
   "TransformOutput": { 
      "AssembleWith": "Line",
      ...
   },
   ...
}
```