

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

# 用于训练和部署 Amazon Personalize 模型的自定义资源
<a name="create-custom-resources"></a>

 如果您使用的是自定义配方，则在[导入数据](import-data.md)后，就可以创建用于训练和部署 Amazon Personalize 模型的自定义资源。使用这些资源获取建议。创建自定义资源时，执行以下操作：

1. **创建和配置解决方案：**自定义解决方案参数和食谱特定的超参数，使模型满足您的特定业务需求。默认情况下，新的解决方案版本使用自动训练以可配置的频率创建解决方案版本。默认频率为每 7 天一次。有关配置解决方案的更多信息，请参阅[配置解决方案](customizing-solution-config.md)。有关 Amazon Personalize 中的自定义配方的更多信息，请参阅[选择食谱](working-with-predefined-recipes.md)。

1. **创建解决方案版本（对于不使用自动训练的解决方案）：**对于使用自动训练的解决方案，在解决方案处于活动状态后解决方案版本创建会自动开始。对于使用手动训练的解决方案，手动创建解决方案版本。解决方案版本生成 Amazon Personalize 建议或用户细分。有关手动创建解决方案版本的更多信息，请参阅[手动创建解决方案版本](creating-a-solution-version.md)。要停止创建解决方案版本，请导航至解决方案版本详细信息页面，然后选择**停止**。有关更多信息，请参阅 [停止创建解决方案版本](stop-solution-version.md)。

1.  **评估解决方案版本** - 使用 Amazon Personalize 从新解决方案版本中生成的指标来评估模型的性能。请参阅[通过指标评估 Amazon Personalize 解决方案版本](working-with-training-metrics.md)。

1. **使用市场活动部署解决方案版本（仅用于实时建议）：**创建市场活动以部署您的解决方案版本。您可在请求实时建议时使用市场活动。如果您收到批量建议，则无需创建市场活动。有关更多信息，请参阅 [通过市场活动部署 Amazon Personalize 解决方案版本创建市场活动](campaigns.md)。如果您想要更改现有市场活动的设置，例如在推荐中启用元数据，则必须更新您的市场活动。有关更多信息，请参阅 [更新 Amazon Personalize 市场活动的配置](update-campaigns.md)。

**Topics**
+ [在 Amazon Personalize 中配置自定义解决方案](customizing-solution-config.md)
+ [更新解决方案以更改其自动训练配置](updating-solution.md)
+ [手动创建解决方案版本](creating-a-solution-version.md)
+ [停止创建解决方案版本](stop-solution-version.md)
+ [通过指标评估 Amazon Personalize 解决方案版本](working-with-training-metrics.md)
+ [通过市场活动部署 Amazon Personalize 解决方案版本](campaigns.md)
+ [更新 Amazon Personalize 市场活动的配置](update-campaigns.md)

# 在 Amazon Personalize 中配置自定义解决方案
<a name="customizing-solution-config"></a>

完成数据导入后，就可以创建解决方案了。*解决方案* 是指 Amazon Personalize 配方、自定义训练参数和一个或多个解决方案版本的组合。*解决方案版本* 是指经过训练的机器学习模型。

默认情况下，所有新解决方案都使用自动训练，每 7 天创建一个新的解决方案版本。只有在自上次训练以来导入了批量交互数据或实时交互数据时，才会进行自动训练。这包括物品交互，或者对于使用 Next-Best-Action 配方的解决方案，包括操作交互数据。自动训练会持续运行，直到您删除解决方案。有关更多信息，请参阅 [配置自动训练](solution-config-auto-training.md)。

如果您有现有解决方案，则可以使用 Amazon Personalize 控制台来克隆解决方案。克隆解决方案时，您可以使用现有解决方案的配置（例如配方和超参数）作为起点，并进行任何更改。有关更多信息，请参阅 [克隆解决方案（控制台）](cloning-solution.md)。

您可以使用控制台、AWS Command Line Interface（AWS CLI）或 AWS SDK 创建和配置解决方案。创建解决方案后，您可以在 Amazon Personalize 控制台的解决方案详情页面或通过 [DescribeSolution](API_DescribeSolution.md) 操作，查看解决方案的配置详细信息。

默认情况下，所有新解决方案都使用自动训练。如果使用自动训练，则在解决方案处于活动状态时，就会产生训练费用。为避免产生不必要的费用，在完成后，可以[更新解决方案](updating-solution.md)以关闭自动训练。有关训练费用的信息，请参阅 [Amazon Personalize 定价](https://aws.amazon.com/personalize/pricing/)。

**Topics**
+ [创建解决方案](create-solution.md)
+ [配置自动训练](solution-config-auto-training.md)
+ [配置训练时使用的列](custom-config-columns.md)
+ [针对其他目标优化解决方案](optimizing-solution-for-objective.md)
+ [使用事件配置优化解决方案](optimizing-solution-events-config.md)
+ [超级参数和 HPO](customizing-solution-config-hpo.md)
+ [选择用于训练的物品交互数据](event-values-types.md)
+ [克隆解决方案（控制台）](cloning-solution.md)

# 创建解决方案
<a name="create-solution"></a>

您可以使用 Amazon Personalize 控制台、AWS Command Line Interface（AWS CLI）或 AWS SDK 创建自定义解决方案。下面包括使用 Amazon Personalize 控制台创建解决方案的详细步骤，还包括了代码示例，用于演示如何创建仅包含必需字段的解决方案。

**Topics**
+ [创建解决方案（控制台）](#configure-solution-console)
+ [创建解决方案 (AWS CLI)](#configure-solution-cli)
+ [创建解决方案 (AWS SDK)](#configure-solution-sdk)

## 创建解决方案（控制台）
<a name="configure-solution-console"></a>

**重要**  
默认情况下，所有新解决方案都使用自动训练。如果使用自动训练，则在解决方案处于活动状态时，就会产生训练费用。为避免产生不必要的费用，在完成后，可以[更新解决方案](updating-solution.md)以关闭自动训练。有关训练费用的信息，请参阅 [Amazon Personalize 定价](https://aws.amazon.com/personalize/pricing/)。

 要在控制台中创建解决方案，请选择您的数据集组，然后指定解决方案名称、配方和可选的训练配置。

**配置解决方案（控制台）**

1. 打开 Amazon Personalize 控制台（网址为 [https://console.aws.amazon.com/personalize/home](https://console.aws.amazon.com/personalize/home)），并登录您的账户。

1. 在**数据集组**页面，选择您的数据集组。

1. 在**概览**页面上，对于**步骤 3**，执行以下任一操作：
   + 如果您创建了域数据集组，请选择**使用自定义资源**，然后选择**创建解决方案**。
   + 如果您创建了自定义数据集组，则选择**创建解决方案**。

1. 对于**解决方案名称**，为您的解决方案指定名称。

1. 对于**解决方案类型**，选择要创建的解决方案类型。您选择的类型决定了可用的配方。
   + 选择**物品建议**，以便为用户获取物品建议。例如，个性化的电影建议。
   + 选择**操作建议**，以便为用户获取操作建议。例如，为用户生成下一个最佳操作，例如下载您的应用程序。
   + 选择**用户细分**，以根据您的物品数据获取用户细分（用户组）。

1. 对于**食谱**，选择一个食谱（请参阅[选择食谱](working-with-predefined-recipes.md)）。

1. 对于**标签**，可以选择添加任何标签。有关标记 Amazon Personalize 资源的更多信息，请参阅[为 Amazon Personalize 资源添加标签](tagging-resources.md)。

1. 选择**下一步**。

1. 在**训练配置**页面上，自定义解决方案以满足您的业务需求。
   + 在**自动训练**中，选择解决方案是否使用自动训练。如果使用了自动训练，则可以更改 `Automatic training frequency`。默认训练频率为每 7 天一次。

     建议使用自动训练。使用自动训练后，您就可以更轻松地维护推荐相关性。训练频率取决于业务需求、所使用的配方以及导入数据的频率。有关更多信息，请参阅 [配置自动训练](solution-config-auto-training.md)。有关维护相关性的信息，请参阅[维护建议相关性](maintaining-relevance.md)。
   + 在**超参数配置**中，根据您的配方和业务需求配置任何超参数选项。使用不同超级参数的不同食谱。有关可用的超参数，请参阅[选择食谱](working-with-predefined-recipes.md)中的各个配方。
   + 在**用于训练的列**中，如果您的配方生成了物品推荐或用户细分，则可以选择在创建解决方案版本时 Amazon Personalize 考虑的列。有关更多信息，请参阅 [配置训练时使用的列](custom-config-columns.md)。
   + 在**事件配置**中，如果您的项目交互数据集包含 EVENT\$1TYPE 或同时包含 EVENT\$1TYPE 和 EVENT\$1VALUE 列，则可以选择使用**事件类型**和**事件值阈值**字段，来选择 Amazon Personalize 在训练模型时使用的项目交互数据。有关更多信息，请参阅 [选择用于训练的物品交互数据](event-values-types.md)。

      如果您有多个事件类型，并且使用了 User-Personalization-v2 配方或 Personalized-Ranking-v2 配方，则还可以为不同的类型指定不同的权重。例如，您可以配置一个解决方案，为购买事件赋予高于点击事件的权重。有关更多信息，请参阅 [使用事件配置优化解决方案](optimizing-solution-events-config.md)。
   + 如果您使用 [User-Personalization 食谱](native-recipe-new-item-USER_PERSONALIZATION.md)或 [Personalized-Ranking 食谱](native-recipe-search.md)食谱，则可以选择指定**目标**并选择**目标灵敏度**，以便在相关性之外针对目标优化您的解决方案。目标敏感度配置了 Amazon Personalize 如何在基于目标推荐物品与根据交互数据确定的相关性来推荐物品之间取得平衡。有关更多信息，请参阅 [针对其他目标优化解决方案](optimizing-solution-for-objective.md)。

1. 选择**下一步**，并查看解决方案详细信息。创建解决方案后，就不能更改其配置。

1. 选择**创建解决方案**。创建解决方案后，Amazon Personalize 将在一小时内开始创建第一个解决方案版本。训练开始后，可以在解决方案详细信息页面的**解决方案版本**部分监控训练。自动创建的解决方案版本的**训练类型**为“自动”。

    当解决方案版本处于活动状态时，就可以使用它来获得推荐。如何使用活跃解决方案版本取决于获取建议的方式：
   +  要获得实时建议，必须通过 Amazon Personalize 市场活动部署活跃解决方案版本。您可以使用该市场活动为用户获取建议。请参阅[通过市场活动部署 Amazon Personalize 解决方案版本创建市场活动](campaigns.md)。
   + 对于批量建议，在创建批量推理作业或批量细分作业时指定一个活跃解决方案版本。请参阅[获取批量物品推荐](getting-batch-recommendations.md)或[获取批量用户细分](getting-user-segments.md)。

## 创建解决方案 (AWS CLI)
<a name="configure-solution-cli"></a>

**重要**  
默认情况下，所有新解决方案都使用自动训练。如果使用自动训练，则在解决方案处于活动状态时，就会产生训练费用。为避免产生不必要的费用，在完成后，可以[更新解决方案](updating-solution.md)以关闭自动训练。有关训练费用的信息，请参阅 [Amazon Personalize 定价](https://aws.amazon.com/personalize/pricing/)。

要使用 AWS CLI 创建解决方案，请使用 `create-solution` 命令。此命令使用 [CreateSolution](API_CreateSolution.md) API 操作。以下代码展示了如何创建使用自动训练的解决方案。该解决方案每五天自动创建一个新的解决方案版本。

要使用该代码，请更新代码来为解决方案取名，指定您的数据集组的 Amazon 资源名称（ARN），可以选择更改训练频率，并指定要使用的配方的 ARN。有关配方的信息，请参阅[选择食谱](working-with-predefined-recipes.md)。

```
aws personalize create-solution \
--name solution name \
--dataset-group-arn dataset group ARN \
--recipe-arn recipe ARN \
--perform-auto-training \
--solution-config "{\"autoTrainingConfig\": {\"schedulingExpression\": \"rate(5 days)\"}}"
```
+ 我们建议您使用自动训练。使用自动训练后，您就可以更轻松地维护和改进推荐相关性。默认情况下，所有新解决方案都使用自动训练。默认训练频率为每 7 天一次。训练频率取决于业务需求、所使用的配方以及导入数据的频率。有关更多信息，请参阅 [配置自动训练](solution-config-auto-training.md)。
+ 根据您的配方，您可以修改代码来配置配方特定的属性和超参数（请参阅[超级参数和 HPO](customizing-solution-config-hpo.md)），配置用于训练的列（请参阅[配置训练时使用的列 (AWS CLI)](custom-config-columns.md#custom-config-columns-cli)），或者筛选用于训练的物品交互数据（请参阅[选择用于训练的物品交互数据](event-values-types.md)）。
+ 如果您使用 [User-Personalization 食谱](native-recipe-new-item-USER_PERSONALIZATION.md)或 [Personalized-Ranking 食谱](native-recipe-search.md)配方，则除了相关性之外，还可以针对目标优化解决方案。有关更多信息，请参阅 [针对其他目标优化解决方案](optimizing-solution-for-objective.md)。

创建解决方案后，记录解决方案 ARN 以备将来使用。通过自动训练，解决方案处于活动状态后，解决方案版本的创建将在一小时内开始。如果您在一小时内手动创建解决方案版本，则解决方案会跳过第一次自动训练。训练开始后，您可以通过 [ListSolutionVersions](https://docs.aws.amazon.com/personalize/latest/dg/API_ListSolutionVersions.html) API 操作获取解决方案版本的 Amazon 资源名称（ARN）。要获取其状态，请使用 [DescribeSolutionVersion](https://docs.aws.amazon.com/personalize/latest/dg/API_DescribeSolutionVersion.html) API 操作。

 当解决方案版本处于活动状态时，就可以使用它来获得推荐。如何使用活跃解决方案版本取决于获取建议的方式：
+  要获得实时建议，必须通过 Amazon Personalize 市场活动部署活跃解决方案版本。您可以使用该市场活动为用户获取建议。请参阅[通过市场活动部署 Amazon Personalize 解决方案版本创建市场活动](campaigns.md)。
+ 对于批量建议，在创建批量推理作业或批量细分作业时指定一个活跃解决方案版本。请参阅[获取批量物品推荐](getting-batch-recommendations.md)或[获取批量用户细分](getting-user-segments.md)。

## 创建解决方案 (AWS SDK)
<a name="configure-solution-sdk"></a>

**重要**  
默认情况下，所有新解决方案都使用自动训练。如果使用自动训练，则在解决方案处于活动状态时，就会产生训练费用。为避免产生不必要的费用，在完成后，可以[更新解决方案](updating-solution.md)以关闭自动训练。有关训练费用的信息，请参阅 [Amazon Personalize 定价](https://aws.amazon.com/personalize/pricing/)。

要使用 AWS SDK 创建解决方案，请使用 [CreateSolution](API_CreateSolution.md) API 操作。以下代码展示了如何创建使用自动训练的解决方案。该解决方案每五天自动创建一个新的解决方案版本。

要使用该代码，请更新代码来为解决方案取名，指定您的数据集组的 Amazon 资源名称（ARN），可以选择更改训练频率，并指定要使用的配方的 ARN。有关配方的信息，请参阅[选择食谱](working-with-predefined-recipes.md)。

------
#### [ SDK for Python (Boto3) ]

```
import boto3

personalize = boto3.client('personalize')

create_solution_response = personalize.create_solution(
  name = 'solution name',
  recipeArn = 'recipe ARN',
  datasetGroupArn = 'dataset group ARN',
  performAutoTraining = True,
  solutionConfig = {
    "autoTrainingConfig": {
      "schedulingExpression": "rate(5 days)"
    }
  }
)
solution_arn = create_solution_response['solutionArn']
print('solution_arn: ', solution_arn)
```

------
#### [ SDK for JavaScript v3 ]

```
import {
  CreateSolutionCommand,
  PersonalizeClient,
} from "@aws-sdk/client-personalize";

// create client
const personalizeClient = new PersonalizeClient({ region: "REGION" });

// set the solution parameters
export const solutionParam = {
  datasetGroupArn: "DATASET_GROUP_ARN" /* required */,
  recipeArn: "RECIPE_ARN" /* required */,
  name: "SOLUTION_NAME" /* required */,
  performAutoTraining: true /* optional, default is true */,
  solutionConfig: {
    autoTrainingConfig: {
      schedulingExpression:
        "rate(5 days)" /* optional, default is every 7 days */,
    },
  },
};

export const run = async () => {
  try {
    const response = await personalizeClient.send(
      new CreateSolutionCommand(solutionParam)
    );
    console.log("Success", response);
    return response; // For unit tests.
  } catch (err) {
    console.log("Error", err);
  }
};
run();
```

------
+ 我们建议您使用自动训练。使用自动训练后，您就可以更轻松地维护和改进推荐相关性。默认情况下，所有新解决方案都使用自动训练。默认训练频率为每 7 天一次。训练频率取决于业务需求、所使用的配方以及导入数据的频率。有关更多信息，请参阅 [配置自动训练](solution-config-auto-training.md)。
+ 根据您的配方，您可以修改代码来配置配方特定的属性和超参数（请参阅[超级参数和 HPO](customizing-solution-config-hpo.md)），配置用于训练的列（请参阅[配置训练时使用的列 (AWS SDK)](custom-config-columns.md#custom-configure-columns-sdk)），或者筛选用于训练的物品交互数据（请参阅[选择用于训练的物品交互数据](event-values-types.md)）。
+ 如果您使用 [User-Personalization 食谱](native-recipe-new-item-USER_PERSONALIZATION.md)或 [Personalized-Ranking 食谱](native-recipe-search.md)配方，则除了相关性之外，还可以针对目标优化解决方案。有关更多信息，请参阅 [针对其他目标优化解决方案](optimizing-solution-for-objective.md)。

创建解决方案后，记录解决方案 ARN 以备将来使用。通过自动训练，解决方案处于活动状态后，解决方案版本的创建将在一小时内开始。如果您在一小时内手动创建解决方案版本，则解决方案会跳过第一次自动训练。训练开始后，您可以通过 [ListSolutionVersions](https://docs.aws.amazon.com/personalize/latest/dg/API_ListSolutionVersions.html) API 操作获取解决方案版本的 Amazon 资源名称（ARN）。要获取其状态，请使用 [DescribeSolutionVersion](https://docs.aws.amazon.com/personalize/latest/dg/API_DescribeSolutionVersion.html) API 操作。

您可以使用以下 Python 代码来等待自动训练开始。`wait_for_training_to_start` 方法返回第一个解决方案版本的 ARN。

```
import time
import boto3


def wait_for_training_to_start(new_solution_arn):
    max_time = time.time() + 3 * 60 * 60    # 3 hours
    while time.time() < max_time:
        list_solution_versions_response = personalize.list_solution_versions(
            solutionArn=new_solution_arn
        )
        solution_versions = list_solution_versions_response.get('solutionVersions', [])
        if solution_versions:
            new_solution_version_arn = solution_versions[0]['solutionVersionArn']
            print(f"Solution version ARN: {new_solution_version_arn}")
            return new_solution_version_arn
        else:
            print(f"Training hasn't started yet. Training will start within the next hour.")
            time.sleep(60)


personalize = boto3.client('personalize')

solution_arn = "solution_arn"
solution_version_arn = wait_for_training_to_start(solution_arn)
```

 当解决方案版本处于活动状态时，就可以使用它来获得推荐。如何使用活跃解决方案版本取决于获取建议的方式：
+  要获得实时建议，必须通过 Amazon Personalize 市场活动部署活跃解决方案版本。您可以使用该市场活动为用户获取建议。请参阅[通过市场活动部署 Amazon Personalize 解决方案版本创建市场活动](campaigns.md)。
+ 对于批量建议，在创建批量推理作业或批量细分作业时指定一个活跃解决方案版本。请参阅[获取批量物品推荐](getting-batch-recommendations.md)或[获取批量用户细分](getting-user-segments.md)。

# 配置自动训练
<a name="solution-config-auto-training"></a>

**重要**  
默认情况下，所有新解决方案都使用自动训练。如果使用自动训练，则在解决方案处于活动状态时，就会产生训练费用。为避免产生不必要的费用，在完成后，可以[更新解决方案](updating-solution.md)以关闭自动训练。有关训练费用的信息，请参阅 [Amazon Personalize 定价](https://aws.amazon.com/personalize/pricing/)。

创建解决方案时，您可以配置解决方案是否使用自动训练。还可以配置训练频率。例如，您可以将解决方案配置为每五天创建一个新的解决方案版本。

默认情况下，所有新解决方案都使用自动训练，每 7 天创建一个新的解决方案版本。只有在自上次训练以来导入了批量交互数据或实时交互数据时，才会进行自动训练。这包括物品交互，或者对于使用 Next-Best-Action 配方的解决方案，包括操作交互数据。自动训练会持续运行，直到您删除解决方案。

我们建议您使用自动训练。自动训练使维护解决方案变得更加容易。有了自动训练，解决方案从最新数据中学习就不再需要手动训练。如果没有自动训练，则必须手动为解决方案创建新的解决方案版本，这样才能从最新数据中学习。没有自动训练会导致推荐内容过时和转化率下降。有关维护 Amazon Personalize 推荐的更多信息，请参阅[维护建议相关性](maintaining-relevance.md)。

您可以使用 Amazon Personalize 控制台、AWS Command Line Interface（AWS CLI）或 AWS SDK 来配置自动训练。有关使用控制台配置自动训练的步骤，请参阅[创建解决方案（控制台）](create-solution.md#configure-solution-console)。

创建解决方案后，记录解决方案 ARN 以备将来使用。通过自动训练，解决方案处于活动状态后，解决方案版本的创建将在一小时内开始。如果您在一小时内手动创建解决方案版本，则解决方案会跳过第一次自动训练。训练开始后，您可以通过 [ListSolutionVersions](https://docs.aws.amazon.com/personalize/latest/dg/API_ListSolutionVersions.html) API 操作获取解决方案版本的 Amazon 资源名称（ARN）。要获取其状态，请使用 [DescribeSolutionVersion](https://docs.aws.amazon.com/personalize/latest/dg/API_DescribeSolutionVersion.html) API 操作。

**Topics**
+ [指南和要求](#auto-training-guidelines)
+ [配置自动训练（AWS CLI）](#configure-solution-auto-training-cli)
+ [配置自动训练（SDK）](#configure-solution-auto-training-sdk)

## 指南和要求
<a name="auto-training-guidelines"></a>

以下是自动训练的准则和要求：
+  只有在自上次训练以来导入了批量交互数据或实时交互数据时，才会进行自动训练。这包括物品交互，或者对于使用 Next-Best-Action 配方的解决方案，包括操作交互数据。
+ 每次训练都会考虑包括在训练中的数据集组中的所有数据。有关配置训练中所用列的信息，请参阅[配置训练时使用的列](custom-config-columns.md)。
+ 您仍然可以手动创建解决方案版本。
+ 解决方案处于活动状态后的一小时内，自动训练会开始。如果您在一小时内手动创建解决方案版本，则解决方案会跳过第一次自动训练。
+ 训练计划基于训练开始日期。例如，如果第一个解决方案版本在晚上 7:00 开始训练，而您使用的是每周训练，那么下一个解决方案版本将在一周后的晚上 7:00 开始训练。
+ 对于所有配方，我们建议至少每周进行一次训练。您可以指定介于 1 天和 30 天之间的训练频率。默认为每 7 天进行一次训练。
  +  如果您使用 User-Personalization-v2、User-Personalization 或 Next-Best-Action，则解决方案会自动更新为考虑在推荐中加入新物品或操作。自动更新与自动训练不同。自动更新不会创建全新的解决方案版本，模型也不会从最新数据中学习。为了维持您的解决方案，训练频率仍然应该是至少每周一次。有关自动更新的更多信息（包括其他准则和要求），请参阅[自动更新](use-case-recipe-features.md#automatic-updates)。
  + 如果您使用 Trending-Now，则 Amazon Personalize 会在可配置的时间间隔内自动识别交互数据中最热门的物品。Trending-Now 可以通过批量交互数据或流式处理交互数据推荐自上次训练以来添加的物品。您的训练频率仍然应该是至少每周一次。有关更多信息，请参阅 [Trending-Now 食谱](native-recipe-trending-now.md)。
  + 如果您不使用具有自动更新的配方或 Trending-Now 配方，则 Amazon Personalize 仅在下一次训练之后考虑在推荐中加入新物品。例如，如果您使用 Similar-Items 配方并每天添加新物品，则必须使用每日自动训练频率，这些物品才会出现在当天的推荐中。

## 配置自动训练（AWS CLI）
<a name="configure-solution-auto-training-cli"></a>

以下代码向您展示了如何创建每五天自动创建解决方案版本的解决方案。要关闭自动训练，请将 `perform-auto-training` 设置为 `false`。

要更改训练频率，可以修改 `autoTrainingConfig` 中的 `schedulingExpression`。表达式必须采用以下格式：`rate(value unit)`。对于值，指定一个介于 1 和 30 之间的数字。对于单位，请指定 `day` 或 `days`。

有关 `create-solution` 命令的详细说明，请参阅[创建解决方案 (AWS CLI)](create-solution.md#configure-solution-cli)。

```
aws personalize create-solution \
--name solution name \
--dataset-group-arn dataset group ARN \
--recipe-arn recipe ARN \
--perform-auto-training \
--solution-config "{\"autoTrainingConfig\": {\"schedulingExpression\": \"rate(5 days)\"}}"
```

## 配置自动训练（SDK）
<a name="configure-solution-auto-training-sdk"></a>

以下代码向您展示了如何使用 AWS SDK 创建带有自动训练的解决方案。该解决方案每五天自动创建一个解决方案版本。要关闭自动训练，请将 `performAutoTraining` 设置为 `false`。

要更改训练频率，可以修改 `autoTrainingConfig` 中的 `schedulingExpression`。表达式必须采用以下格式：`rate(value unit)`。对于值，指定一个介于 1 和 30 之间的数字。对于单位，请指定 `day` 或 `days`。

有关 CreateSolution API 操作的详细说明，请参阅[创建解决方案 (AWS SDK)](create-solution.md#configure-solution-sdk)。

------
#### [ SDK for Python (Boto3) ]

```
import boto3

personalize = boto3.client('personalize')

create_solution_response = personalize.create_solution(
  name = 'solution name',
  recipeArn = 'recipe ARN',
  datasetGroupArn = 'dataset group ARN',
  performAutoTraining = True,
  solutionConfig = {
    "autoTrainingConfig": {
      "schedulingExpression": "rate(5 days)"
    }
  }
)
solution_arn = create_solution_response['solutionArn']
print('solution_arn: ', solution_arn)
```

------
#### [ SDK for JavaScript v3 ]

```
import {
  CreateSolutionCommand,
  PersonalizeClient,
} from "@aws-sdk/client-personalize";

// create client
const personalizeClient = new PersonalizeClient({ region: "REGION" });

// set the solution parameters
export const solutionParam = {
  datasetGroupArn: "DATASET_GROUP_ARN" /* required */,
  recipeArn: "RECIPE_ARN" /* required */,
  name: "SOLUTION_NAME" /* required */,
  performAutoTraining: true /* optional, default is true */,
  solutionConfig: {
    autoTrainingConfig: {
      schedulingExpression:
        "rate(5 days)" /* optional, default is every 7 days */,
    },
  },
};

export const run = async () => {
  try {
    const response = await personalizeClient.send(
      new CreateSolutionCommand(solutionParam)
    );
    console.log("Success", response);
    return response; // For unit tests.
  } catch (err) {
    console.log("Error", err);
  }
};
run();
```

------

您可以使用以下 Python 代码来等待自动训练开始。`wait_for_training_to_start` 方法返回第一个解决方案版本的 ARN。

```
import time
import boto3

def wait_for_training_to_start(new_solution_arn):
    max_time = time.time() + 3 * 60 * 60    # 3 hours
    while time.time() < max_time:
        list_solution_versions_response = personalize.list_solution_versions(
            solutionArn=new_solution_arn
        )
        solution_versions = list_solution_versions_response.get('solutionVersions', [])
        if solution_versions:
            new_solution_version_arn = solution_versions[0]['solutionVersionArn']
            print(f"Solution version ARN: {new_solution_version_arn}")
            return new_solution_version_arn
        else:
            print(f"Training hasn't started yet. Training will start within the next hour.")
            time.sleep(60)


personalize = boto3.client('personalize')

solution_arn = "solution_arn"
solution_version_arn = wait_for_training_to_start(solution_arn)
```

# 配置训练时使用的列
<a name="custom-config-columns"></a>

**重要**  
默认情况下，所有新解决方案都使用自动训练。如果使用自动训练，则在解决方案处于活动状态时，就会产生训练费用。为避免产生不必要的费用，在完成后，可以[更新解决方案](updating-solution.md)以关闭自动训练。有关训练费用的信息，请参阅 [Amazon Personalize 定价](https://aws.amazon.com/personalize/pricing/)。

如果您的配方生成了物品建议或用户细分，则可以修改 Amazon Personalize 在创建解决方案版本（训练模型）时考虑的列。

您可以更改训练时使用的列，以控制 Amazon Personalize 在训练模型（创建解决方案版本）时使用的数据。您可以这样做，以试验不同的训练数据组合；也可以排除无有意义数据的列。例如，可能有一列，您只想将其用来筛选建议。您可以将此列排除在训练之外，Amazon Personalize 只有在筛选时才会考虑该列。

您无法排除 EVENT\$1TYPE 列。默认情况下，Amazon Personalize 使用可在训练时采用的所有列。始终从训练中排除以下数据：
+ 具有布尔数据类型的列
+ [展示数据](interactions-datasets.md#interactions-impressions-data)
+ 既不是分类也不是文本的自定义字符串字段

 您不能在训练中包括展示数据，但如果您的应用场景或配方使用了这些数据，Amazon Personalize 会在您获取建议时使用展示数据来指导浏览。

 如果您已经创建了一个解决方案，并且想要修改它在训练时使用的列，则可以克隆该解决方案。克隆解决方案时，您可以使用现有解决方案的配置（例如食谱和超参数）作为起点，并根据需要进行任何更改。有关更多信息，请参阅 [克隆解决方案（控制台）](cloning-solution.md)。

您可以配置 Amazon Personalize 在通过 Amazon Personalize 控制台、AWS Command Line Interface (AWS CLI) 或 AWS SDK 进行训练时使用的列。有关使用 Amazon Personalize 控制台选择列的信息，请参阅[创建解决方案（控制台）](create-solution.md#configure-solution-console)中的高级配置步骤。创建解决方案后，您可以在 Amazon Personalize 控制台的解决方案详情页面或通过 [DescribeSolution](API_DescribeSolution.md) 操作，查看解决方案使用的列。

**Topics**
+ [配置训练时使用的列 (AWS CLI)](#custom-config-columns-cli)
+ [配置训练时使用的列 (AWS SDK)](#custom-configure-columns-sdk)

## 配置训练时使用的列 (AWS CLI)
<a name="custom-config-columns-cli"></a>

要将列排除在训练之外，请在解决方案配置期间，在 `trainingDataConfig` 中提供 `excludedDatasetColumns` 对象。对于每个键，提供数据集类型。对于每个值，提供要排除的列的列表。以下代码显示了如何在通过 AWS CLI 创建解决方案时将列排除在训练之外。

```
aws personalize create-solution \
--name solution name \
--dataset-group-arn dataset group ARN \
--recipe-arn recipe ARN \
--solution-config "{\"trainingDataConfig\": {\"excludedDatasetColumns\": { \"datasetType\" : [ \"column1Name\", \"column2Name\"]}}}"
```

## 配置训练时使用的列 (AWS SDK)
<a name="custom-configure-columns-sdk"></a>

要将列排除在训练之外，请在解决方案配置期间，在 `trainingDataConfig` 中提供 `excludedDatasetColumns` 对象。对于每个键，提供数据集类型。对于每个值，提供要排除的列的列表。以下代码显示了如何在通过 SDK for Python (Boto3) 创建解决方案时将列排除在训练之外。

```
import boto3

personalize = boto3.client('personalize')

create_solution_response = personalize.create_solution(
  name = 'solution name',
  recipeArn = 'recipe ARN',
  datasetGroupArn = 'dataset group ARN',
  solutionConfig = {
    "trainingDataConfig": {
      "excludedDatasetColumns": { 
          "datasetType": ["COLUMN_A", "COLUMN_B"]
      }
    }
  }
)
solution_arn = create_solution_response['solutionArn']
print('solution_arn: ', solution_arn)
```

# 针对其他目标优化解决方案
<a name="optimizing-solution-for-objective"></a>

**重要**  
默认情况下，所有新解决方案都使用自动训练。如果使用自动训练，则在解决方案处于活动状态时，就会产生训练费用。为避免产生不必要的费用，在完成后，可以[更新解决方案](updating-solution.md)以关闭自动训练。有关训练费用的信息，请参阅 [Amazon Personalize 定价](https://aws.amazon.com/personalize/pricing/)。

 如果您使用 User-Personalization 配方或 Personalized-Ranking 配方，则除了最大相关性（例如更大限度地提高收入）之外，您还可以针对目标优化 Amazon Personalize 解决方案。

 使用物品建议配方时，Amazon Personalize 的主要目标是根据历史和实时物品交互数据，为您的用户预测最相关的物品。这些是您的用户最有可能与之交互的物品（例如，他们最有可能单击的物品）。如果您还有其他目标，例如最大限度地提高流时长或增加收入，则可以创建一个解决方案，根据相关性和目标生成建议。

要针对其他目标优化解决方案，请使用 User-Personalization 食谱或 Personalized-Ranking 食谱创建一个新的解决方案，然后在物品数据集中选择与您的目标相关的数值元数据列。在生成建议时，Amazon Personalize 会更加重视此列数据中具有更高值的物品。例如，您可以选择 VIDEO\$1LENGTH 列来最大限度地提高流时长，或者选择 PRICE 列来最大限度地提高收入。

您可以使用 Amazon Personalize 控制台、 AWS Command Line Interface (AWS CLI) 或 AWS SDKs。有关使用 Amazon Personalize 控制台的信息，请参阅[创建解决方案（控制台）](create-solution.md#configure-solution-console)。

**Topics**
+ [指南和要求](#optimize-objective-guidelines-req)
+ [平衡目标重点和相关性](#balancing-objective-emphasis)
+ [衡量优化性能](#measuring-performance)
+ [优化解决方案 (AWS CLI)](#optimizing-solution-cli)
+ [优化解决方案 (AWS SDKs)](#optimizing-solution-sdk)
+ [示例 Jupyter 笔记本](#optimization-objective-sample-notebooks)

## 指南和要求
<a name="optimize-objective-guidelines-req"></a>

 目标要求如下：
+ 您只能为目标选择一列。
+ 列在架构中必须具有数字类型。
+ 列在架构中不能有 `null` 类型。

有关架构和数据类型的更多信息，请参阅[为 Amazon Personalize 架构创建架构 JSON 文件](how-it-works-dataset-schema.md)。

## 平衡目标重点和相关性
<a name="balancing-objective-emphasis"></a>

 当更多地根据目标（而不是相关性）来推荐物品时，可能会进行权衡取舍。例如，如果您想通过建议来增加收入，则仅针对昂贵物品的建议可能会降低物品与用户的相关性，并降低用户参与度和转化率。

要配置相关性和目标之间的平衡，请在创建解决方案时选择以下一个目标敏感度级别：
+ 关闭：Amazon Personalize 主要使用物品交互数据为用户预测最相关的物品。
+ 低：Amazon Personalize 不太重视您的目标。通过物品交互数据实现的相关性更为重要。
+ 中等：Amazon Personalize 通过物品交互数据对您的目标和相关性给予同等重视。
+ 高：Amazon Personalize 更加重视您的目标。通过物品交互数据实现的相关性不太重要。

## 衡量优化性能
<a name="measuring-performance"></a>

当您为具有优化目标的解决方案创建解决方案版本（训练模型）时，Amazon Personalize 会生成 `average_rewards_at_k` 指标。`average_rewards_at_k` 的分数可指明，解决方案版本在实现目标方面的性能如何。为了计算该指标，Amazon Personalize 按如下方式计算每位用户的奖励：

`rewards_per_user = total rewards from the user's interactions with their top 25 reward generating recommendations / total rewards from the user's interactions with recommendations`

最终 `average_rewards_at_k` 是所有 `rewards_per_user` 的平均值，即标准化为小于或等于 1 且大于 0 的十进制值。该值越接近 1，表示您期望从建议中获得的每个用户平均收益就越多。

例如，如果您的目标是最大限度地提高单击收入，则 Amazon Personalize 将按以下方法计算每个用户分数：将用户单击的前 25 个最昂贵建议物品产生的总收入除以用户单击的所有推荐物品产生的总收入。然后，Amazon Personalize 会返回所有用户分数的标准化平均值。`average_rewards_at_k` 越接近 1，表示您期望从建议中获得的每个用户平均收入就越多。

有关生成指标的更多信息，请参阅[通过指标评估 Amazon Personalize 解决方案版本](working-with-training-metrics.md)。

## 优化解决方案 (AWS CLI)
<a name="optimizing-solution-cli"></a>

 您只能使用 User-Personalization 或 Personalized-Ranking 食谱针对目标进行优化。要使用针对其他目标优化解决方案 AWS CLI，请创建一个新的解决方案并使用`solutionConfig`对象中的`optimizationObjective`密钥指定您的目标细节。`optimizationObjective` 包含以下字段：
+ `itemAttribute`：指定物品数据集中与您的目标相关的数值元数据列的名称。
+ `objectiveSensitivity`：指定解决方案在生成建议时对您的目标的重视程度。目标敏感度级别配置了 Amazon Personalize 如何通过物品交互数据根据目标和相关性来平衡建议的物品。`objectiveSensitivity` 可以是 `OFF`、LOW、`MEDIUM` 或 `HIGH`。有关更多信息，请参阅 [平衡目标重点和相关性](#balancing-objective-emphasis)。

以下是 `create-solution` AWS CLI 命令的示例。将 `solution name`、`dataset group arn` 和 `recipe arn` 值替换为您自己的值。

对于 `optimizationObjective`，将 `COLUMN_NAME` 替换为物品数据集中与您的目标相关的数值元数据列名称。对于 `objectiveSensitivity`，请指定关闭、低、中或高。

```
aws personalize create-solution \
--name solution name \
--dataset-group-arn dataset group arn \
--recipe-arn recipe arn \
--solution-config "{\"optimizationObjective\":{\"itemAttribute\":\"COLUMN_NAME\",\"objectiveSensitivity\":\"MEDIUM\"}}"
```

解决方案准备就绪后，创建一个新的解决方案版本（有关示例命令，请参阅[创建解决方案 (AWS CLI)](create-solution.md#configure-solution-cli)）。创建解决方案版本后，可以通过解决方案版本指标查看优化性能。请参阅[衡量优化性能](#measuring-performance)。

## 优化解决方案 (AWS SDKs)
<a name="optimizing-solution-sdk"></a>

您只能使用 User-Personalization 或 Personalized-Ranking 食谱针对目标进行优化。

要使用针对其他目标优化解决方案 AWS SDKs，请创建一个新的解决方案并使用解决方案`solutionConfig`对象中的`optimizationObjective`密钥指定您的目标细节。`optimizationObjective` 包含以下字段：
+ `itemAttribute`：指定数据集组物品数据集中与您的目标相关的数值元数据列的名称。
+ `objectiveSensitivity`：指定解决方案在生成建议时对您的目标的重视程度。目标敏感度级别配置了 Amazon Personalize 如何通过物品交互数据根据目标和相关性来平衡建议的物品。`objectiveSensitivity` 可以是 `OFF`、`LOW`、`MEDIUM` 或 `HIGH`。有关更多信息，请参阅 [平衡目标重点和相关性](#balancing-objective-emphasis)。

使用以下代码通过 适用于 Python (Boto3) 的 AWS SDK 或 AWS SDK for Java 2.x创建具有其他目标的解决方案。

解决方案准备就绪后，创建一个新的解决方案版本（有关示例代码，请参阅[创建解决方案版本 (AWS SDK)](creating-a-solution-version.md#create-solution-version-sdk)）。创建解决方案版本后，可以通过解决方案版本指标查看优化性能。请参阅[衡量优化性能](#measuring-performance)。

------
#### [ SDK for Python (Boto3) ]

 要创建针对其他目标进行了优化的解决方案，请使用以下 `create_solution` 方法。将 `solution name`、`dataset group arn` 和 `recipe arn` 值替换为您自己的值。

对于 `optimizationObjective`，将 `COLUMN_NAME` 替换为物品数据集中与您的目标相关的数值元数据列名称。对于 `objectiveSensitivity`，请指定关闭、低、中或高。

```
import boto3

personalize = boto3.client('personalize')

create_solution_response = personalize.create_solution(
    name= 'solution name', 
    recipeArn = 'recipe arn', 
    datasetGroupArn = 'dataset group arn',
    solutionConfig = {
        "optimizationObjective": {
            "itemAttribute": "COLUMN_NAME",
            "objectiveSensitivity": "MEDIUM"
        }
    }
)
solution_arn = create_solution_response['solutionArn']
print('solution_arn: ', solution_arn)
```

------
#### [ SDK for Java 2.x ]

要创建针对其他目标进行了优化的解决方案，请使用以下 `createPersonalizeSolution` 方法并将以下内容作为参数传递：Amazon Personalize 服务客户端、数据集组的 Amazon 资源名称 (ARN)、解决方案名称、食谱 ARN、物品属性和目标敏感度级别。

```
public static String createPersonalizeSolution(PersonalizeClient personalizeClient, 
                                             String datasetGroupArn, 
                                             String solutionName, 
                                             String recipeArn,
                                             String itemAttribute, 
                                             String objectiveSensitivity) {
    
    try {
        OptimizationObjective optimizationObjective = OptimizationObjective.builder()
            .itemAttribute(itemAttribute)
            .objectiveSensitivity(objectiveSensitivity)
            .build();
    
        SolutionConfig solutionConfig = SolutionConfig.builder()
            .optimizationObjective(optimizationObjective)
            .build();

        CreateSolutionRequest solutionRequest = CreateSolutionRequest.builder()
            .name(solutionName)
            .datasetGroupArn(datasetGroupArn)
            .recipeArn(recipeArn)
            .solutionConfig(solutionConfig)
            .build();

        CreateSolutionResponse solutionResponse = personalizeClient.createSolution(solutionRequest);
        
        return solutionResponse.solutionArn();

    } catch (PersonalizeException e) {
        System.err.println(e.awsErrorDetails().errorMessage());
        System.exit(1);
    }
    return "";
```

------
#### [ SDK for JavaScript v3 ]

```
// Get service clients and commands using ES6 syntax.
import { CreateSolutionCommand, PersonalizeClient } from
  "@aws-sdk/client-personalize";
  
// create the personalizeClient
const personalizeClient = new PersonalizeClient({ region: "REGION"});

// set the solution parameters.
export const createSolutionParam = {
  datasetGroupArn: 'DATASET_GROUP_ARN',              /* required */
  recipeArn: 'RECIPE_ARN',                           /* required */
  name: 'NAME',                                      /* required */
  solutionConfig: {
    optimizationObjective: {
      itemAttribute: "COLUMN_NAME",           /* specify the numerical column from the Items dataset related to your objective */
      objectiveSensitivity: "MEDIUM"          /* specify OFF, LOW, MEDIUM, or HIGH */
    }
  }
};

export const run = async () => {
  try {
    const response = await personalizeClient.send(new CreateSolutionCommand(createSolutionParam));
    console.log("Success", response);
    return response; // For unit tests.
  } catch (err) {
    console.log("Error", err);
  }
};
run();
```

------

## 示例 Jupyter 笔记本
<a name="optimization-objective-sample-notebooks"></a>

[有关演示如何创建针对其他基于目标的项目元数据进行优化的解决方案的 Jupyter 笔记本示例，请参阅 Amazon Personalize 示例存储库的 [objective\$1](https://github.com/aws-samples/amazon-personalize-samples/tree/master/next_steps/core_use_cases/objective_optimization) optimation 文件夹](https://github.com/aws-samples/amazon-personalize-samples) GitHub 

# 使用事件配置优化解决方案
<a name="optimizing-solution-events-config"></a>

**重要**  
默认情况下，所有新解决方案都使用自动训练。如果使用自动训练，则在解决方案处于活动状态时，就会产生训练费用。为避免产生不必要的费用，在完成后，可以[更新解决方案](updating-solution.md)以关闭自动训练。有关训练费用的信息，请参阅 [Amazon Personalize 定价](https://aws.amazon.com/personalize/pricing/)。

 如果您使用了 User-Personalization-v2 recipe 或 Personalized-Ranking-v2 配方，则可以使用事件配置优化 Amazon Personalize 解决方案。

 使用项目建议配方时，Amazon Personalize 的主要目标是根据历史和实时项目交互数据，为您的用户预测最相关的项目。但是，交互可能包含其他信息，例如用户是点击还是购买了某个项目。您可以通过记录事件的类型（[事件类型和事件值数据](interactions-datasets.md#event-type-and-event-value-data)）来记录此内容。配置解决方案时，您可以让它为不同的交互事件类型赋予不同的权重。例如，您可以配置一个解决方案，为 `purchase` 事件赋予高于 `click` 事件的权重。

要让解决方案为不同的事件类型赋予不同的权重，您需要在解决方案的事件配置中指定事件类型及其对应的权重。此外，您还可以设置事件值阈值以排除事件值低于该阈值的交互。例如，如果 EVENT\$1TYPE 为观看 的事件的 EVENT\$1VALUE 数据是用户观看的视频的百分比，如果您将事件值阈值设置为 0.5，将事件类型设置为观看，则 Amazon Personalize 将仅使用 EVENT\$1VALUE 大于或等于 0.5 的观看 交互事件来训练模型。

 与事件类型相关的权重将决定事件类型的重要性。权重较高的事件类型将使经过训练的模型更有可能推荐与该事件类型交互的项目。例如，如果您为“购买”赋予了高于“点击”的权重，并且模型得知某用户将点击项目 B 或利用自己的交互历史购买项目 C，那么模型将提高项目 C 的排名。

要使用事件配置优化解决方案，您需要使用 Personalization-v2 配方或 Personalized-Ranking-v2 配方创建一个新解决方案，并指定事件配置。您还可以使用事件配置更新现有解决方案（[更新解决方案以更改其自动训练配置](updating-solution.md)）。

您可以使用 Amazon Personalize 控制台、AWS Command Line Interface (AWS CLI) 或 AWS SDK。有关使用 Amazon Personalize 控制台的信息，请参阅[创建解决方案（控制台）](create-solution.md#configure-solution-console)。

**Topics**
+ [指南和要求](#optimize-event-config-guidelines-req)
+ [使用事件权重配置来衡量性能](#optimize-event-configuration-measuring-performance)
+ [优化解决方案 (AWS CLI)](#optimize-event-configuration-cli)
+ [优化解决方案 (AWS SDK)](#optimize-event-configuration-sdk)

## 指南和要求
<a name="optimize-event-config-guidelines-req"></a>

 下面是事件配置的准则和要求：
+ 要为不同的事件类型配置权重，您的项目交互数据集必须有一个 EVENT\$1TYPE 列和一个 EVENT\$1VALUE 列（可选）。
+ 您可以在配置中指定一个事件参数列表。包含您希望在创建解决方案时考虑的所有事件类型。您可以指定最多 10 种不同的事件类型。
+ 您可以为每种事件类型指定事件权重。事件权重必须介于 0.0 和 1.0 之间。只有事件类型之间的权重比率才重要。例如，将事件类型“购买”的权重设置为 0.3 并将事件类型“点击”的权重设置为 0.1，其效果与将“购买”的权重设置为 0.6 并将“点击”的权重设置为 0.2 相同。
+ 您可以使用 [UpdateSolution](https://docs.aws.amazon.com/personalize/latest/dg/API_UpdateSolution.html) API 操作更新现有解决方案的事件配置。

## 使用事件权重配置来衡量性能
<a name="optimize-event-configuration-measuring-performance"></a>

 当您为具有事件配置的解决方案创建解决方案版本（训练模型）时，Amazon Personalize 会生成 `normalized_discounted_cumulative_gain_with_event_weights_at_k` 指标。`normalized_discounted_cumulative_gain_with_event_weights_at_k` 的分数表示在考虑为每个事件类型设置的事件权重的情况下，解决方案版本的表现情况。

 它与 k 阶标准化折损累积增益（NDCG）类似，只不过对每个正确预测的奖励分数会进行加权处理。与之不同的是，在原始 K 阶 NDCG 中，每个正确预测的权重均为 1。例如，如果“购买”权重为 0.3，“点击”权重为 0.1，正确预测“购买”项目将获得 1.5 的奖励分数，而预测“点击”项目将获得 0.5 的奖励分数。

有关生成指标的更多信息，请参阅[通过指标评估 Amazon Personalize 解决方案版本](working-with-training-metrics.md)。

## 优化解决方案 (AWS CLI)
<a name="optimize-event-configuration-cli"></a>

您可以将 User-Personalization-v2 或 Personalized-Ranking-v2 配方与事件配置结合使用来进行优化。

 要借助 AWS CLI 使用事件配置来优化解决方案，请创建一个新解决方案，并在 `solutionConfig` 对象中使用 `eventsConfig` 键指定事件配置详细信息。`eventsConfig` 有一个键 `eventParametersList`，您可在该键下指定最多 10 个 eventParameters。每个 `eventParameter` 都包含以下字段：
+ eventType：指定您在创建解决方案时要考虑的事件类型。
+ eventValueThreshold：指定事件值阈值。只有事件值大于或等于此阈值的事件才会被考虑用于创建解决方案。
+ weight：为每种事件类型指定权重。权重越高意味着事件类型对创建的解决方案越重要。

以下是 create-solution AWS CLI 命令的示例。将 `solution name`、`dataset group arn` 和 `recipe arn` 值替换为您自己的值。

```
aws personalize create-solution \
--name solution name \
--dataset-group-arn dataset group arn \
--recipe-arn recipe arn \
--solution-config "{\"eventsConfig\":{\"eventParametersList\":[{\"eventType\":\"Purchase\", \"eventValueThreshold\":0.1, \"weight\":0.3}, {\"eventType\":\"Click\", \"weight\":0.1}]}"
```

解决方案准备就绪后，创建一个新的解决方案版本（有关示例命令，请参阅[创建解决方案 (AWS CLI)](create-solution.md#configure-solution-cli)）。创建解决方案版本后，可以通过解决方案版本指标查看优化性能。请参阅[衡量优化性能](optimizing-solution-for-objective.md#measuring-performance)。

## 优化解决方案 (AWS SDK)
<a name="optimize-event-configuration-sdk"></a>

您可以将 User-Personalization-v2 或 Personalized-Ranking-v2 配方与事件配置结合使用来进行优化。

 要借助 AWS SDK 使用事件配置来优化解决方案，请创建一个新解决方案，并在 `solutionConfig` 对象中使用 `eventsConfig` 键指定事件配置详细信息。`eventsConfig` 有一个键 `eventParametersList`，您可在该键下指定最多 10 个 `eventParameters`。每个 `eventParameter` 都包含以下字段：
+ eventType：指定您在创建解决方案时要考虑的事件类型。
+ eventValueThreshold：指定事件值阈值。只有事件值大于或等于此阈值的事件才会被考虑用于创建解决方案。
+ weight：为每种事件类型指定权重。权重越高意味着事件类型对创建的解决方案越重要。

------
#### [ SDK for Python (Boto3) ]

```
import boto3

personalize = boto3.client('personalize')

create_solution_response = personalize.create_solution(
    name= 'solution name', 
    recipeArn = 'recipe arn', 
    datasetGroupArn = 'dataset group arn',
    solutionConfig = {
       "eventsConfig": {
          "eventParametersList": [
             {"eventType":"Purchase", 
              "eventValueThreshold":0.1, 
              "weight":0.3}, 
             {"eventType":"Click", 
              "weight":0.1}
          ]
       }
    }
)
solution_arn = create_solution_response['solutionArn']
print('solution_arn: ', solution_arn)
```

------
#### [ SDK for Java 2.x ]

```
public static String createPersonalizeSolution(PersonalizeClient personalizeClient, 
							  String datasetGroupArn, 
							  String solutionName, 
							  String recipeArn,
							  ) {
    
try {
    EventsConfig eventsConfig = EventsConfig.builder()
        .eventsParameterList(eventsParameterList)
        .build();

    SolutionConfig solutionConfig = SolutionConfig.builder()
        .eventsConfig(eventsConfig)
        .build();

    CreateSolutionRequest solutionRequest = CreateSolutionRequest.builder()
        .name(solutionName)
        .datasetGroupArn(datasetGroupArn)
        .recipeArn(recipeArn)
        .solutionConfig(solutionConfig)
        .build();

    CreateSolutionResponse solutionResponse = personalizeClient.createSolution(solutionRequest);
    
    return solutionResponse.solutionArn();

} catch (PersonalizeException e) {
    System.err.println(e.awsErrorDetails().errorMessage());
    System.exit(1);
}
return "";
```

------

解决方案准备就绪后，创建一个新的解决方案版本（有关示例命令，请参阅[创建解决方案 (AWS SDK)](create-solution.md#configure-solution-sdk)）。创建解决方案版本后，可以通过解决方案版本指标查看优化性能。请参阅[衡量优化性能](optimizing-solution-for-objective.md#measuring-performance)。

# 超级参数和 HPO
<a name="customizing-solution-config-hpo"></a>

**重要**  
默认情况下，所有新解决方案都使用自动训练。如果使用自动训练，则在解决方案处于活动状态时，就会产生训练费用。为避免产生不必要的费用，在完成后，可以[更新解决方案](updating-solution.md)以关闭自动训练。有关训练费用的信息，请参阅 [Amazon Personalize 定价](https://aws.amazon.com/personalize/pricing/)。

您可以在训练之前指定超参数，以便针对您的特定使用案例优化经过训练的模型。这与模型参数相反，后者的值在训练过程中确定。

超参数是使用 `algorithmHyperParameters` 键指定的，该键是传递到 [CreateSolution](API_CreateSolution.md) 操作的 [SolutionConfig](API_SolutionConfig.md) 对象的一部分。

`CreateSolution` 请求的精简版本如下。该示例包括 `solutionConfig` 对象。您使用 `solutionConfig` 来覆盖食谱的默认参数。

```
{
  "name": "string",
  "recipeArn": "string",
  "eventType": "string",
  "solutionConfig": {
      "optimizationObjective": {
          "itemAttribute": "string",
          "objectiveSensitivity": "string"
      },
      "eventValueThreshold": "string",
      "featureTransformationParameters": {
          "string" : "string"
      },
      "algorithmHyperParameters": {
          "string" : "string"
      },
      "hpoConfig": {
          "algorithmHyperParameterRanges": {
              ...
          },
          "hpoResourceConfig": {
              "maxNumberOfTrainingJobs": "string",
              "maxParallelTrainingJobs": "string"
          }
      },
  },
}
```

使用不同超级参数的不同食谱。有关可用的超级参数，请参阅[选择食谱](working-with-predefined-recipes.md)中的各个配方。

## 启用超参数优化
<a name="hpo-tuning"></a>

超参数优化 (HPO) 或调整是针对特定学习目标选择最佳超参数的任务。最佳超级参数是通过运行使用来自指定可能性范围的不同值的很多训练任务确定的。

使用 [User-Personalization-v2](native-recipe-user-personalization-v2.md) 和 [Personalized-Ranking-v2](native-recipe-personalized-ranking-v2.md) 时，如果开启自动训练，则 Amazon Personalize 将每 90 天自动执行一次 HPO。如果没有开启自动训练，就不会执行 HPO。对于所有其他配方，必须启用 HPO。要使用 HPO，请将 `performHPO` 设置为 `true`，并包含 `hpoConfig` 对象。

超参数可以是分类值、连续值或整数值。`hpoConfig` 对象具有与所有这些类型对应的键，您可以在其中指定超级参数及其范围。您必须在请求中提供每种类型，但是如果食谱没有某个类型的参数，则您可以将其留空。例如，User-Personalization 没有连续类型的可调整超参数。因此，对于 `continousHyperParameterRange`，您可以传递一个空数组。

以下代码显示了如何使用 SDK for Python (Boto3) 创建启用了 HPO 的解决方案。本示例中的解决方案使用 [User-Personalization 食谱](native-recipe-new-item-USER_PERSONALIZATION.md)食谱，并将 HPO 设置为 `true`。代码为 `hidden_dimension`、`categoricalHyperParameterRanges` 和 `integerHyperParameterRanges` 提供值。`continousHyperParameterRange` 为空，`hpoResourceConfig` 设置为 `maxNumberOfTrainingJobs` 和 `maxParallelTrainingJobs`。

```
import boto3

personalize = boto3.client('personalize')

create_solution_response = personalize.create_solution(
    name = "solution name",
    datasetGroupArn = 'arn:aws:personalize:region:accountId:dataset-group/datasetGroupName',
    recipeArn = 'arn:aws:personalize:::recipe/aws-user-personalization',
    performHPO = True,
    solutionConfig = {
        "algorithmHyperParameters": {
          "hidden_dimension": "55"
        },
        "hpoConfig": {
          "algorithmHyperParameterRanges": {
              "categoricalHyperParameterRanges": [
                  {
                      "name": "recency_mask",
                      "values": [ "true", "false"]
                  }
              ],
              "integerHyperParameterRanges": [
                  {
                      "name": "bptt",
                      "minValue": 2,
                      "maxValue": 22
                  }
              ],
              "continuousHyperParameterRanges": [

              ]
          },
          "hpoResourceConfig": {
              "maxNumberOfTrainingJobs": "4",
              "maxParallelTrainingJobs": "2"
          }
        }
    }
)
```

有关 HPO 的更多信息，请参阅[自动模型优化](https://docs.aws.amazon.com/sagemaker/latest/dg/automatic-model-tuning.html)。

## 查看超参数
<a name="viewing-hyperparameters"></a>

您可以通过调用 [DescribeSolution](API_DescribeSolution.md) 操作来查看解决方案的超参数。下面的示例显示了 `DescribeSolution` 输出。创建解决方案版本（训练模型）后，您还可以通过 [DescribeSolutionVersion](API_DescribeSolutionVersion.md) 操作查看超参数。

```
{
  "solution": {
    "name": "hpo_coonfig_solution",
    "solutionArn": "arn:aws:personalize:region:accountId:solution/solutionName",
    "performHPO": true,
    "performAutoML": false,
    "recipeArn": "arn:aws:personalize:::recipe/aws-user-personalization",
    "datasetGroupArn": "arn:aws:personalize:region:accountId:dataset-group/datasetGroupName",
    "eventType": "click",
    "solutionConfig": {
      "hpoConfig": {
        "hpoResourceConfig": {
          "maxNumberOfTrainingJobs": "4",
          "maxParallelTrainingJobs": "2"
        },
        "algorithmHyperParameterRanges": {
          "integerHyperParameterRanges": [
            {
              "name": "training.bptt",
              "minValue": 2,
              "maxValue": 22
            }
          ],
          "continuousHyperParameterRanges": [],
          "categoricalHyperParameterRanges": [
            {
              "name": "data.recency_mask",
              "values": [
                "true",
                "false"
              ]
            }
          ]
        }
      },
      "algorithmHyperParameters": {
        "hidden_dimension": "55"
      }
    },
    "status": "ACTIVE",
    "creationDateTime": "2022-07-08T12:12:48.565000-07:00",
    "lastUpdatedDateTime": "2022-07-08T12:12:48.565000-07:00"
  }
}
```

# 选择用于训练的物品交互数据
<a name="event-values-types"></a>

**重要**  
默认情况下，所有新解决方案都使用自动训练。如果使用自动训练，则在解决方案处于活动状态时，就会产生训练费用。为避免产生不必要的费用，在完成后，可以[更新解决方案](updating-solution.md)以关闭自动训练。有关训练费用的信息，请参阅 [Amazon Personalize 定价](https://aws.amazon.com/personalize/pricing/)。

您可以在物品交互数据集中选择 Amazon Personalize 在创建解决方案版本（训练模型）时使用的事件。通过在训练之前选择物品交互数据，您可以只使用数据的相关子集进行训练，或者去除噪声来训练更优化的模型。有关物品交互数据集的更多信息，请参阅[物品交互数据](interactions-datasets.md)。

**注意**  
如果您使用 User-Personalization-v2 或 Personalized-Ranking-v2，则在按事件类型或值进行筛选之前，训练费用将基于物品交互数据。有关定价的更多信息，请参阅 [Amazon Personalize 定价](https://aws.amazon.com/personalize/pricing/)。

您可以按如下方式选择物品交互数据：
+ **根据类型选择记录** - 配置解决方案时，如果您的物品交互数据集在 EVENT\$1TYPE 列中包含事件类型，则您可以选择指定要在训练中使用的事件类型。例如，如果您的项目交互数据集包含*购买*、*点击*和*观看*事件类型，并且您希望 Amazon Personalize 仅使用*观看*事件来训练模型，则在配置解决方案时，您需要提供*观看*作为 Amazon Personalize 在训练中使用的 `event type`。

  如果您有多个事件类型，并且使用了 User-Personalization-v2 配方或 Personalized-Ranking-v2 配方，则在配置自定义解决方案时，您可以为不同的类型指定不同的权重。例如，您可以配置一个解决方案，为购买事件赋予高于点击事件的权重。有关更多信息，请参阅 [使用事件配置优化解决方案](optimizing-solution-events-config.md)。

   如果您的物品交互数据集在 EVENT\$1TYPE 列中有多个事件类型，并且您在配置解决方案时未提供某个事件类型，则 Amazon Personalize 会使用所有物品交互数据进行训练，无论其类型如何，权重均相同。
+ **根据类型和值选择记录** - 配置解决方案时，如果物品交互数据集包含 EVENT\$1TYPE 和 EVENT\$1VALUE 字段，则您可以将特定值设置为阈值，以从训练中排除记录。例如，如果 EVENT\$1TYPE 为*观看* 的事件的 EVENT\$1VALUE 数据是用户观看的视频的百分比，如果您将事件值阈值设置为 0.5，将事件类型设置为*观看*，则 Amazon Personalize 将仅使用 EVENT\$1VALUE 大于或等于 0.5 的*观看* 交互事件来训练模型。

以下代码演示了如何使用适用于 Python（Boto3）的 SDK 创建仅使用 `watch` 事件（用户观看了一半以上视频）的解决方案。

```
import boto3

personalize = boto3.client('personalize')

create_solution_response = personalize.create_solution(
    name = 'solution name',
    datasetGroupArn = 'arn:aws:personalize:region:accountId:dataset-group/datasetGroupName',
    recipeArn = 'arn:aws:personalize:::recipe/aws-user-personalization-v2',
    eventType = 'watch',
    solutionConfig = {
        "eventValueThreshold": "0.5"
    }
)

# Store the solution ARN
solution_arn = create_solution_response['solutionArn']

# Use the solution ARN to get the solution status
solution_description = personalize.describe_solution(solutionArn = solution_arn)['solution']
print('Solution status: ' + solution_description['status'])
```

# 克隆解决方案（控制台）
<a name="cloning-solution"></a>

 创建新解决方案时，您可以使用 Amazon Personalize 控制台来克隆解决方案。克隆解决方案时，您可以使用现有解决方案的配置（例如食谱和超参数）作为起点，并根据需要进行任何更改。如果您想对解决方案进行一项更改，但保留所有其他属性不变，则这样做很有用。例如，向数据集添加一列新的训练数据。在这种情况下，您可以克隆解决方案，为解决方案命名，更改训练时使用的列，并保持所有其他属性不变。

## 克隆解决方案
<a name="cloning-solution-console"></a>

要克隆解决方案，您需选择现有解决方案，然后选择**克隆解决方案**选项。随后，为新解决方案命名，并修改相关字段。

**克隆解决方案**

1. 打开 Amazon Personalize 控制台（网址为 [https://console.aws.amazon.com/personalize/home](https://console.aws.amazon.com/personalize/home)），并登录您的账户。

1.  在**数据集组**页面，选择您的数据集组。

1.  选择**自定义资源**，然后选择**解决方案**。

1.  选择要克隆的解决方案。

1. 选择**操作**，然后选择**克隆解决方案**。

1. 为新解决方案命名。

1. 对解决方案详细信息和高级配置进行任何更改。Amazon Personalize 会使用现有解决方案中的值预填充这些字段。有关每个字段的信息，请参阅[在 Amazon Personalize 中配置自定义解决方案](customizing-solution-config.md)。

# 更新解决方案以更改其自动训练配置
<a name="updating-solution"></a>

创建解决方案后，您可以更改其自动训练配置和事件配置：
+ 您可以打开或关闭自动训练，也可以更改训练频率。
  + 如果开启自动训练，则第一次自动训练将在解决方案更新完成后的一小时内开始。如果您在一小时内手动创建解决方案版本，则解决方案会跳过第一次自动训练。
  + 如果您修改解决方案的训练频率，则训练计划会重置，并且新的解决方案版本将在一小时内开始训练。解决方案版本的创建继续按新的频率进行，即第 1 天是更新解决方案的那一天。
+ 您可以更新解决方案事件配置。如果解决方案已指定一个事件配置，则新的事件配置将替换原来的配置。有关针对事件配置优化解决方案的信息，请参阅[使用事件配置优化解决方案](optimizing-solution-events-config.md)。

可以使用 Amazon Personalize 控制台、AWS Command Line Interface 或 AWS SDK 更新解决方案。解决方案更新要几分钟。在更新过程中，您可以为解决方案创建解决方案版本，但不能删除解决方案。在更新完成之前，解决方案使用之前的配置。有关自动训练的更多信息，请参阅[配置自动训练](solution-config-auto-training.md)。

**Topics**
+ [更新解决方案（控制台）](#update-solution-console)
+ [更新解决方案（AWS CLI）](#update-solution-cli)
+ [更新解决方案 (AWS SDK)](#update-solution-sdk)

## 更新解决方案（控制台）
<a name="update-solution-console"></a>

 要在控制台中更新解决方案，请导航到解决方案，选择更新，然后指定要使用的新配置。

**配置解决方案**

1. 打开 Amazon Personalize 控制台（网址为 [https://console.aws.amazon.com/personalize/home](https://console.aws.amazon.com/personalize/home)），并登录您的账户。

1. 在**数据集组**页面，选择您的数据集组。

1. 在导航窗格中，选择**自定义资源**，然后选择**解决方案和配方**。

1. 选择您的解决方案，然后选择右上角的**更新**。

1. 在**自动训练**中，修改解决方案是否使用自动训练。如果自动训练已开启，则可以更改 `Automatic training frequency`。默认训练频率为每 7 天一次。

1. 选择**更新解决方案**。您可以在解决方案的详细信息页面上找到解决方案更新的状态。

## 更新解决方案（AWS CLI）
<a name="update-solution-cli"></a>

要使用 AWS Command Line Interface 更新解决方案，请使用 `update-solution` 命令。此命令使用 [UpdateSolution](API_UpdateSolution.md) API 操作。以下代码展示了如何更新解决方案以使用训练频率为 5 天的自动训练。要关闭自动训练，请指定 `--no-perform-auto-training` 并省略 `solution-update-config`。

默认训练频率为每 7 天一次。表达式必须采用以下格式：`rate(value unit)`。对于值，指定一个介于 1 和 30 之间的数字。对于单位，请指定 `day` 或 `days`。

```
aws personalize update-solution \
--solution-arn solution ARN \
--perform-auto-training \
--solution-update-config "{\"autoTrainingConfig\": {\"schedulingExpression\": \"rate(5 days)\"}}"
```

要获取更新的状态，请使用 `describe-solution` 命令（使用 [DescribeSolution](API_DescribeSolution.md) API 操作），并在 `latestSolutionUpdate` 中找到更新状态。

## 更新解决方案 (AWS SDK)
<a name="update-solution-sdk"></a>

要使用 AWS SDK 更新解决方案，请使用 [UpdateSolution](API_UpdateSolution.md) API 操作。以下代码展示了如何使用 SDK for Python（Boto3）更新解决方案以使用训练频率为 5 天的自动训练。该代码通过 [DescribeSolution](API_DescribeSolution.md) API 操作获取更新的状态。

默认训练频率为每 7 天一次。表达式必须采用以下格式：`rate(value unit)`。对于值，指定一个介于 1 和 30 之间的数字。对于单位，请指定 `day` 或 `days`。

```
import boto3

personalize = boto3.client('personalize')

update_solution_response = personalize.update_solution(
    solutionArn='SOLUTION ARN',
    performAutoTraining=True,
    solutionUpdateConfig={
        "autoTrainingConfig": {
            "schedulingExpression": "rate(5 days)"
        }
    }
)
describe_solution_response = personalize.describe_solution(
    solutionArn='SOLUTION ARN'
)
update_status = describe_solution_response["solution"]["latestSolutionUpdate"]["status"]
print(f"Update status: {update_status}")
```

# 手动创建解决方案版本
<a name="creating-a-solution-version"></a>

完成[在 Amazon Personalize 中配置自定义解决方案](customizing-solution-config.md)后，就可以开始训练了：
+  如果您的解决方案使用自动训练，则解决方案会按照您指定的训练频率为您创建解决方案版本。默认情况下，所有新解决方案都使用自动训练，每 7 天创建一个新的解决方案版本。您仍然可以手动创建解决方案版本。有关更多信息，请参阅 [配置自动训练](solution-config-auto-training.md)。
+ 如果您关闭解决方案的自动训练，或者想要手动训练，则可以手动创建解决方案版本。*解决方案版本* 是指经过训练的机器学习模型。您可以使用控制台、AWS Command Line Interface (AWS CLI) 或 AWS SDK 创建解决方案版本。如果解决方案版本的状态为 CREATE\$1PENDING 或 CREATE\$1IN\$1PROGRESS，则您可以使用 [StopSolutionVersionCreation](API_StopSolutionVersionCreation.md) 操作来停止解决方案版本的创建过程。请参阅[停止创建解决方案版本](stop-solution-version.md)。

如果由于错误而无法完成训练，则您无需支付训练费用。如果解决方案版本的状态为 CREATE\$1PENDING 或 CREATE\$1IN\$1PROGRESS，则您可以停止解决方案版本的创建过程。要停止创建解决方案版本，请导航至解决方案版本详细信息页面，然后选择**停止**。有关更多信息，请参阅 [停止创建解决方案版本](stop-solution-version.md)。

**Topics**
+ [创建解决方案版本（控制台）](#create-solution-version-console)
+ [创建解决方案版本 (AWS CLI)](#create-solution-version-cli)
+ [创建解决方案版本 (AWS SDK)](#create-solution-version-sdk)

## 创建解决方案版本（控制台）
<a name="create-solution-version-console"></a>

要使用 Amazon Personalize 控制台手动创建新的解决方案版本，请从解决方案的详细信息页面开始训练。

**创建新解决方案版本**

1. 打开 Amazon Personalize 控制台（网址为 [https://console.aws.amazon.com/personalize/home](https://console.aws.amazon.com/personalize/home)），并登录您的账户。

1. 导航到数据集组页面，然后选择包含新解决方案的数据集组。

1. 在导航窗格中的**自定义资源**下，选择**解决方案和配方**。

1. 在**解决方案和食谱**页面上，选择要创建解决方案版本的解决方案。

1. 在解决方案概述页面上，选择**创建解决方案版本**以开始训练新模型。

在解决方案详细信息页面上，您可以在**解决方案版本**部分跟踪训练进度。训练完成后，状态会变为**活动**，您可以使用 Amazon Personalize 提供的指标对其进行评估。有关更多信息，请参阅 [通过指标评估 Amazon Personalize 解决方案版本](working-with-training-metrics.md)。

 当解决方案版本处于活动状态时，就可以使用它来获得推荐。如何使用活跃解决方案版本取决于获取建议的方式：
+  要获得实时建议，必须通过 Amazon Personalize 市场活动部署活跃解决方案版本。您可以使用该市场活动为用户获取建议。请参阅[通过市场活动部署 Amazon Personalize 解决方案版本创建市场活动](campaigns.md)。
+ 对于批量建议，在创建批量推理作业或批量细分作业时指定一个活跃解决方案版本。请参阅[获取批量物品推荐](getting-batch-recommendations.md)或[获取批量用户细分](getting-user-segments.md)。

## 创建解决方案版本 (AWS CLI)
<a name="create-solution-version-cli"></a>

当您的解决方案处于活动状态时，通过运行以下命令来训练模型。将 `solution arn` 替换为 [在 Amazon Personalize 中配置自定义解决方案](customizing-solution-config.md) 中的解决方案 Amazon 资源名称 (ARN)。

```
aws personalize create-solution-version \
  --solution-arn solution arn
```

这将显示解决方案版本 ARN，例如：

```
{
  "solutionVersionArn": "arn:aws:personalize:us-west-2:acct-id:solution/SolutionName/<version-id>"
}
```

通过使用 `describe-solution-version` 命令来检查解决方案版本的训练状态。提供上一步中返回的解决方案版本 ARN。有关 API 的更多信息，请参阅[DescribeSolutionVersion](API_DescribeSolutionVersion.md)。

```
aws personalize describe-solution-version \
  --solution-version-arn solution version arn
```

将显示解决方案版本的属性和训练 `status`。最初，状态显示为 CREATE PENDING，例如：

```
{
  "solutionVersion": {
      "solutionVersionArn": "arn:aws:personalize:us-west-2:acct-id:solution/solutionName/<version-id>",
      ...,
      "status": "CREATE PENDING"
  }
}
```

训练完成后，`status` 会变为 `ACTIVE`，您可以使用 Amazon Personalize 提供的指标对其进行评估。有关更多信息，请参阅 [通过指标评估 Amazon Personalize 解决方案版本](working-with-training-metrics.md)。如果由于错误而无法完成训练，则您无需支付训练费用。

如果解决方案版本的状态为 CREATE\$1PENDING 或 CREATE\$1IN\$1PROGRESS，则您可以使用 [StopSolutionVersionCreation](API_StopSolutionVersionCreation.md) 操作来停止解决方案版本的创建过程。请参阅[停止创建解决方案版本](stop-solution-version.md)。

 当解决方案版本处于活动状态时，就可以使用它来获得推荐。如何使用活跃解决方案版本取决于获取建议的方式：
+  要获得实时建议，必须通过 Amazon Personalize 市场活动部署活跃解决方案版本。您可以使用该市场活动为用户获取建议。请参阅[通过市场活动部署 Amazon Personalize 解决方案版本创建市场活动](campaigns.md)。
+ 对于批量建议，在创建批量推理作业或批量细分作业时指定一个活跃解决方案版本。请参阅[获取批量物品推荐](getting-batch-recommendations.md)或[获取批量用户细分](getting-user-segments.md)。

## 创建解决方案版本 (AWS SDK)
<a name="create-solution-version-sdk"></a>

当您的解决方案处于活动状态时，使用以下代码创建解决方案版本。指定 [在 Amazon Personalize 中配置自定义解决方案](customizing-solution-config.md) 中的 Amazon 资源名称（ARN）。使用 [DescribeSolutionVersion](API_DescribeSolutionVersion.md) 操作来检索解决方案版本的状态。

------
#### [ SDK for Python (Boto3) ]

```
import boto3

personalize = boto3.client('personalize')
# Store the solution ARN
solution_arn = 'solution arn'
        
# Use the solution ARN to get the solution status.
solution_description = personalize.describe_solution(solutionArn = 'solution_arn')['solution']
print('Solution status: ' + solution_description['status'])

# Use the solution ARN to create a solution version.
print ('Creating solution version')
response = personalize.create_solution_version(solutionArn = solution_arn)
solution_version_arn = response['solutionVersionArn']
print('Solution version ARN: ' + solution_version_arn)

# Use the solution version ARN to get the solution version status.
solution_version_description = personalize.describe_solution_version(
    solutionVersionArn = solution_version_arn)['solutionVersion']
print('Solution version status: ' + solution_version_description['status'])
```

------
#### [ SDK for Java 2.x ]

```
public static String createPersonalizeSolutionVersion(PersonalizeClient personalizeClient, String solutionArn) {
        long maxTime = 0;
        long waitInMilliseconds = 30 * 1000; // 30 seconds
        String solutionStatus = "";
        String solutionVersionStatus = "";
        String solutionVersionArn = "";

        try {
            DescribeSolutionRequest describeSolutionRequest = DescribeSolutionRequest.builder()
                .solutionArn(solutionArn)
                .build();
            
            maxTime = Instant.now().getEpochSecond() + 3 * 60 * 60;

            // Wait until solution is active. 
            while (Instant.now().getEpochSecond() < maxTime) {

                solutionStatus = personalizeClient.describeSolution(describeSolutionRequest).solution().status();
                System.out.println("Solution status: " + solutionStatus);

                if (solutionStatus.equals("ACTIVE") || solutionStatus.equals("CREATE FAILED")) {
                    break;
                }
                try {
                    Thread.sleep(waitInMilliseconds);
                } catch (InterruptedException e) {
                    System.out.println(e.getMessage());
                }
            }
            
            // Once the solution is active, start creating a solution version.
            
            if (solutionStatus.equals("ACTIVE")) {

                CreateSolutionVersionRequest createSolutionVersionRequest = CreateSolutionVersionRequest.builder()
                    .solutionArn(solutionArn)
                    .build();
                
                CreateSolutionVersionResponse createSolutionVersionResponse = personalizeClient.createSolutionVersion(createSolutionVersionRequest);
                solutionVersionArn = createSolutionVersionResponse.solutionVersionArn();

                System.out.println("Solution version ARN: " + solutionVersionArn);

                DescribeSolutionVersionRequest describeSolutionVersionRequest = DescribeSolutionVersionRequest.builder() 
                    .solutionVersionArn(solutionVersionArn)
                    .build();
                
                maxTime = Instant.now().getEpochSecond() + 3 * 60 * 60;
                
                while (Instant.now().getEpochSecond() < maxTime) {

                    // Use the solution version ARN to get the solution version status.
                    solutionVersionStatus = personalizeClient.describeSolutionVersion(describeSolutionVersionRequest).solutionVersion().status();
                    System.out.println("Solution version status: " + solutionVersionStatus);
    
                    if (solutionVersionStatus.equals("ACTIVE") || solutionVersionStatus.equals("CREATE FAILED")) {
                        break;
                    }
                    try {
                        Thread.sleep(waitInMilliseconds);
                    } catch (InterruptedException e) {
                        System.out.println(e.getMessage());
                    }
                }
                return solutionVersionArn;
            }
        } catch(PersonalizeException e) {
            System.err.println(e.awsErrorDetails().errorMessage());
            System.exit(1);
        }
        return "";
    }
```

------
#### [ SDK for JavaScript v3 ]

```
// Get service clients module and commands using ES6 syntax.
import { CreateSolutionVersionCommand } from "@aws-sdk/client-personalize";
import { personalizeClient } from "./libs/personalizeClients.js";
// Or, create the client here.
// const personalizeClient = new PersonalizeClient({ region: "REGION"});

// Set the solution version parameters.
export const solutionVersionParam = {
  solutionArn: "SOLUTION_ARN" /* required */,
};

export const run = async () => {
  try {
    const response = await personalizeClient.send(
      new CreateSolutionVersionCommand(solutionVersionParam),
    );
    console.log("Success", response);
    return response; // For unit tests.
  } catch (err) {
    console.log("Error", err);
  }
};
run();
```

------



要检查当前解决方案版本状态，请调用 [DescribeSolutionVersion](API_DescribeSolutionVersion.md) 操作并传递从 `CreateSolutionVersion` 操作返回的解决方案版本的 ARN。训练完成后，`status` 会变为 `ACTIVE`，您可以使用 Amazon Personalize 提供的指标对其进行评估。有关更多信息，请参阅 [通过指标评估 Amazon Personalize 解决方案版本](working-with-training-metrics.md)。如果由于错误而无法完成训练，则您无需支付训练费用。

如果解决方案版本的状态为 CREATE\$1PENDING 或 CREATE\$1IN\$1PROGRESS，则您可以使用 [StopSolutionVersionCreation](API_StopSolutionVersionCreation.md) 操作来停止解决方案版本的创建过程。请参阅[停止创建解决方案版本](stop-solution-version.md)。

 当解决方案版本处于活动状态时，就可以使用它来获得推荐。如何使用活跃解决方案版本取决于获取建议的方式：
+  要获得实时建议，必须通过 Amazon Personalize 市场活动部署活跃解决方案版本。您可以使用该市场活动为用户获取建议。请参阅[通过市场活动部署 Amazon Personalize 解决方案版本创建市场活动](campaigns.md)。
+ 对于批量建议，在创建批量推理作业或批量细分作业时指定一个活跃解决方案版本。请参阅[获取批量物品推荐](getting-batch-recommendations.md)或[获取批量用户细分](getting-user-segments.md)。

# 停止创建解决方案版本
<a name="stop-solution-version"></a>

如果解决方案版本的状态为 CREATE\$1PENDING 或 CREATE\$1IN\$1PROGRESS，则您可以使用 Amazon Personalize 控制台或 [StopSolutionVersionCreation](API_StopSolutionVersionCreation.md) 操作来停止创建解决方案版本（停止训练模型）。解决方案版本停止后，就无法继续创建。您需要为解决方案版本停止创建之前使用的资源付费。

停止创建解决方案版本会结束模型训练，但不会删除解决方案版本。您仍然可以在 Amazon Personalize 控制台和 [DescribeSolutionVersion](API_DescribeSolutionVersion.md) 操作中查看解决方案版本详情。

您可以使用 Amazon Personalize 控制台、 AWS Command Line Interface (AWS CLI) 或，停止解决方案版本的创建过程 AWS SDKs。

**Topics**
+ [停止创建解决方案版本（控制台）](#stop-solution-version-console)
+ [停止创建解决方案版本 (AWS CLI)](#stop-solution-version-cli)
+ [停止创建解决方案版本 (AWS SDKs)](#stop-solution-version-sdk)

## 停止创建解决方案版本（控制台）
<a name="stop-solution-version-console"></a>

如果解决方案版本的状态为 CREATE\$1PENDING 或 CREATE\$1IN\$1PROGRESS，则您可以停止创建解决方案版本（停止训练模型）。

**停止创建解决方案版本（控制台）**

1. 在[https://console.aws.amazon.com/personalize/家](https://console.aws.amazon.com/personalize/home)中打开 Amazon Personalize 控制台并登录您的账户。

1. 在**数据集组**页面上，选择包含要停止的解决方案版本的数据集组。

1. 在导航窗格中，选择**解决方案和食谱**。

1. 在**解决方案和食谱**页面上，选择包含要停止的解决方案版本的解决方案。

1. 在**解决方案版本**中，选择要停止的解决方案版本。

1. 在解决方案版本详细信息页面上，选择**停止创建**。根据解决方案版本的原始状态，解决方案版本状态会发生如下变化：
   + CREATE\$1PENDING 更改为 CREATE\$1STOPPED。
   + CREATE\$1IN\$1PROGRESS 更改为 CREATE\$1STOPPING，然后更改为 CREATE\$1STOPPED。

## 停止创建解决方案版本 (AWS CLI)
<a name="stop-solution-version-cli"></a>

如果解决方案版本的状态为 CREATE\$1PENDING 或 CREATE\$1IN\$1PROGRESS，则您可以停止创建解决方案版本（停止训练模型）。通过以下 `stop-solution-version-creation` 命令停止使用 AWS CLI创建解决方案版本。将 `solution version arn` 替换为要停止的解决方案版本的 Amazon 资源名称 (ARN)。您需要为解决方案版本停止创建之前使用的资源付费。

```
aws personalize stop-solution-version-creation \
    --solution-version-arn solution version arn
```

通过使用 `describe-solution-version` 命令来检查解决方案版本的训练状态。

```
aws personalize describe-solution-version \
    --solution-version-arn solution version arn
```

根据解决方案版本的原始状态，解决方案版本状态会发生如下变化：
+ CREATE\$1PENDING 更改为 CREATE\$1STOPPED。

  
+ CREATE\$1IN\$1PROGRESS 更改为 CREATE\$1STOPPING，然后更改为 CREATE\$1STOPPED

## 停止创建解决方案版本 (AWS SDKs)
<a name="stop-solution-version-sdk"></a>

如果解决方案版本的状态为 CREATE\$1PENDING 或 CREATE\$1IN\$1PROGRESS，则您可以停止创建解决方案版本（停止训练模型）。以下代码显示如何停止使用 适用于 Python (Boto3) 的 AWS SDK 或创建解决方案版本 AWS SDK for Java 2.x。您需要为解决方案版本停止创建时使用的资源付费。

------
#### [ SDK for Python (Boto3) ]

使用以下 `stop_solution_version_creation` 方法停止创建解决方案版本。将 `solution_version_arn` 替换为要停止的解决方案版本的 Amazon 资源名称 (ARN)。该方法使用 [DescribeSolutionVersion](API_DescribeSolutionVersion.md) 操作来检索解决方案版本的状态。

```
import boto3

personalize = boto3.client('personalize')

response = personalize.stop_solution_version_creation(
    solutionVersionArn = solution_version_arn
)

# Use the solution version ARN to get the solution version status.
solution_version_description = personalize.describe_solution_version(
    solutionVersionArn = solution_version_arn)['solutionVersion']
print('Solution version status: ' + solution_version_description['status'])
```

------
#### [ SDK for Java 2.x ]

使用以下 `stopSolutionVersionCreation` 方法停止创建解决方案版本。将 Amazon Personalize 服务客户端和要停止创建的解决方案版本的 Amazon 资源名称 (ARN) 作为参数传递。以下代码使用 [DescribeSolutionVersion](API_DescribeSolutionVersion.md) 操作来检索解决方案版本的状态。

```
public static void stopSolutionVersionCreation(PersonalizeClient personalizeClient, String solutionVersionArn) {
    String solutionVersionStatus = "";
    
    StopSolutionVersionCreationRequest stopSolutionVersionCreationRequest = StopSolutionVersionCreationRequest.builder()
        .solutionVersionArn(solutionVersionArn)
        .build();
    
    personalizeClient.stopSolutionVersionCreation(stopSolutionVersionCreationRequest);
    
    // Use the solution version ARN to get the solution version status.
    DescribeSolutionVersionRequest describeSolutionVersionRequest = DescribeSolutionVersionRequest.builder() 
        .solutionVersionArn(solutionVersionArn)
        .build();
                    
    solutionVersionStatus = personalizeClient.describeSolutionVersion(describeSolutionVersionRequest)
        .solutionVersion()
        .status();
    System.out.println("Solution version status: " + solutionVersionStatus);
}
```

------

根据解决方案版本的原始状态，解决方案版本状态会发生如下变化：
+ CREATE\$1PENDING 更改为 CREATE\$1STOPPED。

  
+ CREATE\$1IN\$1PROGRESS 更改为 CREATE\$1STOPPING，然后更改为 CREATE\$1STOPPED。

# 通过指标评估 Amazon Personalize 解决方案版本
<a name="working-with-training-metrics"></a>

 您可以通过离线和在线指标来评估解决方案版本的性能。*在线指标* 是您在用户与实时建议的交互中观察到的实证结果。例如，您可以记录用户在浏览您的目录时的点击率。您负责生成和记录任何在线指标。

 *离线指标* 是 Amazon Personalize 在您训练解决方案版本时生成的指标。您可使用离线指标来评估模型的性能。您可以查看修改解决方案超参数产生的影响，并且可以比较同一数据集组中使用*相同数据*但针对不同配方进行训练的模型的结果。

避免比较使用不同数据训练的不同解决方案版本的指标。指标的差异可能源于数据的差异，而不是源于模型性能。例如，您可能有一个数据集组，其中包含每个用户的稀疏 `purchase` 事件数据，而另一个数据集组则包含可靠的 `view` 事件数据。根据像 `precision at K` 这样的指标，由于交互次数较多，根据查看事件数据训练的解决方案版本可能会错误地表现得更好。

 为了获得性能指标，Amazon Personalize 将输入的交互数据拆分为训练集、测试集以及验证集（验证集适用于 PERSONALIZED\$1ACTIONS）。拆分取决于您选择的食谱类型：
+  对于 USER\$1SEGMENTATION 食谱，训练集由每个用户 80% 的交互数据组成，测试集由每个用户 20% 的交互数据组成。
+  对于所有其他食谱类型，训练集由 90% 的用户及其交互数据组成。测试集由剩余的 10% 的用户及其交互数据组成。

 然后，Amazon Personalize 使用训练集创建解决方案版本。训练完成后，Amazon Personalize 会向新解决方案版本提供测试集中每位用户 90% 的最早数据作为输入。然后，Amazon Personalize 通过将解决方案版本生成的建议与测试集中每位用户 10% 的最新数据中的实际交互进行比较，计算指标。

为了生成基准以进行比较，我们建议使用[热门程度-计数](native-recipe-popularity.md)食谱，该食谱会推荐前 K 项最受欢迎的物品。

**Topics**
+ [检索解决方案版本指标](#working-with-training-metrics-metrics)
+ [指标定义](#metric-definitions)
+ [示例](#working-with-training-metrics-example)
+ [其他资源](#additional-metrics-resources)

## 检索解决方案版本指标
<a name="working-with-training-metrics-metrics"></a>

创建解决方案版本后，您可以使用指标来评估其性能。您可以使用 Amazon Personalize 控制台AWS Command Line Interface（AWS CLI）和，检索解决方案版本的指标AWSSDKs。

**Topics**
+ [检索解决方案版本指标（控制台）](#retrieving-solution-version-metrics-console)
+ [检索解决方案版本指标 (AWS CLI)](#retrieve-metrics-cli)
+ [检索解决方案版本指标 (AWSSDKs)](#retrieve-metrics-sdks)

### 检索解决方案版本指标（控制台）
<a name="retrieving-solution-version-metrics-console"></a>

要在控制台中查看推荐器指标，请导航到解决方案版本的详细信息页面。

1. 在[https://console.aws.amazon.com/personalize/家](https://console.aws.amazon.com/personalize/home)中打开 Amazon Personalize 控制台并登录您的账户。

1. 在**数据集组**页面上，选择您的自定义数据集组。

1. 在导航窗格中，选择**自定义资源**，然后选择**解决方案和食谱**。

1. 选择您的解决方案。

1. 在**解决方案版本**中，选择您的解决方案版本以查看其详细信息页面。指标列在底部窗格的**解决方案版本指标**选项卡上。有关指标的定义，请参阅[指标定义](#metric-definitions)。

   既然您评估了解决方案版本，就可以通过最适合您使用案例的指标来部署解决方案版本，以创建市场活动。有关部署解决方案的更多信息，请参阅[通过市场活动部署 Amazon Personalize 解决方案版本创建市场活动](campaigns.md)。

### 检索解决方案版本指标 (AWS CLI)
<a name="retrieve-metrics-cli"></a>

您通过调用 [GetSolutionMetrics](API_GetSolutionMetrics.md) 操作为特定解决方案版本检索指标。以下代码显示了如何使用 AWS CLI 检索指标。

```
personalize get-solution-metrics --solution-version-arn solution version ARN
```

以下是使用带有其他优化目标的 [User-Personalization](native-recipe-new-item-USER_PERSONALIZATION.md) 食谱创建的解决方案版本的输出示例。

```
{
    "solutionVersionArn": "arn:aws:personalize:us-west-2:acct-id:solution/SolutionName/<version-id>",
    "metrics": {
        "coverage": 0.27,
        "mean_reciprocal_rank_at_25": 0.0379,
        "normalized_discounted_cumulative_gain_at_5": 0.0405,
        "normalized_discounted_cumulative_gain_at_10": 0.0513,
        "normalized_discounted_cumulative_gain_at_25": 0.0828,
        "precision_at_5": 0.0136,
        "precision_at_10": 0.0102,
        "precision_at_25": 0.0091,
        "average_rewards_at_k": 0.653
    }
}
```

有关每个指标的说明，请参阅[指标定义](#metric-definitions)。既然您评估了解决方案版本，就可以通过最适合您使用案例的指标来部署解决方案版本，以创建市场活动。有关部署解决方案的更多信息，请参阅[通过市场活动部署 Amazon Personalize 解决方案版本创建市场活动](campaigns.md)。

### 检索解决方案版本指标 (AWSSDKs)
<a name="retrieve-metrics-sdks"></a>

您通过调用 [GetSolutionMetrics](API_GetSolutionMetrics.md) 操作为特定解决方案版本检索指标。使用以下代码来检索指标。

------
#### [ SDK for Python (Boto3) ]

```
import boto3

personalize = boto3.client('personalize')

response = personalize.get_solution_metrics(
    solutionVersionArn = 'solution version arn')

print(response['metrics'])
```

------
#### [ SDK for Java 2.x ]

```
public static void getSolutionVersionMetrics(PersonalizeClient personalizeClient, String solutionVersionArn) {

    try {
        GetSolutionMetricsRequest request = GetSolutionMetricsRequest.builder()
                .solutionVersionArn(solutionVersionArn)
                .build();
        Map<String, Double> metrics = personalizeClient.getSolutionMetrics(request).metrics();
        metrics.forEach((key, value) -> System.out.println(key + " " + value));
    } catch (PersonalizeException e ) {
        System.err.println(e.awsErrorDetails().errorMessage());
        System.exit(1);
    }
}
```

------

以下是使用带有其他优化目标的 [User-Personalization](native-recipe-new-item-USER_PERSONALIZATION.md) 食谱创建的解决方案版本的输出示例。

```
{
    "solutionVersionArn": "arn:aws:personalize:us-west-2:acct-id:solution/MovieSolution/<version-id>",
    "metrics": {
        "coverage": 0.27,
        "mean_reciprocal_rank_at_25": 0.0379,
        "normalized_discounted_cumulative_gain_at_5": 0.0405,
        "normalized_discounted_cumulative_gain_at_10": 0.0513,
        "normalized_discounted_cumulative_gain_at_25": 0.0828,
        "precision_at_5": 0.0136,
        "precision_at_10": 0.0102,
        "precision_at_25": 0.0091,
        "average_rewards_at_k": 0.653
    }
}
```

有关每个指标的说明，请参阅[指标定义](#metric-definitions)。既然您评估了解决方案版本，就可以通过最适合您使用案例的指标来部署解决方案版本，以创建市场活动。有关部署解决方案的更多信息，请参阅[通过市场活动部署 Amazon Personalize 解决方案版本创建市场活动](campaigns.md)。

## 指标定义
<a name="metric-definitions"></a>

下文使用以下术语描述了 Amazon Personalize 为解决方案版本生成的指标：
+ *相关建议* 是针对用户实际与之交互的物品的建议。这些物品来自测试集中每个用户 10% 的最新交互数据。
+ *排名* 是指推荐项在推荐列表中的位置。位置 1（列表的顶部）被假定为与用户最相关。

对于每个指标，数字越大（越接近 1）越好。要深入了解相关信息，请参阅[其他资源](#additional-metrics-resources)中列出的资源。

**覆盖**  
*覆盖率*的值告诉您，Amazon Personalize 可能推荐的唯一物品（针对物品推荐）、操作（针对操作推荐）或用户（针对用户细分推荐）在您的数据集中的唯一记录总数中所占的比例。  
覆盖率分数越高，意味着 Amazon Personalize 建议的目录越多，而不是重复记录相同的物品。对于具有物品浏览功能的配方（例如 User-Personalization），其覆盖率比不具备该功能的配方（例如 Similar-Items）的覆盖率更高。

**前 25 项中平均倒数排名**  
该指标可指明，模型在排名靠前的位置生成相关物品建议的能力。  
 如果您要为用户生成物品搜索结果，且不希望用户选择列表中排名靠后的物品，则可以选择*前 25 项中平均倒数排名*较高的模型。例如，用户经常在搜索结果中选择第一个烹饪食谱。Amazon Personalize 不会为 PERSONALIZED\$1ACTIONS 或 USER\$1SEGMENTATION 配方生成此指标。  
 Amazon Personalize 使用建议请求的平均倒数排名分数来计算该指标。每个倒数排名分数的计算方法如下：`1 / the rank of the highest item interacted with by the user`，其中可能的总排名为 25。用户与之交互的其他排名较低的物品将被忽略。如果用户选择了第一个物品，则分数为 1。如果没有选择任何物品，则分数为 0。  
 例如，您可以向三个不同的用户分别显示 25 条建议：  
+ 如果用户 1 单击排名为 *4* 的物品和排名为 *10* 的物品，则其倒数排名分数为 *1/4*。
+ 如果用户 2 单击排名为 *2* 的物品、排名为 *4* 的物品以及排名为 *12* 的物品，则其倒数排名分数为 1/2。
+ 如果用户 3 单击排名为 *6* 的单个物品，则其倒数排名分数为 1/6。
 所有建议请求的平均倒数排名（在本例中为 3）的计算公式为 `(1/4 + 1/2 + 1/6) / 3 = .3056`。  


**K (5/10/25) 项标准化折扣累计增益 (NDCG)**  
该指标可指明模型对物品或操作建议的排名，其中 K 是样本大小，即 5、10 或 25 条建议。如果您最感兴趣的是推荐的排名，而不仅仅是排名最高的物品或操作，则此指标非常有用（有关此信息，请参阅 `mean reciprocal rank at 25`）。例如，如果您的应用程序在轮播中一次最多显示 10 部电影，则 `NDCG at 10` 分数将非常有用。  
Amazon Personalize 根据测试集中每位用户的排名位置为建议分配权重，来计算 NDCG。每条建议被折扣一倍（给定较低的权重），具体取决于其位置。最终指标是测试集中所有用户的平均 `NDCG at K`。`NDCG at K` 假定列表中排名较低的推荐与列表中排名较高的推荐相比相关性更低。  
Amazon Personalize 使用加权系数 `1/log(1 + position)`，其中列表的顶部是位置 `1`。

**K 项精度**  
该指标可指明，根据样本大小 K（5、10 或 25）条建议，模型建议的相关性。  
 Amazon Personalize 按照以下方法计算此指标：测试集中每个用户前 K 条建议中的相关建议数量除以 K，其中 K 为 5、10 或 25。最终指标是测试集中所有用户的平均值。  
例如，如果您向用户推荐 10 个物品，而用户与其中 3 个物品交互，则 K 项精度为：3 个正确预测的物品除以总计 10 个建议物品 (`3 / 10 = .30`)。  
此指标奖励相关物品的精准建议。分数越接近 1，模型就越精确。

**精度**  
如果您使用 Next-Best-Action配方训练解决方案版本，Amazon Personalize 会生成一个`precision`指标，而不是`precision at K`。该指标告诉您，模型在预测用户实际采取的操作方面的表现如何。  
 为了计算 `precision`，对于数据集中的每个操作，Amazon Personalize 将经正确预测会采取该操作的用户数除以建议该操作的总次数。然后，Amazon Personalize 计算数据集中所有操作的平均值。  
例如，如果向 100 个用户建议了一个操作，60 个用户采取了该操作，而 40 个用户没有采取该操作，则该操作的 `precision` 为 `60 / 100 = .60`。然后，Amazon Personalize 将此计算应用于所有操作并返回平均值。  
此指标奖励相关操作的精准建议。分数越接近 1，模型就越精确。

**average\$1rewards\$1at\$1k**  
当您为具有优化目标的解决方案创建解决方案版本（训练模型）时，Amazon Personalize 会生成 `average_rewards_at_k` 指标。`average_rewards_at_k` 的分数可指明，解决方案版本在实现目标方面的性能如何。为了计算该指标，Amazon Personalize 按如下方式计算每位用户的奖励：  
`rewards_per_user = total rewards from the user's interactions with their top 25 reward generating recommendations / total rewards from the user's interactions with recommendations`  
最终 `average_rewards_at_k` 是所有 `rewards_per_user` 的平均值，即标准化为小于或等于 1 且大于 0 的十进制值。该值越接近 1，表示您期望从建议中获得的每个用户平均收益就越多。  
例如，如果您的目标是最大限度地提高单击收入，则 Amazon Personalize 将按以下方法计算每个用户分数：将用户单击的前 25 个最昂贵建议物品产生的总收入除以用户单击的所有推荐物品产生的总收入。然后，Amazon Personalize 会返回所有用户分数的标准化平均值。`average_rewards_at_k` 越接近 1，表示您期望从建议中获得的每个用户平均收入就越多。  
 有关更多信息，请参阅 [针对其他目标优化解决方案](optimizing-solution-for-objective.md)。

**normalized\$1discounted\$1cumulative\$1gain\$1with\$1event\$1weights\$1at\$1k**  
 当您为具有事件配置的解决方案创建解决方案版本（训练模型）时，Amazon Personalize 会生成 `normalized_discounted_cumulative_gain_with_event_weights_at_k` 指标。`normalized_discounted_cumulative_gain_with_event_weights_at_k` 的分数表示在考虑为每个事件类型设置的事件权重的情况下，解决方案版本的表现情况。  
 它与 k 阶标准化折损累积增益（NDCG）类似，只不过对每个正确预测的奖励分数会进行加权处理。与之不同的是，在原始 K 阶 NDCG 中，每个正确预测的权重均为 1。例如，如果“购买”权重为 0.3，“点击”权重为 0.1，正确预测“购买”项目将获得 1.5 的奖励分数，而预测“点击”项目将获得 0.5 的奖励分数。  
 有关更多信息，请参阅 [使用事件配置优化解决方案](optimizing-solution-events-config.md)。

**趋势预测准确度**  
如果您使用 [Trending-Now](native-recipe-trending-now.md) 食谱训练解决方案版本，则表示模型推荐的物品的受欢迎程度的增长率。趋势预测准确度越高（越接近 1），模型就越能正确识别热门物品。  
 为了计算受欢迎程度增长率，Amazon Personalize 将所有推荐物品的受欢迎程度增长率除以前 25 个热门物品的总受欢迎程度增长率。这些物品来自测试集中的实际交互。  
 根据您的数据分布和您选择的趋势发现频率，趋势预测准确度的值可以为 0.0。

**命中率（K 项命中率）**  
如果您使用 USER\$1SEGMENTATION 食谱训练解决方案版本，则表示预测的相关度最高的 K 个结果中与实际用户相匹配的平均用户数。实际用户是指与测试集中的物品进行实际交互的用户。K 是最相关的用户中前 1% 的用户。该值越高，表示预测越准确。

**查全率（K 项查全率）**  
如果您使用 USER\$1SEGMENTATION 食谱训练解决方案版本，则表示预测的相关度最高的 K 个结果中与实际用户相匹配的平均预测用户百分比。实际用户是指与测试集中的物品进行实际交互的用户。K 是最相关的用户中前 1% 的用户。该值越高，表示预测越准确。

**查全率**  
如果您使用 Next-Best-Action配方训练解决方案版本，则该指标会告诉您您的解决方案版本在发现用户将要与之交互的操作方面的表现如何。  
 为了计算 `recall`，对于数据集中的每个操作，Amazon Personalize 将经正确预测会采取该操作的用户数量除以测试集中实际采取该操作的总用户数量。然后，Amazon Personalize 计算数据集中所有操作的平均值。  
例如，如果 100 名用户在测试集中执行了操作，而 Amazon Personalize 预测其中有 50 名用户将采取该操作，则该操作的 `recall` 为 `50 / 100 = .50`。然后，Amazon Personalize 将此计算应用于所有操作并返回平均值。

**曲线下方的区域 (AUC)**  
如果您使用 PERSONALIZED\$1ACTIONS 配方训练了解决方案版本，则为您的解决方案版本的“接收者操作特征”曲线下方的区域。该指标告诉您，解决方案版本在正确识别用户将要采取的操作方面的表现如何。  
“接收者操作特征”曲线绘制了解决方案版本的性能。它绘制了不同阈值下的真阳性（正确预测为相关的操作）和假阳性（错误地预测为相关的操作）的比率。曲线下方的区域 (AUC) 是根据其曲线总结解决方案版本的性能的分数。  
 解决方案版本的 AUC 可介于 0 和 1 之间。越接近 1，模型就越能更好地预测用户的相关操作。

**物品受欢迎程度**  
如果您使用`aws-semantic-similarity`配方对解决方案版本进行了训练，则该指标会衡量一件商品相对于目录中其他商品的参与度（点赞、观看次数、分享次数等）。物品受欢迎程度分数越高（越接近 1），与其他物品相比，该物品累积的用户互动越多。  
为了计算商品的受欢迎程度，Amazon Personalize 会计算与每件商品互动的独立用户总数（通过浏览、点击、购买等事件）。然后，对数据集中所有项目的原始参与度进行标准化，得出的分数介于 0 和 1 之间。分数接近 0 表示参与度低，而接近 1 的分数表示目录中商品的平均参与度高。

**物品新鲜度**  
如果您使用`aws-semantic-similarity`配方对解决方案版本进行了训练，则该指标会衡量某项商品相对于其他商品最近添加到您的目录的时间。物品的新鲜度分数越高（越接近 1），则该物品的创建时间越短。  
为了计算商品的新鲜度，Amazon Personalize 使用商品数据集中的 CREATION\$1TIMESTAMP 来确定每件商品的存放时间。年龄是根据训练时间和项目创建时间戳之间的差额计算的。然后对所有物品的年龄进行标准化，较新的物品获得的分数接近 1。分数越接近 0 表示旧物品越多，而越接近 1 的分数表示目录中的平均新物品越多。

**物品相似度**  
如果您使用`aws-semantic-similarity`配方训练了解决方案版本，则此指标会根据其内容、属性和元数据来衡量推荐项目与您的输入项在语义上的相关程度。项目相似度分数越高（越接近 1），推荐的项目就越接近您的参考项目的特征。  
为了计算商品的相似度，Amazon Personalize 使用源自商品元数据和属性的语义嵌入来计算每件推荐商品和输入商品之间的相似度分数。分数接近 0 表示平均而言，目录中项目之间的语义相似度较低，而接近 1 的分数表示平均而言，目录中项目之间的语义相似度很高。该指标可帮助您了解模型在推荐中捕捉语义关系的效果如何。

## 示例
<a name="working-with-training-metrics-example"></a>

下面是一个可为特定用户生成建议列表的解决方案版本的简单示例。第二个和第五个推荐与此用户的测试数据中的记录匹配。这些是相关的推荐。如果将 `K` 设置为 `5`，将为该用户生成以下指标。

**reciprocal\$1rank**  
计算：1/2  
结果：0.5000

**normalized\$1discounted\$1cumulative\$1gain\$1at\$15**  
计算：(1/log(1 \$1 2) \$1 1/log(1 \$1 5)) / (1/log(1 \$1 1) \$1 1/log(1 \$1 2))  
结果：0.6241

**precision\$1at\$15**  
计算：2/5  
结果：0.4000

## 其他资源
<a name="additional-metrics-resources"></a>

有关通过测试评估解决方案版本的信息，请参阅[使用 A/B A/B 测试来衡量 Amazon Personalize 生成的建议的有效性](https://aws.amazon.com/blogs/machine-learning/using-a-b-testing-to-measure-the-efficacy-of-recommendations-generated-by-amazon-personalize/)。要深入了解推荐器系统的不同类型的指标，请参阅以下外部资源：
+ [MRR vs MAP vs NDCG：排名感知评估指标及何时使用这些指标](https://medium.com/swlh/rank-aware-recsys-evaluation-metrics-5191bba16832/)
+  [折扣累计增益：您应该了解的排名指标](https://medium.com/@maeliza.seymour/discounted-cumulative-gain-the-ranking-metrics-you-should-know-about-e1d1623f8cd9) 
+  [推荐器系统的 K 项查全率和精度](https://medium.com/@bond.kirill.alexandrovich/precision-and-recall-in-recommender-systems-and-some-metrics-stuff-ca2ad385c5f8) 
+  [推荐器系统的排名评估指标](https://towardsdatascience.com/ranking-evaluation-metrics-for-recommender-systems-263d0a66ef54) 
+  [接收者操作特征](https://en.wikipedia.org/wiki/Receiver_operating_characteristic) 

# 通过市场活动部署 Amazon Personalize 解决方案版本
<a name="campaigns"></a>

要获取包含自定义资源的实时建议，完成[手动创建解决方案版本](creating-a-solution-version.md)后，您就可以通过市场活动部署解决方案版本了。

 *市场活动* 部署的解决方案版本（经过训练的模型）具有预调配的事务容量，用于生成实时建议。创建市场活动后，您可以使用 [GetRecommendations](API_RS_GetRecommendations.md) 或 [GetPersonalizedRanking](API_RS_GetPersonalizedRanking.md) API 操作来获取建议。如果您获得批量物品推荐或用户细分，则无需创建市场活动。有关更多信息，请参阅[获取批量物品推荐](getting-batch-recommendations.md)或[获取批量用户细分](getting-user-segments.md)。

在创建市场活动时，您可以配置以下内容：
+ 您可以将市场活动配置为自动更新以使用解决方案的最新解决方案版本。有关更多信息，请参阅 [市场活动自动更新](#create-campaign-automatic-latest-sv-update)。
+ 您可以在推荐中启用物品元数据。有关更多信息，请参阅 [推荐中的物品元数据](#create-campaign-return-metadata)。
+ 您可以为该市场活动指定预置的每秒最低事务数。这是 Amazon Personalize 为该市场活动预置的基准事务吞吐量。它会设置市场活动处于活动状态时的最低账单费用。有关更多信息，请参阅 [预调配的最低每秒事务数和自动扩缩](#min-tps-auto-scaling)。

您可以使用 Amazon Personalize 控制台、AWS Command Line Interface (AWS CLI) 或 AWS SDK 创建市场活动。如果您想要更改现有市场活动的设置，例如在推荐中启用元数据，则必须更新您的市场活动。有关更多信息，请参阅 [更新 Amazon Personalize 市场活动的配置](update-campaigns.md)。

 当市场活动处于活动状态时，会产生市场活动费用。为避免产生不必要的费用，请务必在市场活动结束后删除它。有关市场活动成本的信息，请参阅 [Amazon Personalize 定价](https://aws.amazon.com/personalize/pricing/)。

**Topics**
+ [市场活动自动更新](#create-campaign-automatic-latest-sv-update)
+ [预调配的最低每秒事务数和自动扩缩](#min-tps-auto-scaling)
+ [推荐中的物品元数据](#create-campaign-return-metadata)
+ [创建市场活动（控制台）](#create-campaign-console)
+ [创建市场活动 (AWS CLI)](#create-campaign-cli)
+ [创建市场活动 (AWS SDK)](#create-campaign-sdk)

## 市场活动自动更新
<a name="create-campaign-automatic-latest-sv-update"></a>

创建市场活动时，您可以启用市场活动自动更新。通过自动更新，市场活动会自动更新以部署解决方案的最新自动或手动训练解决方案版本。这样您就能够更轻松地使市场活动保持最新状态。

例如，如果您的解决方案使用[自动训练](solution-config-auto-training.md)，每七天创建一个新的解决方案版本，则您的市场活动将自动更新为在每周训练中使用最新的解决方案版本。如果您不使用市场活动自动更新，则必须手动更新市场活动以部署最新的已训练模型。
+ 要在使用 Amazon Personalize 控制台创建市场活动时启用市场活动自动更新，请在**市场活动详细信息**中选择**自动更新以使用解决方案的最新解决方案版本**。您可以在市场活动详细信息页面上找到最新更新的时间戳。

  有关更多信息，请参阅 [创建市场活动（控制台）](#create-campaign-console)。
+ 要在使用 [CreateCampaign](API_CreateCampaign.md) API 操作时启用市场活动自动更新，请在 `SolutionVersionArn` 参数中以 `SolutionArn/$LATEST` 格式指定解决方案的 Amazon 资源名称（ARN）。在 `campaignConfig` 中，将 `enableMetadataWithRecommendations` 设置为 `true`。

  要获取最新市场活动更新的时间戳，您可以使用 [DescribeCampaign](API_DescribeCampaign.md) API 操作并查看响应中的 `latestCampaignUpdate` 详细信息。

  有关向您展示如何启用自动更新的代码示例，请参阅[创建市场活动 (AWS CLI)](#create-campaign-cli)或[创建市场活动 (AWS SDK)](#create-campaign-sdk)。

## 预调配的最低每秒事务数和自动扩缩
<a name="min-tps-auto-scaling"></a>

**重要**  
 高 `minProvisionedTPS` 会增加您的成本。我们建议从 1 开始设置 `minProvisionedTPS`（默认值）。使用 Amazon CloudWatch 指标跟踪您的使用情况，并在必要时增加 `minProvisionedTPS`。

 在创建 Amazon Personalize 市场活动时，您可以为该市场活动指定预置的每秒最低事务数 (`minProvisionedTPS`)。这是 Amazon Personalize 为该市场活动预置的基准事务吞吐量。它会设置市场活动处于活动状态时的最低账单费用。事务是单个 `GetRecommendations` 或 `GetPersonalizedRanking` 请求。默认 `minProvisionedTPS` 为 1。

 如果您的 TPS 增加到超过 `minProvisionedTPS`，则 Amazon Personalize 会自动纵向扩展和缩减预置容量，但从不会低于 `minProvisionedTPS`。增加容量时会有短时间延迟，这可能会导致事务丢失。当您的流量减少时，容量将恢复到 `minProvisionedTPS`。

您需要为预置的最低 TPS 付费，或者，如果您的请求超过 `minProvisionedTPS`，则需要为实际 TPS 付费。实际 TPS 是您发出的建议请求的总数。我们建议从低 `minProvisionedTPS` 开始，使用 Amazon CloudWatch 指标跟踪您的使用情况，然后根据需要增加 `minProvisionedTPS`。

有关市场活动成本的更多信息，请参阅 [Amazon Personalize 定价](https://aws.amazon.com/personalize/pricing/)。

## 推荐中的物品元数据
<a name="create-campaign-return-metadata"></a>

**重要**  
如果您使用 User-Personalization-v2 或 Personalized-Ranking-v2 配方，则元数据不会产生额外费用。对于所有其他配方和所有域应用场景，会产生额外费用。有关更多信息，请参阅 [Amazon Personalize 定价](https://aws.amazon.com/personalize/pricing/)。

获得推荐后，您可以让 Amazon Personalize 在推荐结果中包括物品元数据。在请求中，可以从物品数据集选择要包括的列。Amazon Personalize 会在建议响应中返回每个物品的这些数据。

您可以使用元数据来丰富用户界面中的建议，例如将电影的类型添加到轮播中。或者，您可以用它来直观地评测建议质量。如果您在应用程序中使用生成式人工智能，则可以将元数据插入人工智能提示中，以生成相关性更高的内容。有关 Amazon Personalize 与生成式人工智能结合使用的更多信息，请参阅[Amazon Personalize 和生成式人工智能](personalize-with-gen-ai.md)。

### 启用元数据
<a name="enabling-metadata"></a>

要向建议添加元数据，您必须拥有包含一列元数据的物品数据集。您不一定要在训练中使用元数据。有关创建数据集的信息，请参阅[创建架构和数据集](data-prep-creating-datasets.md)。有关更新数据的信息，请参阅[训练后更新数据集中的数据](updating-datasets.md)。

 如果您使用 User-Personalization-v2 或 Personalized-Ranking-v2 配方，则新市场活动会自动选择在推荐结果中包括物品元数据。您没有手动为市场活动启用元数据。对于所有其他配方和域应用场景，必须启用元数据选项：
+ 要使用 Amazon Personalize 控制台启用元数据，请在创建市场活动时，在**市场活动详细信息**中选择**在建议结果中返回物品元数据**。有关更多信息，请参阅 [创建市场活动（控制台）](#create-campaign-console)。
+ 要使用 AWS SDK 或 AWS CLI 启用元数据，请使用 [CreateCampaign](API_CreateCampaign.md) API 操作并在 `campaignConfig` 中将 `enableMetadataWithRecommendations` 设置为 `true`。有关更多信息，请参阅[创建市场活动 (AWS CLI)](#create-campaign-cli)或[创建市场活动 (AWS SDK)](#create-campaign-sdk)。

## 创建市场活动（控制台）
<a name="create-campaign-console"></a>

**重要**  
 当市场活动处于活动状态时，会产生市场活动费用。为避免产生不必要的费用，请务必在市场活动结束后删除它。有关市场活动成本的信息，请参阅 [Amazon Personalize 定价](https://aws.amazon.com/personalize/pricing/)。

在您的解决方案版本状态变为“活动”后，您就可以通过 Amazon Personalize 市场活动进行部署了。

**创建市场活动（控制台）**

1. 打开 Amazon Personalize 控制台（网址为 [https://console.aws.amazon.com/personalize/home](https://console.aws.amazon.com/personalize/home)），并登录您的账户。

1. 选择包含要部署的解决方案版本的数据集组。

1. 在导航窗格中，在**自定义资源**下选择**市场活动**。

1. 在**市场活动**选项卡上，选择**创建市场活动**。

1. 在**创建新的市场活动**页面上，对于**市场活动详细信息**，提供以下信息：
   + **市场活动名称** – 输入市场活动的名称。您在此处输入的文本将显示在市场活动控制面板和详细信息页面上。
   + **解决方案** – 选择您刚创建的解决方案。
   + **自动更新以使用解决方案的最新解决方案版本** - 选择此选项可让市场活动自动使用最新的活动解决方案版本。如果不选择此选项，则每次要部署新的解决方案版本时都必须手动更新市场活动。有关更多信息，请参阅 [市场活动自动更新](#create-campaign-automatic-latest-sv-update)。
   + **解决方案版本 ID** - 如果不通过市场活动自动更新来使用最新的解决方案版本，请选择要部署的解决方案版本的 ID。
   + **预置的每秒最低事务数（在 API 中称为 minProvisionedTPS）**– 设置 Amazon Personalize 支持的预置的每秒最低事务数。较高的值会增加费用。我们建议从 1（默认值）开始设置。使用 Amazon CloudWatch 指标跟踪您的使用情况，并在必要时增加 `minProvisionedTPS`。有关更多信息，请参阅 [预调配的最低每秒事务数和自动扩缩](#min-tps-auto-scaling)。
   + **在推荐结果中返回物品元数据** - 如果您希望在推荐结果中包括元数据，请选择此选项。如果启用了此选项，则在获取建议时可以指定物品数据集中的列。有关更多信息，请参阅 [推荐中的物品元数据](#create-campaign-return-metadata)。

1. 如果您使用了 User-Personalization 配方，则在**市场活动配置**中，可以选择输入**浏览权重**和**浏览项目中断时长**的值。有关更多信息，请参阅 [User-Personalization](native-recipe-new-item-USER_PERSONALIZATION.md)。

1. 对于**标签**，可以选择添加任何标签。有关标记 Amazon Personalize 资源的更多信息，请参阅[为 Amazon Personalize 资源添加标签](tagging-resources.md)。

1. 选择**创建市场活动**。

1. 在市场活动详细信息页面上，当市场活动状态变为**活动** 时，您可以使用市场活动来获取建议并记录展示量。有关更多信息，请参阅 [从 Amazon Personalize 获取建议](getting-recommendations.md)。

   当市场活动状态为“活动”时，市场活动即已准备就绪。如果您重新训练解决方案版本，或者想要更改市场活动设置，则必须更新您的市场活动。有关更多信息，请参阅 [更新 Amazon Personalize 市场活动的配置](update-campaigns.md)。

## 创建市场活动 (AWS CLI)
<a name="create-campaign-cli"></a>

**重要**  
 当市场活动处于活动状态时，会产生市场活动费用。为避免产生不必要的费用，请务必在市场活动结束后删除它。有关市场活动成本的信息，请参阅 [Amazon Personalize 定价](https://aws.amazon.com/personalize/pricing/)。

在您的解决方案版本变为“活动”后，您就可以通过 Amazon Personalize 市场活动进行部署了。要使用 AWS CLI 创建市场活动，请使用 `create-campaign` 命令。

以下代码示例演示了如何创建市场活动。该示例部署了使用 User-Personalization 配方的解决方案的最新解决方案版本。它创建的市场活动会自动更新以使用未来的解决方案版本。该代码使用以下配置：
+ 它将市场活动配置为自动更新，以便使用适用于您的解决方案的最新解决方案版本：`solution-version-arn` 的格式为 `solution ARN/$LATEST`，`syncWithLatestSolutionVersion` 为 `True`。要使用该代码，请将 `solution ARN` 替换为解决方案的 Amazon 资源名称（ARN）。

  要禁用自动 `syncWithLatestSolutionVersion`，请仅指定解决方案版本 ARN（不带 `/$LATEST`），并将 `syncWithLatestSolutionVersion` 设置为 `False`。
+ 它将 `enableMetadataWithRecommendations` 选项设置为 `True`。这样会启用推荐请求选项，以便将物品数据集中的物品元数据与推荐结果一起包括在内。要禁用此选项，请将其设置为 `False`。有关更多信息，请参阅 [推荐中的物品元数据](#create-campaign-return-metadata)。
+ 它将 `min-provisioned-tps` 设置为 1（默认值）。我们建议从 1 开始设置 `minProvisionedTPS`（默认值）。使用 Amazon CloudWatch 指标跟踪您的使用情况，并在必要时增加 `minProvisionedTPS`。有关更多信息，请参阅 [预调配的最低每秒事务数和自动扩缩](#min-tps-auto-scaling)。

要获得所有参数的完整列表，请参阅[CreateCampaign](API_CreateCampaign.md)。

```
aws personalize create-campaign \
--name campaign-name \
--solution-version-arn solution-arn/\$LATEST \
--min-provisioned-tps 1 \
--campaign-config "{"\"syncWithLatestSolutionVersion"\": "true", "\"enableMetadataWithRecommendations"\": "true"}"
```

当市场活动状态为“活动”时，市场活动即已准备就绪。要获取当前状态，请调用 [DescribeCampaign](API_DescribeCampaign.md) 并检查 `status` 字段是否为 `ACTIVE`。

如果您重新训练解决方案版本，但市场活动未自动更新为使用最新的解决方案版本，或者如果您想要更改市场活动设置，则必须更新您的市场活动。有关更多信息，请参阅 [更新 Amazon Personalize 市场活动的配置](update-campaigns.md)。

Amazon Personalize 为您提供用于管理市场活动的操作（如 [ListCampaigns](API_ListCampaigns.md)）以列出您创建的市场活动。您可以通过调用 [DeleteCampaign](API_DeleteCampaign.md) 来删除活动。如果您删除一个市场活动，不会删除属于该市场活动的一部分的解决方案版本。

在创建市场活动后，可以使用它来进行推荐。有关更多信息，请参阅 [从 Amazon Personalize 获取建议](getting-recommendations.md)。

## 创建市场活动 (AWS SDK)
<a name="create-campaign-sdk"></a>

**重要**  
 当市场活动处于活动状态时，会产生市场活动费用。为避免产生不必要的费用，请务必在市场活动结束后删除它。有关市场活动成本的信息，请参阅 [Amazon Personalize 定价](https://aws.amazon.com/personalize/pricing/)。

在您的解决方案版本变为“活动”后，您就可以通过 Amazon Personalize 市场活动进行部署了。要使用 AWS SDK 创建市场活动，请使用 [CreateCampaign](API_CreateCampaign.md) API 操作。

以下代码示例演示了如何创建市场活动。该代码部署了使用 User-Personalization 配方的解决方案的最新解决方案版本。它创建的市场活动会自动更新以使用未来的解决方案版本。该代码使用以下配置：
+ 它将市场活动配置为自动更新，以便使用适用于您的解决方案的最新解决方案版本：`solutionVersionArn` 的格式为 `solution ARN/$LATEST`，`syncWithLatestSolutionVersion` 为 `True`。要使用该代码，请将 `solution ARN` 替换为解决方案版本的 Amazon 资源名称（ARN）。

  要禁用自动 `syncWithLatestSolutionVersion`，请仅指定解决方案版本 ARN（不带 `/$LATEST`），并将 `syncWithLatestSolutionVersion` 设置为 `False`。
+ 它将 `enableMetadataWithRecommendations` 选项设置为 `True`。这样会启用推荐请求选项，以便将物品数据集中的物品元数据与推荐结果一起包括在内。要禁用此选项，请将其设置为 `False`。有关更多信息，请参阅 [推荐中的物品元数据](#create-campaign-return-metadata)。
+ 它将 `minProvisionedTPS` 设置为 1（默认值）。对于 `minProvisionedTPS`，我们建议从 1（默认值）开始设置。使用 Amazon CloudWatch 指标跟踪您的使用情况，并在必要时增加 `minProvisionedTPS`。有关更多信息，请参阅 [预调配的最低每秒事务数和自动扩缩](#min-tps-auto-scaling)。

要获得所有参数的完整列表，请参阅[CreateCampaign](API_CreateCampaign.md)。

------
#### [ SDK for Python (Boto3) ]

```
import boto3

personalize = boto3.client('personalize')

response = personalize.create_campaign(
    name = 'campaign name',
    solutionVersionArn = 'solution ARN/$LATEST',
    minProvisionedTPS = 1,
    campaignConfig = {"syncWithLatestSolutionVersion": True, "enableMetadataWithRecommendations": True}
)

arn = response['campaignArn']

description = personalize.describe_campaign(campaignArn = arn)['campaign']
print('Name: ' + description['name'])
print('ARN: ' + description['campaignArn'])
print('Status: ' + description['status'])
```

------
#### [ SDK for JavaScript v3 ]

```
// Get service clients module and commands using ES6 syntax.
import { CreateCampaignCommand, PersonalizeClient } from
  "@aws-sdk/client-personalize";

// create personalizeClient
const personalizeClient = new PersonalizeClient({ region: "REGION" });

// set the campaign parameters
export const createCampaignParam = {
  solutionVersionArn: "SOLUTION_ARN/$LATEST" /* required */,
  name: "NAME" /* required */,
  minProvisionedTPS: 1 /* optional */,
  campaignConfig: {   /* optional */
    syncWithLatestSolutionVersion: true,
    enableMetadataWithRecommendations: true,
  },
};

export const run = async () => {
  try {
    const response = await personalizeClient.send(
      new CreateCampaignCommand(createCampaignParam)
    );
    console.log("Success", response);
    return response; // For unit tests.
  } catch (err) {
    console.log("Error", err);
  }
};
run();
```

------

当市场活动状态为“活动”时，市场活动即已准备就绪。要获取当前状态，请调用 [DescribeCampaign](API_DescribeCampaign.md) 并检查 `status` 字段是否为 `ACTIVE`。

如果您手动重新训练解决方案版本，或如果您想要更改市场活动设置，则必须更新您的市场活动。有关更多信息，请参阅 [更新 Amazon Personalize 市场活动的配置](update-campaigns.md)。

Amazon Personalize 为您提供用于管理市场活动的操作（如 [ListCampaigns](API_ListCampaigns.md)）以列出您创建的市场活动。您可以通过调用 [DeleteCampaign](API_DeleteCampaign.md) 来删除活动。如果您删除一个市场活动，不会删除属于该市场活动的一部分的解决方案版本。

在创建您的市场活动后，请使用它来进行推荐。有关更多信息，请参阅 [从 Amazon Personalize 获取建议](getting-recommendations.md)。

# 更新 Amazon Personalize 市场活动的配置
<a name="update-campaigns"></a>

要更改市场活动的 [最低预调配的 TPS](campaigns.md#min-tps-auto-scaling)、手动部署新的解决方案版本，或修改市场活动的配置（例如，打开在推荐中包含元数据的选项），您必须手动更新市场活动。

 以下内容不需要手动更新市场活动：
+ 如果您的市场活动使用自动市场活动更新，则不必更新市场活动即可部署解决方案的最新自动或手动训练解决方案版本。有关更多信息，请参阅 [市场活动自动更新](campaigns.md#create-campaign-automatic-latest-sv-update)。
+  使用 User-Personalization-v2、User-Personalization 或 Next-Best-Action 时，Amazon Personalize 每两小时自动更新一次最新解决方案版本，以便在操作中包括新物品或操作。您的市场活动会自动使用更新的解决方案版本。

您可以使用 Amazon Personalize 控制台、AWS Command Line Interface (AWS CLI) 或 AWS SDK 手动更新市场活动。

**注意**  
要更新市场活动以打开在推荐中包含元数据的选项，您必须拥有包含一列元数据的物品数据集。您不一定要在训练中使用元数据。  
如果您的市场活动之前部署了使用 User-Personalization-v2 或 Personalized-Ranking-v2 的解决方案版本，而您正在切换到旧版本的配方，则默认情况下，包含元数据的选项处于关闭状态。您可以在更新市场活动时将其启用。有关更多信息，请参阅 [推荐中的物品元数据](campaigns.md#create-campaign-return-metadata)。

**Topics**
+ [更新市场活动（控制台）](#update-campaign-console)
+ [更新市场活动 (AWS CLI)](#update-campaign-cli)
+ [更新市场活动 (AWS SDK)](#update-campaign-sdk)

## 更新市场活动（控制台）
<a name="update-campaign-console"></a>

要部署手动再训练的解决方案版本或更改市场活动配置，您必须更新市场活动。

**更新市场活动（控制台）**

1. 打开 Amazon Personalize 控制台（网址为 [https://console.aws.amazon.com/personalize/home](https://console.aws.amazon.com/personalize/home)），并登录您的账户。

1.  选择要更新的市场活动所在的数据集组。

1. 在导航窗格中，选择**市场活动**。

1. 在**市场活动**页面上，选择要更新的市场活动。

1. 在市场活动详细信息页面上，选择**更新**。

1. 在**更新市场活动**页面上，进行更改。例如，如果您要部署经过再训练的解决方案版本，请为**解决方案版本 ID** 选择新解决方案版本的标识号。

1. 选择**更新**。Amazon Personalize 会更新市场活动以使用新的解决方案版本和任何更改的配置。

## 更新市场活动 (AWS CLI)
<a name="update-campaign-cli"></a>

要部署新的解决方案版本，更改市场活动的[最低预调配的 TPS](campaigns.md#min-tps-auto-scaling)，或更改市场活动配置，您必须更新市场活动。使用以下 `update-campaign` 命令，通过 AWS CLI 更新市场活动以使用新的解决方案版本。

将 `campaign arn` 替换为要更新的市场活动的 Amazon 资源名称 (ARN)。将 `new solution version arn` 替换为要部署的解决方案版本。

```
aws personalize update-campaign \
--campaign-arn campaign arn \
--solution-version-arn new solution version arn \
--min-provisioned-tps 1
```

## 更新市场活动 (AWS SDK)
<a name="update-campaign-sdk"></a>

要部署新的解决方案版本，更改市场活动的[最低预调配的 TPS](campaigns.md#min-tps-auto-scaling)，或更改市场活动配置，您必须更新市场活动。使用以下代码，通过 SDK for Python (Boto3) 或 SDK for Java 2.x 更新市场活动。要获得参数的完整列表，请参阅 [UpdateCampaign](API_UpdateCampaign.md)。

------
#### [ SDK for Python (Boto3) ]

使用以下 `update_campaign` 方法部署新的解决方案版本。将 `campaign arn` 替换为要更新的市场活动的 Amazon 资源名称 (ARN)，将 `new solution version arn` 替换为新解决方案版本 ARN，并选择更改 `minProvisionedTPS`。

```
import boto3

personalize = boto3.client('personalize')

response = personalize.update_campaign(
    campaignArn = 'campaign arn',
    solutionVersionArn = 'new solution version arn',
    minProvisionedTPS = 1,
)

arn = response['campaignArn']

description = personalize.describe_campaign(campaignArn = arn)['campaign']
print('Name: ' + description['name'])
print('ARN: ' + description['campaignArn'])
print('Status: ' + description['status'])
```

------
#### [ SDK for Java 2.x ]

使用以下 `updateCampaign` 方法，更新市场活动以使用新的解决方案版本。将以下内容作为参数传递：Amazon Personalize 服务客户端、新解决方案版本的 Amazon 资源名称 (ARN) 以及[最低预调配的 TPS](campaigns.md#min-tps-auto-scaling)。

```
public static void updateCampaign(PersonalizeClient personalizeClient, 
                                String campaignArn,
                                String solutionVersionArn, 
                                Integer minProvisionedTPS) {

    try {    
        // build the updateCampaignRequest
        UpdateCampaignRequest updateCampaignRequest = UpdateCampaignRequest.builder()
            .campaignArn(campaignArn)
            .solutionVersionArn(solutionVersionArn)
            .minProvisionedTPS(minProvisionedTPS)
            .build();
        
        // update the campaign
        personalizeClient.updateCampaign(updateCampaignRequest);
        
        DescribeCampaignRequest campaignRequest = DescribeCampaignRequest.builder()
              .campaignArn(campaignArn)
              .build();
    
        DescribeCampaignResponse campaignResponse = personalizeClient.describeCampaign(campaignRequest);
        Campaign updatedCampaign = campaignResponse.campaign();
        
        System.out.println("The Campaign status is " + updatedCampaign.status());
    
    } catch (PersonalizeException e) {
        System.err.println(e.awsErrorDetails().errorMessage());
        System.exit(1);
    }
}
```

------