

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

# User-Personalization 食谱
<a name="native-recipe-new-item-USER_PERSONALIZATION"></a>

**重要**  
我们建议使用 [User-Personalization-v2](native-recipe-user-personalization-v2.md) 配方。它可以通过更快的训练考虑多达 500 万个物品，并以更低的延迟生成相关的推荐。

用户个性化 (aws-user-personalization) 配方针对所有个性化推荐场景进行了优化。它可预测用户最有可能与之交互的物品。您可以使用 User-Personalization 为流式传输应用程序生成个性化影片推荐，或者为零售应用程序生成个性化产品推荐。

使用 User-Personalization 时，Amazon Personalize 主要根据物品交互数据集中的用户物品交互数据来生成推荐。它还可以使用物品数据集和用户数据集中的任何物品和用户元数据。有关它使用的数据的更多信息，请参阅[必需和可选数据集](#user-personalization-datasets)。

**Topics**
+ [配方特征](#user-personalization-features)
+ [必需和可选数据集](#user-personalization-datasets)
+ [属性和超参数](#bandit-hyperparameters)
+ [使用 User-Personalization 食谱进行训练（控制台）](#training-user-personalization-recipe-console)
+ [使用 User-Personalization 食谱进行训练 (Python SDK)](#training-user-personalization-recipe)
+ [获取建议并记录展示次数 (SDK for Python (Boto3))](#user-personalization-get-recommendations-recording-impressions)
+ [示例 Jupyter 笔记本](#bandits-sample-notebooks)

## 配方特征
<a name="user-personalization-features"></a>

User-Personalization 在生成物品推荐时使用以下 Amazon Personalize 配方特征：
+ 实时个性化 - 使用实时个性化时，Amazon Personalize 会根据用户不断变化的兴趣来更新和调整物品推荐。有关更多信息，请参阅 [实时个性化](use-case-recipe-features.md#about-real-time-personalization)。
+ 浏览 - 通过浏览，推荐包括新物品或交互数据较少的物品。当您目录的更新速度非常快，或者当新物品（如新闻文章或推广）在上架之初时与用户更相关时，这可以提高物品的发现率和参与度。有关浏览的更多信息，请参阅[探索](use-case-recipe-features.md#about-exploration)。
+ 自动更新 - 通过自动更新，Amazon Personalize 每两小时自动更新一次最新模型（解决方案版本），以便为推荐考虑新物品。有关更多信息，请参阅 [自动更新](use-case-recipe-features.md#automatic-updates)。

## 必需和可选数据集
<a name="user-personalization-datasets"></a>

要使用 User-Personalization，您必须创建一个[物品交互数据集](interactions-datasets.md)，并导入至少 1000 个物品交互。Amazon Personalize 主要根据物品交互数据生成推荐。

使用 User-Personalization 时，Amazon Personalize 可以使用包含以下内容的物品交互数据：
+ 事件类型和事件值数据 - Amazon Personalize 使用事件类型数据（例如点击或观看事件类型），通过用户行为中的任何模式来识别用户的意图和兴趣。此外，您还可以在训练前使用事件类型和事件值数据来筛选记录。有关更多信息，请参阅 [事件类型和事件值数据](interactions-datasets.md#event-type-and-event-value-data)。
+ 上下文元数据 - 上下文元数据是您在事件发生时在用户环境中收集的交互数据，例如其位置或设备类型。有关更多信息，请参阅 [上下文元数据](interactions-datasets.md#interactions-contextual-metadata)。
+ 展示数据 - 展示是用户与特定物品交互（点击、观看、购买等）时可见的物品列表。有关更多信息，请参阅 [展示数据](interactions-datasets.md#interactions-impressions-data)。

 以下数据集是可选的，可以用于改进推荐：
+ 用户数据集 - Amazon Personalize 可以使用您的用户数据集中的数据来更好地了解您的用户及其兴趣。您还可以使用用户数据集中的数据来筛选推荐。有关您可以导入的用户数据的信息，请参阅[用户元数据](users-datasets.md)。
+ 物品数据集 - Amazon Personalize 可以使用您的物品数据集中的数据来识别其行为中的关联和模式。这有助于 Amazon Personalize 了解您的用户及其兴趣。您还可以使用物品数据集中的数据来筛选推荐。有关您可以导入的物品数据的信息，请参阅[物品元数据](items-datasets.md)。

## 属性和超参数
<a name="bandit-hyperparameters"></a>

User-Personalization 食谱具有以下属性：
+  **名称** – `aws-user-personalization`
+  **食谱 Amazon 资源名称 (ARN)** - `arn:aws:personalize:::recipe/aws-user-personalization`
+  **算法 ARN** - `arn:aws:personalize:::algorithm/aws-user-personalization`

有关更多信息，请参阅 [选择食谱](working-with-predefined-recipes.md)。

下表描述了 User-Personalization 食谱的超参数。*超参数* 是一个算法参数，您可以调整该参数以提高模型性能。算法超参数控制模型的执行方式。特征化超参数控制如何筛选训练中使用的数据。为超参数选择最佳值的过程称为超参数优化 (HPO)。有关更多信息，请参阅 [超级参数和 HPO](customizing-solution-config-hpo.md)。

该表为每个超参数提供以下信息：
+ **范围**：[上界, 下界]
+ **值类型**：Integer、Continuous（浮点数）、Categorical（布尔值、列表、字符串）
+ **可调 HPO**：该参数是否可以参与 HPO？

[See the AWS documentation website for more details](http://docs.amazonaws.cn/personalize/latest/dg/native-recipe-new-item-USER_PERSONALIZATION.html)

## 使用 User-Personalization 食谱进行训练（控制台）
<a name="training-user-personalization-recipe-console"></a>

要使用 User-Personalization 食谱在控制台中生成建议，请先使用食谱训练新的解决方案版本。然后，使用解决方案版本部署市场活动并使用市场活动获取建议。

**使用 User-Personalization 食谱训练新解决方案版本（控制台）**

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

1. 使用新架构创建自定义数据集组，然后上传包含展示数据的数据集。（可选）在物品数据集中包含 [CREATION\_TIMESTAMP]() 和[非结构化文本元数据](items-datasets.md#text-data)数据，这样，Amazon Personalize 就可以更准确地计算物品的使用期限并识别冷物品。

   有关导入数据的更多信息，请参阅[将训练数据导入 Amazon Personalize 数据集](import-data.md)。

1. 在**数据集组**页面上，选择包含一个或多个带有展示数据的数据集的新数据集组。

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

1. 在**创建解决方案**页面上，对于**解决方案名称**，输入新解决方案的名称。

1. 对于**解决方案类型**，选择**物品建议**，为用户获取物品建议。

1. 在**配方**中，选择 **aws-user-personalization**。这时，将显示**解决方案配置**部分，其中提供了几个配置选项。

1. 在**事件配置**中，如果您的项目交互数据集包含 EVENT\_TYPE 或同时包含 EVENT\_TYPE 和 EVENT\_VALUE 列，则可以选择使用**事件类型**和**事件值阈值**字段，来选择 Amazon Personalize 在训练模型时使用的项目交互数据。有关更多信息，请参阅 [选择用于训练的物品交互数据](event-values-types.md)。

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

1. （可选）为您的解决方案配置超参数。有关 User-Personalization 食谱属性和超参数的列表，请参阅[属性和超参数](#bandit-hyperparameters)。

1. 选择**创建并训练解决方案**以开始训练。此时，将显示**控制面板**页面。

   您可以导航到解决方案详情页面，在**解决方案版本** 部分跟踪训练进度。训练完成时，状态会变为**活动**。

**创建市场活动并获取建议（控制台）**

 当您的解决方案版本状态为**活动**时，您就可以按如下方式创建市场活动并获得建议了：

1. 在解决方案详细信息页面或**市场活动** 页面上，选择**创建新的市场活动**。

1.  在**创建新的市场活动**页面上，对于**市场活动详细信息**，提供以下信息：
   + **市场活动名称**：输入市场活动的名称。您在此处输入的文本将显示在市场活动控制面板和详细信息页面上。
   + **解决方案**：选择您刚刚创建的解决方案。
   + **解决方案版本 ID**：选择您刚刚创建的解决方案版本 ID。
   + **最低预调配每秒事务数**：设置 Amazon Personalize 支持的最低预调配每秒事务数。有关更多信息，请参阅 [CreateCampaign](API_CreateCampaign.md) 操作。

1. 对于**活动配置**，提供以下信息：
   + **浏览权重：**配置要浏览的程度，其中，建议包含的物品交互数据越少或相关性越低，您所指定的浏览频率就越高。值越接近 1，浏览次数就越多。如果值为零，则表示没有浏览，建议基于当前数据（相关性）。
   + **浏览物品期限截止**：输入自上次交互以来的最大物品期限（以天为单位），以定义物品浏览的范围。要增加 Amazon Personalize 在浏览期间考虑的物品数量，请输入更大的值。

      例如，如果您输入 10，则在浏览期间仅考虑数据集中自最近一次交互以来 10 天内具有物品交互数据的物品。
**注意**  
建议可能包括没有来自该时间范围之外的物品交互数据的物品。这是因为这些物品与用户兴趣相关，但不需要浏览识别它们。

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

1. 在市场活动详细信息页面上，当市场活动状态变为**活动** 时，您可以使用市场活动来获取建议并记录展示量。有关更多信息，请参阅“入门”中的[步骤 5：获得建议](getting-started-console.md#getting-started-console-get-recommendations)。

    Amazon Personalize 会每两小时自动更新一次最新解决方案版本，以包含新数据。您的市场活动会自动使用更新的解决方案版本。有关更多信息，请参阅 [自动更新](use-case-recipe-features.md#automatic-updates)。

   要手动更新市场活动，请先使用控制台或 [CreateSolutionVersion](API_CreateSolutionVersion.md) 操作创建和训练新的解决方案版本，并将 `trainingMode` 设置为 `update`。然后，在控制台的**市场活动** 页面或使用 [UpdateCampaign](API_UpdateCampaign.md) 操作，手动更新市场活动。
**注意**  
 Amazon Personalize 不会自动更新您在 2020 年 11 月 17 日之前创建的解决方案版本。

## 使用 User-Personalization 食谱进行训练 (Python SDK)
<a name="training-user-personalization-recipe"></a>

当您创建了数据集组并上传了包含展示数据的数据集后，您可以使用 User-Personalization 食谱训练解决方案。（可选）在物品数据集中包含 [CREATION\_TIMESTAMP]() 和[非结构化文本元数据](items-datasets.md#text-data)数据，这样，Amazon Personalize 就可以更准确地计算物品的使用期限并识别冷物品。有关创建数据集组和上传训练数据的更多信息，请参阅[为 Amazon Personalize 架构创建架构 JSON 文件](how-it-works-dataset-schema.md)。

**使用 SDK 使用用户个性化配方训练解决方案 Amazon**

1. 使用 `create_solution` 方法创建新的解决方案。

   将 `solution name` 替换为您的解决方案名称，将 `dataset group arn` 替换为数据集组的 Amazon 资源名称 (ARN)。

   ```
   import boto3
   
   personalize = boto3.client('personalize')
   
   print('Creating solution')
   create_solution_response = personalize.create_solution(name = '{{solution name}}', 
                               recipeArn = 'arn:aws:personalize:::recipe/aws-user-personalization', 
                               datasetGroupArn = '{{dataset group arn}}',
                               )
   solution_arn = create_solution_response['solutionArn']
   print('solution_arn: ', solution_arn)
   ```

   有关 aws-user-personalization配方属性和超参数的列表，请参见[属性和超参数](#bandit-hyperparameters)。

1. 使用更新的训练数据创建新的*解决方案版本*，并使用以下代码片段将 `trainingMode` 设置为 `FULL`。将 `solution arn` 替换为您的解决方案 ARN。

   ```
   import boto3
           
   personalize = boto3.client('personalize')
           
   create_solution_version_response = personalize.create_solution_version(solutionArn = '{{solution arn}}', 
                                                                  trainingMode='FULL')
   
   new_solution_version_arn = create_solution_version_response['solutionVersionArn']
   print('solution_version_arn:', new_solution_version_arn)
   ```

1. 当 Amazon Personalize 创建完解决方案版本后，使用以下参数创建市场活动：
   + 提供新的 `campaign name` 及步骤 2 中生成的 `solution version arn`。
   + 修改 `explorationWeight` 物品浏览配置超参数以配置要浏览的程度。值越接近 1.0，建议物品交互数据较少或相关性较低的物品的频率就越高。默认值为 0.3。
   + 修改 `explorationItemAgeCutOff` 物品浏览配置超参数，以提供应浏览物品的最大持续时间（相对于最新交互的天数）。该值越大，浏览期间考虑的物品就越多。

   使用以下 Python 片段创建新市场活动，其以浏览为重点，浏览截止日期为 30 天。创建市场活动通常需要几分钟，但也可能需要一个多小时。

   ```
   import boto3
           
   personalize = boto3.client('personalize')
   
   create_campaign_response = personalize.create_campaign(
       name = '{{campaign name}}',
       solutionVersionArn = '{{solution version arn}}',
       minProvisionedTPS = 1,
       campaignConfig = {"itemExplorationConfig": {"explorationWeight": "{{0.3}}", "explorationItemAgeCutOff": "{{30}}"}}
   )
   
   campaign_arn = create_campaign_response['campaignArn']
   print('campaign_arn:', campaign_arn)
   ```

    通过 User-Personalization，Amazon Personalize 每两小时自动更新一次解决方案版本，以包含新数据。您的市场活动会自动使用更新的解决方案版本。有关更多信息，请参阅 [自动更新](use-case-recipe-features.md#automatic-updates)。

   要手动更新市场活动，请先使用控制台或 [CreateSolutionVersion](API_CreateSolutionVersion.md) 操作创建和训练新的解决方案版本，并将 `trainingMode` 设置为 `update`。然后，在控制台的**市场活动** 页面或使用 [UpdateCampaign](API_UpdateCampaign.md) 操作，手动更新市场活动。
**注意**  
 Amazon Personalize 不会自动更新您在 2020 年 11 月 17 日之前创建的解决方案版本。

## 获取建议并记录展示次数 (SDK for Python (Boto3))
<a name="user-personalization-get-recommendations-recording-impressions"></a>

创建市场活动后，您可以使用它为用户获取建议并记录展示次数。有关使用获取批次推荐的信息， Amazon SDKs 请参阅[创建批量推理作业 (Amazon SDKs)](creating-batch-inference-job.md#batch-sdk)。



**获取建议并记录展示次数**

1. 调用 `get_recommendations` 方法。将 `campaign arn` 更改为新市场活动的 ARN，将 `user id` 更改为用户的 userId。

   ```
   import boto3
               
   rec_response = personalize_runtime.get_recommendations(campaignArn = '{{campaign arn}}', userId = '{{user id}}')
   print(rec_response['recommendationId'])
   ```

1. 创建用于发送 PutEvents 请求的新事件跟踪器。将 `event tracker name` 替换为事件跟踪器的名称，将 `dataset group arn` 替换为数据集组的 ARN。

   ```
   import boto3
           
   personalize = boto3.client('personalize')
   
   event_tracker_response = personalize.create_event_tracker( 
       name = '{{event tracker name}}',
       datasetGroupArn = '{{dataset group arn}}'
   )
   event_tracker_arn = event_tracker_response['eventTrackerArn']
   event_tracking_id = event_tracker_response['trackingId']
   print('eventTrackerArn:{},\n eventTrackingId:{}'.format(event_tracker_arn, event_tracking_id))
   ```

1.  使用步骤 1 中的 `recommendationId` 和步骤 2 中的 `event tracking id` 来创建新 `PutEvents` 请求。此请求记录来自用户会话的新展示数据。将 `user id` 更改为用户的 ID。

   ```
   import boto3
               
   personalize_events.put_events(
        trackingId = '{{event tracking id}}',
        userId= '{{user id}}',
        sessionId = '1',
        eventList = [{
        'sentAt': datetime.now().timestamp(),
        'eventType' : 'click',
        'itemId' : rec_response['itemList'][0]['itemId'],        
        'recommendationId': rec_response['{{recommendationId}}'],
        'impression': [item['itemId'] for item in rec_response['itemList']],
        }]
   )
   ```

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

有关展示如何使用 User-Personalization 食谱的示例 Jupyter 笔记本，请参阅[具有浏览的 User Personalization](https://github.com/aws-samples/amazon-personalize-samples/blob/master/next_steps/core_use_cases/user_personalization/user-personalization-with-exploration.ipynb)。