

 Amazon Forecast 不再向新买家开放。Amazon Forecast 的现有客户可以继续照常使用该服务。[了解更多](https://aws.amazon.com/blogs/machine-learning/transition-your-amazon-forecast-usage-to-amazon-sagemaker-canvas/)

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

# 入门 (AWS CLI)
<a name="gs-cli"></a>

在本练习中，您将使用 AWS Command Line Interface (AWS CLI) 来浏览 Amazon Forecast。您将创建 Amazon Forecast 数据集、训练预测器并使用生成的预测器生成预测。开始之前，请确保您已经有 AWS 账户 并且已设置 AWS CLI。有关更多信息，请参阅 [设置](setup.md)。

**注意**  
本练习中的 AWS CLI 命令已在 Linux 上进行了测试。有关在 Windows 上使用 AWS CLI 命令的信息，请参阅*AWS Command Line Interface 用户指南 AWS Command Line Interface*[中的为指定参数值](https://docs.aws.amazon.com/cli/latest/userguide/cli-using-param.html)。

## 步骤 1：导入训练数据
<a name="gs-create-ds"></a>

首先创建数据集并将用电量数据导入其中。

**创建 Amazon Forecast 数据集**

1. 确定哪些域和数据集类型合适。

   您将导入数据集的训练数据会影响您选择的数据集域和类型。现在，让我们看一看用电量数据的一些示例行。

   ```
   2014-01-01 01:00:00,   2.53807106598985, client_0
   2014-01-01 01:00:00, 23.648648648648624, client_1
   2014-01-01 02:00:00,  9.648648648612345, client_0
   ```

   数据格式为 CSV（逗号分隔值），数据每小时收集一次（如时间戳所示）。它包含以下列：
   + 列 1 – 记录用电量时显示的时间戳。
   + 列 2 – 每小时用电量值（请注意时间戳值按小时增加的方式）。
   + 列 3 – 标识使用电力的客户的客户端 ID 值。

   对于此数据，请选择以下预定义的数据集域和数据集类型：
   + 自定义域 – METRICS、RETAIL 或 WEB\$1TRAFFIC 等数据集域均不适用于此数据，因此请选择自定义域。
   + 目标时间序列类型 – 该数据是时间序列，因为它跟踪用电量随时间的变化情况。它还包含我们要预测的*目标*（列 2，用电量）。因此，请选择目标时间序列数据集类型。

     要了解您为何选择此类型，请参阅[预定义数据集域和数据集类型](howitworks-domains-ds-types.md)。

1. 确定数据集架构。

   针对 [CUSTOM 域](custom-domain.md)的目标时间序列类型需要以下字段：`timestamp`、`target_value` 和 `item_id`。`target_value` 字段为目标。Amazon Forecast 为该字段生成预测。

   要将必填字段映射到您数据中的列，您应创建架构。架构中的每个*属性*都映射到数据中的一个字段。
**重要**  
架构中属性的顺序必须与训练数据中字段的顺序匹配。

   ```
   {
     "Attributes":[
       {
          "AttributeName": "timestamp",
          "AttributeType": "timestamp"
       },
       {
          "AttributeName": "target_value",
          "AttributeType": "float"
       },
       {
          "AttributeName": "item_id",
          "AttributeType": "string"
       }
     ]
   }
   ```

   现在，您具有创建数据集并将数据导入其中所需的信息。

1. 创建数据集。

   ```
   aws forecast create-dataset \
   --dataset-name electricity_demand_ds \
   --domain CUSTOM \
   --dataset-type TARGET_TIME_SERIES \
   --data-frequency H \
   --schema '{
     "Attributes": [
       {
         "AttributeName": "timestamp",
         "AttributeType": "timestamp"
       },
       {
         "AttributeName": "target_value",
         "AttributeType": "float"
       },
       {
         "AttributeName": "item_id",
         "AttributeType": "string"
       }
     ]
   }'
   ```

   在请求中，`data-frequency` 值 `H` 表示每小时的数据收集频率。以下为响应示例。

   ```
   {
       "DatasetArn": "arn:aws:forecast:us-west-2:acct-id:dataset/electricity_demand_ds"
   }
   ```

   有关此操作的更多信息，请参阅[CreateDataset](API_CreateDataset.md)。

1. （可选）获取数据集的描述。

   ```
   aws forecast describe-dataset \
   --dataset-arn arn:aws:forecast:us-west-2:acct-id:dataset/electricity_demand_ds
   ```

   以下为响应示例。

   ```
   {
       "DatasetName": "electricity_demand_ds",
       "DatasetArn": "arn:aws:forecast:us-west-2:acct-id:dataset/electricity_demand_ds",
       "CreationTime": 1564533087.907,
       "LastModificationTime": 1564533087.907,
       "Domain": "CUSTOM",
       "DatasetType": "TARGET_TIME_SERIES",
       "DataFrequency": "H",
       "Schema": { ... },
       "EncryptionConfig": {},
       "Status": "ACTIVE"
   }
   ```
**注意**  
响应中密钥值对的顺序是任意的。

1. 创建数据集组并向该组添加数据集。`domain` 参数的值必须与数据集的 `domain` 相匹配。

   ```
   aws forecast create-dataset-group \
   --dataset-group-name electricity_ds_group \
   --dataset-arns arn:aws:forecast:us-west-2:acct-id:dataset/electricity_demand_ds \
   --domain CUSTOM
   ```

   以下为响应示例。

   ```
   {
       "DatasetGroupArn": "arn:aws:forecast:us-west-2:acct-id:dataset-group/electricity_ds_group"
   }
   ```

   有关此操作的更多信息，请参阅[CreateDatasetGroup](API_CreateDatasetGroup.md)。

1. （可选）获取数据集组的描述。

   ```
   aws forecast describe-dataset-group \
   --dataset-group-arn arn:aws:forecast:us-west-2:acct-id:dataset-group/electricity_ds_group
   ```

   以下为响应示例。

   ```
   {
       "DatasetGroupName": "electricity_ds_group",
       "DatasetGroupArn": "arn:aws:forecast:us-west-2:acct-id:dataset-group/electricity_ds_group",
       "DatasetArns": [
           "arn:aws:forecast:us-west-2:acct-id:dataset-group/electricity_ds_group"
       ],
       "Domain": "CUSTOM",
       "CreationTime": 1564533719.852,
       "LastModificationTime": 1564533719.852,
       "Status": "ACTIVE"
   }
   ```

1. 将用电量训练数据从您的 Amazon S3 存储桶导入数据集。您提供的 IAM 角色必须有权从您的 S3 存储桶读取数据。有关如何创建 IAM 角色的信息，请参阅 [为 Amazon Forecast 创建 IAM 角色 (AWS CLI)](aws-forecast-iam-roles.md#aws-forecast-create-iam-role-with-cli)。

   ```
   aws forecast create-dataset-import-job \
   --dataset-arn arn:aws:forecast:us-west-2:acct-id:dataset/electricity_demand_ds \
   --dataset-import-job-name electricity_ds_import_job \
   --data-source '{
       "S3Config": {
         "Path": "s3://bucket/electricityusagedata.csv",
         "RoleArn": "arn:aws:iam::acct-id:role/Role"
       }
     }'
   ```

   以下是 `data-source` 参数的缩写语法。

   ```
   --data-source S3Config="{Path='s3://bucket/electricityusagedata.csv',RoleArn='arn:aws:iam::acct-id:role/Role'}"
   ```

   以下为响应示例。

   ```
   {
       "DatasetImportJobArn": "arn:aws:forecast:us-west-2:acct-id:dataset-import-job/electricity_demand_ds/electricity_ds_import_job"
   }
   ```

   有关此操作的更多信息，请参阅[CreateDatasetImportJob](API_CreateDatasetImportJob.md)。

1. 检查导入状态。

   ```
   aws forecast describe-dataset-import-job \
   --dataset-import-job-arn arn:aws:forecast:us-west-2:acct-id:dataset-import-job/electricity_demand_ds/electricity_ds_import_job
   ```

   以下为响应示例。

   ```
   {
       "DatasetImportJobName": "electricity_ds_import_job",
       "DatasetImportJobArn": "arn:aws:forecast:us-west-2:acct-id:dataset-import-job/electricity_demand_ds/electricity_ds_import_job",
       "DatasetArn": "arn:aws:forecast:us-west-2:acct-id:dataset/electricity_demand_ds",
       "DataSource": {
           "S3Config": {
               "Path": "s3://bucket/electricityusagedata.csv",
               "RoleArn": "arn:aws:iam::acct-id:role/ForecastRole"
           }
       },
       "DataSize": 0.14639010466635227,
       "TimeStampFormat": "yyyy-MM-dd HH:mm:ss",
       "CreationTime":  1564537011.114,
       "LastModificationTime": 1564537028.223,
       "Status": "CREATE_IN_PROGRESS"
   }
   ```

   当所有数据已导入时，状态将变为 ACTIVE 并且响应将包含这些数据的统计信息，如以下示例所示。

   ```
   {
       "DatasetArn": "arn:aws:forecast:us-west-2:acct-id:dataset/electricity_demand_ds",
       "Status": "ACTIVE",
       "FieldStatistics": {
           "date": {
               "Min": "2014-01-01T01:00:00Z",
               "Max": "2015-01-01T00:00:00Z",
               "Count": 3241200,
               "CountDistinct": 8760,
               "CountNull": 0
           },
           "target": {
               "Min": "0.0",
               "Max": "168200.0",
               "Avg": 606.5167610461679,
               "Stddev": 3518.405223972031,
               "Count": 3241200,
               "CountDistinct": 1196961,
               "CountNull": 0,
               "CountNan": 0
           },
           "item": {
               "Count": 3241200,
               "CountDistinct": 370,
               "CountNull": 0
           }
       },
       ...
   }
   ```
**重要**  
您必须等到状态变为 ACTIVE，然后再使用数据集组创建预测。

   有关此操作的更多信息，请参阅[DescribeDatasetImportJob](API_DescribeDatasetImportJob.md)。

## 步骤 2：创建预测器
<a name="gs-create-predictor"></a>

要创建预测器，请使用[CreateAutoPredictor](API_CreateAutoPredictor.md)操作并提供以下信息。
+ **预测器名称** - 为预测器命名，以便您可以将其与其他预测器区分开来
+ **数据集组** - 您在上述步骤中创建了该数据集组。
+ **预测频率** - 预测的粒度（每小时、每天、每周等）。
+ **预测范围** - 预测的时间步数。

创建预测器后，您将检查 Amazon Forecast 生成的准确性指标。这些指标可帮助您决定是否使用预测器来生成预测。有关预测器的更多信息，请参阅[训练预测器](howitworks-predictor.md)。

**创建预测器并检查准确性指标**

1. 创建预测器。

   ```
   aws forecast create-predictor \
   --predictor-name electricitypredictor \
   --input-data-config DatasetGroupArn="arn:aws:forecast:us-west-2:acct-id:dsgroup/electricity_ds_group" \
   --forecast-horizon 36 \
   --forecast-frequency D
   ```

   以下为响应示例。

   ```
   {
       "PredictorArn": "arn:aws:forecast:us-west-2:acct-id:predictor/electricitypredictor"
   }
   ```

1. 获取预测器的状态。

   ```
   aws forecast describe-predictor \
   --predictor-arn arn:aws:forecast:us-west-2:acct-id:predictor/electricitypredictor
   ```

   以下为响应示例。

   ```
   {
       "PredictorArn": "arn:aws:forecast:<region>:<acct-num>:predictor/electricitypredictor",
       "PredictorName": "electricitypredictor",
       "ForecastHorizon": 36,
       "ForecastTypes": [
           "0.1",
           "0.5",
           "0.9"
       ],
       "ForecastFrequency": "D",
       "DatasetImportJobArns": [
           "arn:aws:forecast:<region>:<acct-num>:dataset-import-job/getting_started_dataset/gs_import"
       ],
       "DataConfig": {
           "DatasetGroupArn": "arn:aws:forecast:<region>:<acct-num>:dataset-group/getting_started",
           "AttributeConfigs": [
               {
                   "AttributeName": "target_value",
                   "Transformations": {
                       "aggregation": "sum",
                       "backfill": "zero",
                       "frontfill": "none",
                       "middlefill": "zero"
                   }
               }
           ]
       },
       "EstimatedTimeRemainingInMinutes": 97,
       "Status": "CREATE_IN_PROGRESS",
       "CreationTime": "2022-02-23T09:26:24.643000-08:00",
       "LastModificationTime": "2022-02-23T09:49:26.899000-08:00",
       "ExplainabilityInfo": {
           "Status": "NOT_AVAILABLE"
       }
   }
   ```
**重要**  
模型训练需要时间。在训练完成且预测器的状态变为 ACTIVE 之前，请勿继续操作。

1. 获取预测器的准确性指标。

   ```
   aws forecast get-accuracy-metrics \
   --predictor-arn arn:aws:forecast:us-west-2:acct-id:predictor/electricitypredictor
   ```

   以下为响应示例。

   ```
   {
       "PredictorEvaluationResults": [
           {
               "TestWindows": [
                   {
                       "EvaluationType": "SUMMARY",
                       "Metrics": {
                           "RMSE": 448.19602551622864,
                           "WeightedQuantileLosses": [
                               {
                                   "Quantile": 0.9,
                                   "LossValue": 0.11574311406253326
                               },
                               {
                                   "Quantile": 0.5,
                                   "LossValue": 0.1706269067283527
                               },
                               {
                                   "Quantile": 0.1,
                                   "LossValue": 0.11724164222477837
                               }
                           ]
                       }
                   },
                   {
                       "EvaluationType": "COMPUTED",
                       "Metrics": {
                           "RMSE": 448.19602551622864,
                           "WeightedQuantileLosses": [
                               {
                                   "Quantile": 0.9,
                                   "LossValue": 0.11574311406253326
                               },
                               {
                                   "Quantile": 0.5,
                                   "LossValue": 0.1706269067283527
                               },
                               {
                                   "Quantile": 0.1,
                                   "LossValue": 0.11724164222477837
                               }
                           ]
                       },
                       "TestWindowEnd":   1420070400.0,
                       "TestWindowStart": 1420002000.0
                   }
               ]
           }
       ]
   }
   ```

   这些指标显示每个分位数的误差损失。例如，第一个分位数的误差为 11.7%。指标还会显示 root-mean-square错误 (`RMSE`)。

   汇总指标显示所有测试窗口上的计算指标的平均值。由于只有一个测试窗口，因此汇总指标和计算指标相等。

   有关此操作的更多信息，请参阅[GetAccuracyMetrics](API_GetAccuracyMetrics.md)。

## 步骤 3：创建预测
<a name="gs-create-campaign"></a>

Amazon Forecast 为数据集中每个唯一的 `item_id` 的 `target_value` 字段（由数据集域和类型确定）创建预测。在本练习中，`target_value`现场提供用电量，并`item_id`提供客户 IDs。您将获得客户的每小时用电量的预测。

在创建预测后，您可以查询单个项目或导出完整的预测。

**创建、检索和导出预测**

1. 创建预测。

   ```
   aws forecast create-forecast \
   --forecast-name electricityforecast \
   --predictor-arn arn:aws:forecast:us-west-2:acct-id:predictor/electricitypredictor
   ```

   该操作使用预测器来创建预测。在响应中，您将获得预测的 Amazon 资源名称（ARN）。您可以使用此 ARN 来检索和导出预测。以下为响应示例。

   ```
   {
       "ForecastArn": "arn:aws:forecast:us-west-2:acct-id:forecast/electricityforecast"
   }
   ```

   有关此操作的更多信息，请参阅[CreateForecast](API_CreateForecast.md)。

1. 检索 `client_1` 前两个小时的预测。
**注意**  
服务名称 `forecastquery` 不同于其他地方使用的服务名称。

   ```
   aws forecastquery query-forecast \
   --forecast-arn arn:aws:forecast:us-west-2:acct-id:forecast/electricityforecast \
   --start-date 2015-01-01T00:00:00 \
   --end-date   2015-01-01T02:00:00 \
   --filters '{"item_id":"client_1"}'
   ```

   该操作包括以下参数。
   + `start-date` 和 `end-date` – 指定要为其检索预测的可选日期范围。如果您未指定这些参数，该操作将返回 `client_1` 的完整预测。
   + `filters`– 指定用于为 `client_1` 检索用电量预测的 `item_id` 筛选条件。

     以下是 `filters` 参数的缩写语法。

     ```
     --filters item_id="client_1"
     ```

   以下为响应示例。

   ```
   {
       "Forecast": {
           "Predictions": {
               "mean": [
                   {
                       "Timestamp": "2015-01-01T01:00:00",
                       "Value": 20.952411651611328
                   },
                   {
                       "Timestamp": "2015-01-01T02:00:00",
                       "Value": 19.11078453063965
                   }
               ],
               "p90": [
                   {
                       "Timestamp": "2015-01-01T01:00:00",
                       "Value": 24.524038314819336
                   },
                   {
                       "Timestamp": "2015-01-01T02:00:00",
                       "Value": 22.319091796875
                   }
               ],
               "p50": [
                   {
                       "Timestamp": "2015-01-01T01:00:00",
                       "Value": 20.7841739654541
                   },
                   {
                       "Timestamp": "2015-01-01T02:00:00",
                       "Value": 19.237524032592773
                   }
               ],
               "p10": [
                   {
                       "Timestamp": "2015-01-01T01:00:00",
                       "Value": 18.507278442382812
                   },
                   {
                       "Timestamp": "2015-01-01T02:00:00",
                       "Value": 16.15062141418457
                   }
               ]
           }
       }
   }
   ```

   由于这是一个每小时预测，因此响应将显示每小时预测值。在响应中，请注意以下内容：
   + `mean` – 对于特定日期和时间，均值是客户的预测平均用电量值。
   + `p90`、`p50` 和 `p10` – 指定在指定日期和时间实际值将低于列出值的置信度。例如，在 2015-01-01T01:00:00，Amazon Forecast 有 90% 的信心认为用电量将低于 24.5。Amazon Forecast 有 50% 的信心认为用电量将低于 20.8，10％ 的信心认为用电量将低于18.5。

   有关此操作的更多信息，请参阅[QueryForecast](API_forecastquery_QueryForecast.md)。

1. 将完整预测导出到您的 Amazon S3 存储桶。您提供的 IAM 角色必须有权将数据写入您的 S3 存储桶。有关如何创建 IAM 角色的信息，请参阅 [为 Amazon Forecast 创建 IAM 角色 (AWS CLI)](aws-forecast-iam-roles.md#aws-forecast-create-iam-role-with-cli)。

   创建预测导出作业。

   ```
   aws forecast create-forecast-export-job \
   --forecast-export-job-name electricityforecast_exportjob \
   --forecast-arn arn:aws:forecast:us-west-2:acct-id:forecast/electricityforecast \
   --destination S3Config="{Path='s3://bucket',RoleArn='arn:aws:iam::acct-id:role/Role'}"
   ```

   以下为响应示例。

   ```
   {
      "ForecastExportJobArn": "arn:aws:forecast::us-west-2:acct-id:forecast-export/64bbc087"
   }
   ```

   有关此操作的更多信息，请参阅[CreateForecastExportJob](API_CreateForecastExportJob.md)。

1. 获取导出作业的状态。

   ```
   aws forecast describe-forecast-export-job \
   --forecast-export-job-arn arn:aws:forecast:us-west-2:acct-id:forecast/electricityforecast
   ```

   以下为响应示例。

   ```
   {
       "ForecastExportJobArn": "arn:aws:forecast::us-west-2:acct-id:forecast-export/64bbc087",
       "ForecastExportJobName": "electricityforecast_exportjob",
       "Status": "CREATE_IN_PROGRESS"
   }
   ```

   当状态为 ACTIVE 时，您可以查找指定 S3 存储桶中的预测文件。