

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

# 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？


<table>
<thead>
  <tr><th>名称</th><th>说明</th></tr>
</thead>
<tbody>
  <tr><td colspan="2">算法超参数</td></tr>
  <tr><td>hidden\_dimension</td><td>模型中使用的隐藏变量的数量。*隐藏变量* 重新创建用户的购买历史记录和物品统计数据来生成排名分数。当物品交互数据集包含更复杂的模式时，请指定更多数量的隐藏维度。使用更多隐藏维度需要更大的数据集和更多的处理时间。要确定最佳值，请使用 HPO。要使用 HPO，当您调用 [CreateSolution](API_CreateSolution.md) 和 [CreateSolutionVersion](API_CreateSolutionVersion.md) 操作时，请将 `performHPO` 设置为 `true`。<br />默认值：149<br />范围：[32, 256]<br />值类型：整数<br />HPO 可调：是</td></tr>
  <tr><td>bptt</td><td>确定是否使用基于时间的反向传播技术。*反向传播* 是一种在基于递归神经网络的算法中更新权重的技术。将 `bptt` 用于长期积分以将延迟奖励与早期事件联系起来。例如，延迟奖励可以是几次点击后进行的购买。早期事件可以是初始点击。即使在相同的事件类型（例如点击）中，最好考虑长期影响并最大化总奖励。要考虑长期效果，请使用较大的 `bptt` 值。使用较大的 `bptt` 值需要更大的数据集和更多的处理时间。<br />默认值：32<br />范围：[2, 32]<br />值类型：整数<br />HPO 可调：是</td></tr>
  <tr><td>recency\_mask</td><td>确定模型是否应考虑物品交互数据集中的最新流行趋势。最新流行趋势可能包括交互事件的基本模式的突然变化。要训练一个使最近事件具有更高权重的模型，请将 `recency_mask` 设置为 `true`。要训练一个使所有过往交互占相同权重的模型，请将 `recency_mask` 设置为 `false`。要使用相等权重获得好的建议，您可能需要较大的训练数据集。<br />默认值：`True`<br />范围：`True` 或 `False`<br />值类型：布尔值<br />HPO 可调：是</td></tr>
  <tr><td colspan="2">特征化超参数</td></tr>
  <tr><td>min\_user\_history\_length\_percentile</td><td>要包含在模型训练中的用户历史记录长度的最小百分位数。*历史记录长度* 是有关用户的数据总量。使用 `min_user_history_length_percentile` 排除历史记录长度较短的一定百分比的用户。历史记录较短的用户通常会根据物品受欢迎程度而不是用户的个人需求或需要来显示模式。删除它们可以在训练模型时更多地关注数据中的基础模式。使用直方图或类似工具查看用户历史记录长度后，请选择适当的值。我们建议您设置一个值，该值将保留大多数用户，但会删除边缘案例。<br /> 例如，设置 `min_user_history_length_percentile to 0.05` 和 `max_user_history_length_percentile to 0.95` 将包括除那些历史记录长度在最低或最高 5% 内的用户之外的所有用户。<br />默认值：0.0<br />范围：[0.0, 1.0]<br />值类型：浮点数<br />HPO 可调：否</td></tr>
  <tr><td>max\_user\_history\_length\_percentile</td><td>要包含在模型训练中的用户历史记录长度的最大百分位数。*历史记录长度* 是有关用户的数据总量。使用 `max_user_history_length_percentile` 排除具有较长历史记录长度的一定百分比的用户，因为这些用户的数据往往包含噪音。例如，机器人可能有很长的自动交互列表。删除这些用户可限制训练中的噪音。使用直方图或类似工具查看用户历史记录长度后，请选择适当的值。我们建议您设置一个值，该值将保留大多数用户，但会删除边缘案例。<br />例如，设置 `min_user_history_length_percentile to 0.05` 和 `max_user_history_length_percentile to 0.95` 将包括除那些历史记录长度在最低或最高 5% 内的用户之外的所有用户。<br />默认值：0.99<br />范围：[0.0, 1.0]<br />值类型：浮点数<br />HPO 可调：否</td></tr>
  <tr><td colspan="2">物品浏览市场活动配置超参数</td></tr>
  <tr><td>exploration\_weight</td><td>确定建议包含物品交互数据较少或相关性较低的物品的频率。值越接近 1.0，浏览次数就越多。如果值为零，则表示没有浏览，建议基于当前数据（相关性）。有关更多信息，请参阅 [CampaignConfig](API_CampaignConfig.md)。<br />默认值：0.3<br />范围：[0.0, 1.0]<br />值类型：浮点数<br />HPO 可调：否</td></tr>
  <tr><td>exploration\_item\_age\_cut\_off</td><td>指定自物品交互数据集中所有物品最近一次交互以来的最大物品使用期限（以天为单位）。这会根据物品使用期限定义物品浏览的范围。Amazon Personalize 根据物品的创建时间戳或物品交互数据（如果缺少创建时间戳数据）来确定物品使用期限。有关 Amazon Personalize 如何确定物品使用期限的更多信息，请参阅[创建时间戳数据](items-datasets.md#creation-timestamp-data)。<br />要增加 Amazon Personalize 在浏览期间考虑的物品数量，请输入更大的值。最小值为 1 天，默认值为 30 天。建议可能包括比您指定的物品使用期限截止时间更早的物品。这是因为这些物品与用户相关，而浏览并未识别出它们。<br />默认值：30.0<br />范围：正浮点数<br />值类型：浮点数<br />HPO 可调：否</td></tr>
</tbody>
</table>


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

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

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

1. 在[https://console.aws.amazon.com/personalize/家](https://console.aws.amazon.com/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 使用用户个性化配方训练解决方案 AWS**

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>

创建市场活动后，您可以使用它为用户获取建议并记录展示次数。有关使用获取批次推荐的信息， AWS SDKs 请参阅[创建批量推理作业 (AWS 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)。