

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

# 为训练准备物品作交互数据
<a name="interactions-datasets"></a>

 *物品交互*是用户与您目录中的物品之间的积极交互事件。例如，用户在看电影、查看商品列表或购买一双鞋。您可以将有关用户与您的物品交互的数据导入到*物品交互数据集*中。您可以记录多种事件类型，例如*点击*、*观看* 或*购买*。

例如，如果用户*单击* 某件物品，然后*点赞* 了该物品，则可以让 Amazon Personalize 使用这些事件作为训练数据。对于每个事件，您将记录用户的 ID、物品的 ID、时间戳（采用 Unix 时间纪元格式）和事件类型（*单击* 和*点赞*）。然后，您可以将这两个物品交互事件添加到*物品交互数据集*中。

对于所有域应用场景和自定义配方，批量物品交互数据必须在 CSV 文件中。每一行都应代表用户和物品之间的单次交互。完成数据准备后，就可以创建架构 JSON 文件。此文件向 Amazon Personalize 提供关于数据结构的信息。有关更多信息，请参阅 [为 Amazon Personalize 架构创建架构 JSON 文件](how-it-works-dataset-schema.md)。

以下各部分提供了有关如何为 Amazon Personalize 准备物品交互数据的更多信息。有关所有数据类型的批量数据格式准则，请参阅[批量数据格式准则](preparing-training-data.md#general-formatting-guidelines)

**Topics**
+ [物品交互数据要求](#item-interaction-requirements)
+ [时间戳数据](#timestamp-data)
+ [事件类型和事件值数据](#event-type-and-event-value-data)
+ [上下文元数据](#interactions-contextual-metadata)
+ [展示数据](#interactions-impressions-data)
+ [交互数据示例](#interactions-data-schema-example)

## 物品交互数据要求
<a name="item-interaction-requirements"></a>

以下各节列出了 Amazon Personalize 的物品交互数据要求。有关其他配额，请参阅[Amazon Personalize 端点和限额](limits.md)。



### 最低训练要求
<a name="item-interaction-min"></a>

对于所有域应用场景和自定义配方，您的批量物品交互数据必须具有以下内容：
+ 至少 1000 条来自用户与您目录中的物品进行交互的物品交互记录。这些交互可以来自批量导入，也可以来自流事件，或者两者兼而有之。
+ 至少 25 个唯一的用户 ID，每位用户至少有两次物品交互。

 为获得高质量的建议，我们建议您至少有 1000 名用户的最少 5 万次物品交互，每位用户有两次或更多次物品交互。

 要创建推荐器或自定义解决方案，您必须至少创建一个*物品交互数据集*。

### 列要求
<a name="item-interaction-columns"></a>

物品交互数据必须包含以下几列。
+ USER\_ID - 与物品进行交互的用户的唯一标识符。每个事件都必须有一个 USER\_ID。它必须是 `string`，最大长度为 256 个字符。
+ ITEM\_ID - 用户与之进行交互的物品的唯一标识符。每个事件都必须有一个物品 ID。它必须是 `string`，最大长度为 256 个字符。
+ TIMESTAMP - 事件发生的时间（采用 Unix 纪元时间格式，以秒为单位）。每个交互都必须有一个 TIMESTAMP。有关更多信息，请参阅 [时间戳数据](#timestamp-data)。
+ EVENT\_TYPE - 物品交互事件的性质，例如*点击*、*观看*或*购买*。对于域推荐器，必须有一个事件类型列，并且每个交互都必须有事件类型。对于所有自定义配方，建议使用 EVENT\_TYPE 列，但这是可选的。如果添加了该列，则每个事件都必须有事件类型。有关更多信息，请参阅 [事件类型和事件值数据](#event-type-and-event-value-data)。

您可以根据应用场景和数据自由地添加其他自定义列。最大可选元数据列数为 5。这些列可以包括空值。我们建议这些列的完成度至少为 70%。

## 时间戳数据
<a name="timestamp-data"></a>

 时间戳数据必须采用 Unix 纪元时间格式，以秒为单位。例如，日期为 2020 年 7 月 31 日的纪元时间戳（以秒为单位）为 1596238243。要将日期转换为 Unix 纪元时间戳，请使用[纪元转换器 - Unix 时间戳转换器](https://www.epochconverter.com)。

Amazon Personalize 使用时间戳数据来计算时效性，并识别任何基于时间的模式。它有助于 Amazon Personalize 根据用户不断变化的偏好来更新推荐内容。

## 事件类型和事件值数据
<a name="event-type-and-event-value-data"></a>

物品交互数据集可以存储每个交互的事件类型和事件值数据。只有自定义资源才使用事件值数据。

### 事件类型数据
<a name="item-interact-event-type"></a>

物品交互的事件类型提供了有关其性质和意义的上下文信息。事件类型示例可能是*点击*、*观看* 或*购买*。Amazon Personalize 使用事件类型数据（例如*点击*或*购买*数据）来识别用户的意图和兴趣。在物品交互数据集中，不同事件类型的最大数目加上可选元数据列的总数不能超过 10。

对于域推荐器，必须有一个事件类型列，并且每个交互都必须有事件类型。对于所有自定义配方，建议使用 EVENT\_TYPE 列，但这是可选的。如果添加了该列，则每个事件都必须有事件类型。

如果您创建了自定义资源，则可以按事件类型选择用于训练的事件。如果您的数据集在 EVENT\_TYPE 列中有多个事件类型，并且在配置自定义解决方案时未提供事件类型，则 Amazon Personalize 会使用所有项目交互数据进行训练，无论其类型如何，权重均相同。有关更多信息，请参阅 [选择用于训练的物品交互数据](event-values-types.md)。

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

以下应用场景具有特定的事件类型要求：

VIDEO\_ON\_DEMAND 域应用场景
+ “因为您观看过 X”至少需要 1000 个 `Watch` 事件。
+ “最受欢迎”至少需要 1000 个 `Watch` 事件。

ECOMMERCE 域应用场景
+ “最常查看”至少需要 1000 个 `View` 事件。
+ “最畅销”至少需要 1000 个 `Purchase` 事件。

#### 正向和负向事件类型
<a name="negative-event-types"></a>

 Amazon Personalize 假设任何交互都是正向的。与负向事件类型（例如*不喜欢*）的交互不一定会阻止物品出现在用户未来的推荐中。

以下是让负向事件和用户不感兴趣内容来影响推荐的方法：
+  对于所有域应用场景和 [User-Personalization](native-recipe-new-item-USER_PERSONALIZATION.md) 配方，Amazon Personalize 都可以使用展示数据。当某个物品出现在展示数据中而用户没有选择它时，该物品不太可能出现在推荐中。有关更多信息，请参阅 [展示数据](#interactions-impressions-data)。
+ 如果您使用自定义资源并导入正向和负向事件类型，则只能对正向事件类型进行训练，然后筛选出用户与之进行负向交互的物品。有关更多信息，请参阅[选择用于训练的物品交互数据](event-values-types.md)和[筛选建议和用户细分](filter.md)。

### 事件值数据（自定义资源）
<a name="event-value-data"></a>

 事件值数据可能是用户观看过的影片的进度百分比或用户给出的评分（满分 10 分）。如果您创建自定义解决方案，则可以根据 EVENT\_TYPE 和 EVENT\_VALUE 列中的数据选择用于训练的记录。对于域推荐器，Amazon Personalize 不使用事件值数据，您也无法在训练前筛选事件。

要根据类型和值选择记录，请记录事件的事件类型和事件值数据。并非所有事件都必须有事件值。您为每个事件选择的值取决于您要排除的数据以及要记录的事件类型。例如，您可以匹配用户活动，例如*观看* 事件类型的用户观看视频的百分比。

 配置解决方案时，可以将特定值设置为从训练中排除记录的阈值。例如，如果 EVENT\_TYPE 为*观看* 的事件的 EVENT\_VALUE 数据是用户观看的视频的百分比，如果您将事件值阈值设置为 0.5，将事件类型设置为*观看*，则 Amazon Personalize 将仅使用 EVENT\_VALUE 大于或等于 0.5 的*观看* 交互事件来训练模型。

 有关更多信息，请参阅 [选择用于训练的物品交互数据](event-values-types.md)。

## 上下文元数据
<a name="interactions-contextual-metadata"></a>

 对于某些食谱和推荐器使用案例，Amazon Personalize 可以在识别底层模式时使用上下文元数据，为用户显示最相关的物品。上下文元数据是您在事件发生时在用户环境中收集的交互数据，例如其位置或设备类型。在为用户获取建议时，您也可以指定用户的上下文。

包括上下文元数据，为您的用户提供更加个性化的体验，并缩短新用户的冷启动阶段。冷启动阶段是由于缺乏历史用户数据而导致推荐的相关性较低的阶段。

 例如，如果您的物品交互 CSV 文件中包括带有 `tablet` 和 `phone` 值的 DEVICE\_TYPE 列，则 Amazon Personalize 可以了解买家在不同设备上购物的方式有何不同。在为用户获取建议时，您可以指定他们的设备，这样即使用户没有交互历史记录，建议也更具相关性。

 以下内容显示了如何为物品交互 CSV 文件设定格式，将 DEVICE\_TYPE 列作为上下文元数据。

```
ITEM_ID,USER_ID,TIMESTAMP,DEVICE_TYPE,EVENT_TYPE
shoe12345,12,1428624000,Tablet,CLICK
shoe12346,12,1420416000,Tablet,CLICK
shoe12347,12,1410652800,Tablet,BUY
shoe4444,13,1409961600,Phone,CLICK
shoe4445,13,1402876800,Phone,BUY
shoe4336,13,1402185600,Phone,CLICK
.....
```

对于域数据集组，以下推荐器使用案例可以使用上下文元数据：
+ [为您推荐](ECOMMERCE-use-cases.md#recommended-for-you-use-case)（ECOMMERCE 域）
+ [热门精选](VIDEO_ON_DEMAND-use-cases.md#top-picks-use-case)（VIDEO\_ON\_DEMAND 域）

 对于自定义资源，使用上下文元数据的食谱包括以下内容：
+  [User-Personalization-v2](native-recipe-user-personalization-v2.md) 和 [User-Personalization](native-recipe-new-item-USER_PERSONALIZATION.md) 
+  [Personalized-Ranking-v2](native-recipe-personalized-ranking-v2.md) 和 [Personalized-Ranking](native-recipe-search.md)

要了解如何在获取建议时包含上下文信息，请参阅[利用上下文元数据提高建议的相关性](contextual-metadata.md)。有关展示如何使用上下文元数据的端到端示例，请参阅以下 Amazon 机器学习博客文章：[利用上下文信息提高 Amazon Personalize 推荐的相关性](https://www.amazonaws.cn/blogs/machine-learning/increasing-the-relevance-of-your-amazon-personalize-recommendations-by-leveraging-contextual-information/)。

## 展示数据
<a name="interactions-impressions-data"></a>

展示是用户与特定物品交互（例如，单击或观看）时可见的物品列表。如果您使用提供个性化或 [User-Personalization](native-recipe-new-item-USER_PERSONALIZATION.md) 配方的域应用场景，Amazon Personalize 可以使用展示数据来指导浏览。

 在浏览中，建议包括一些通常不太可能向用户建议的物品或操作，例如新物品或操作、交互量很少的物品或操作，或者根据用户以前的行为与用户不太相关的物品或操作。物品在展示数据中出现的频率越高，Amazon Personalize 将该物品包含在浏览中的可能性就越小。

 在创建推荐器或解决方案时，Amazon Personalize 始终会从训练中排除展示数据。这是因为 Amazon Personalize 不会使用展示数据训练模型。相反，在获取建议时，它会使用展示数据来指导用户浏览。

 展示值最多可以包含 1000 个字符（包括竖线字符）。对于域数据集组，以下推荐器应用场景可以使用展示数据：
+ [为您推荐](ECOMMERCE-use-cases.md#recommended-for-you-use-case)（ECOMMERCE 域）
+ [热门精选](VIDEO_ON_DEMAND-use-cases.md#top-picks-use-case)（VIDEO\_ON\_DEMAND 域）

有关浏览的更多信息，请参阅[探索](use-case-recipe-features.md#about-exploration)。Amazon Personalize 可以对两种类型的展示进行建模：[隐式展示](#implicit-impressions-info)和[显式展示](#explicit-impressions-info)。

### 显式展示
<a name="explicit-impressions-info"></a>

*显式展示* 是您手动记录并发送到 Amazon Personalize 的展示。使用显式展示来操作 Amazon Personalize 的结果。物品的顺序没有影响。

 例如，您可能有一个购物应用程序用于提供有关鞋的建议。如果您只推荐目前有库存的鞋，则可以使用显式展示来指定这些物品。使用显式展示的建议工作流程可能如下所示：

1. 您使用 Amazon Personalize [GetRecommendations](API_RS_GetRecommendations.md) API 为其中一位用户请求建议。

1. Amazon Personalize 会为使用您的模型（解决方案版本）的用户生成建议，并在 API 响应中返回这些建议。

1. 您只向用户显示有库存的推荐的鞋。

1. 对于实时增量数据导入，当您的用户与一双鞋交互（例如单击）时，您在调用 [PutEvents](API_UBS_PutEvents.md) API 时记录该选择，并在 `impression` 参数中列出有库存的推荐物品。有关代码示例，请参阅[记录包含展示数据的物品交互事件](putevents-including-impressions-data.md)。

   要在历史物品交互数据中导入展示，您可以在 csv 文件中列出显式展示，并通过“\|”字符分隔每个物品。竖线字符计入 1000 个字符的限制。有关示例，请参阅[设置显式展示的格式](#data-prep-including-explicit-impressions)。

1. Amazon Personalize 使用展示数据来指导浏览，即未来的建议包括交互数据较少或相关性较低的新鞋。

#### 设置显式展示的格式
<a name="data-prep-including-explicit-impressions"></a>

要在 CSV 文件中包括明确的展示，请添加一个 IMPRESSION 列。对于每个物品交互，请添加使用竖线“\|”字符分隔的 itemID 列表。竖线字符计入展示数据 1000 个字符的限制。如果您在 [PutEvents](API_UBS_PutEvents.md) 操作中包括显式展示，则可以在字符串数组中指定物品。

以下是 CSV 文件的简短摘录，该文件在 `IMPRESSION` 列中包括显式展示。


| EVENT\_TYPE | 展示 | ITEM\_ID | TIMESTAMP | USER\_ID | 
| --- | --- | --- | --- | --- | 
| 单击 | 73\|70\|17\|95\|96 | 73 | 1586731606 | USER\_1 | 
| 单击 | 35\|82\|78\|57\|20\|63\|1\|90\|76\|75\|49\|71\|26\|24\|25\|6 | 35 | 1586735164 | USER\_2 | 
| ... | ... | ... | ... | ... | 

应用程序显示了用户 `USER_1`、物品 `73`、`70`、`17`、`95` 和 `96`，该用户最终选择了物品 `73`。当您根据这些数据创建新的解决方案版本时，系统将减少向用户 `USER_1` 推荐物品 `70`、`17`、`95` 和 `96` 的频率。

### 隐式展示
<a name="implicit-impressions-info"></a>

*隐式展示* 是指您向用户显示且从 Amazon Personalize 中检索的建议。您的 CSV 文件无需包括 IMPRESSION 或 RECOMMENDATION\_ID 列即可使用隐式展示。相反，您可以在 [PutEvents](API_UBS_PutEvents.md) 请求中包括 `RecommendationId`（由 [GetRecommendations](API_RS_GetRecommendations.md) 和 [GetPersonalizedRanking](API_RS_GetPersonalizedRanking.md) 操作返回）。Amazon Personalize 会根据您的建议数据得出隐式展示。

 例如，您可能有一个应用程序用于提供流视频的建议。使用隐式展示的建议工作流程可能如下所示：

1. 您使用 Amazon Personalize [GetRecommendations](API_RS_GetRecommendations.md) API 操作为其中一位用户请求视频建议。

1. Amazon Personalize 会为使用您的模型（解决方案版本）的用户生成建议，并在 API 响应中返回这些建议（含 `recommendationId`）。

1. 您在应用程序中向用户显示视频建议。

1. 当您的用户与视频交互（例如，单击）时，在调用 [PutEvents](API_UBS_PutEvents.md) API 时记录该选择，并将 `recommendationId` 作为参数包括在内。有关代码示例，请参阅[记录包含展示数据的物品交互事件](putevents-including-impressions-data.md)。

1. Amazon Personalize 使用 `recommendationId` 从之前的视频建议中获取展示数据，然后使用展示数据来指导浏览，即未来的建议包括交互数据较少或相关性较低的新视频。

   有关使用隐式展示数据记录事件的更多信息，请参阅[记录包含展示数据的物品交互事件](putevents-including-impressions-data.md)。

## 交互数据示例
<a name="interactions-data-schema-example"></a>

以下交互数据表示流视频网站上的历史用户活动。您可以使用这些数据来训练模型，以根据用户的交互数据提供电影建议。请注意，EVENT\_VALUE 的某些值为空。

```
USER_ID,ITEM_ID,EVENT_TYPE,EVENT_VALUE,TIMESTAMP
196,242,watch,.50,881250949
186,302,watch,.75,891717742
22,377,click,,878887116
244,51,click,,880606923
166,346,watch,.50,886397596
298,474,watch,.25,884182806
115,265,click,,881171488
253,465,watch,.50,891628467
305,451,watch,.75,886324817
```

Amazon Personalize 需要 `USER_ID`、`ITEM_ID` 和 `TIMESTAMP` 列。`USER_ID` 是应用程序用户的标识符。`ITEM_ID` 是影片的标识符。`EVENT_TYPE` 和 `EVENT_VALUE` 是用户交互的标识符。在示例数据中，事件是 `watch` 和 `click` 事件，值是用户观看过的视频的进度百分比。`TIMESTAMP` 表示购买影片时的 Unix 纪元时间。

完成数据准备后，就可以创建架构 JSON 文件。此文件向 Amazon Personalize 提供关于数据结构的信息。有关更多信息，请参阅 [为 Amazon Personalize 架构创建架构 JSON 文件](how-it-works-dataset-schema.md)。示例数据的架构 JSON 文件看起来就是这个样子。

```
{
  "type": "record",
  "name": "Interactions",
  "namespace": "com.amazonaws.personalize.schema",
  "fields": [
    {
      "name": "USER_ID",
      "type": "string"
    },
    {
      "name": "ITEM_ID",
      "type": "string"
    },
    { "name": "EVENT_TYPE",
      "type": "string"
    },
    {
      "name": "EVENT_VALUE",
      "type": "float"
    },
    {
      "name": "TIMESTAMP",
      "type": "long"
    }
  ],
  "version": "1.0"
}
```