记录事件 - Amazon Personalize
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

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

记录事件

借助域数据集组和自定义数据集组,Amazon Personalize 可以基于实时提出建议事件仅限数据,仅限历史事件数据(请参阅导入批量记录),或者两者的混合物。实时记录事件,以便 Amazon Personalize 化可以在用户使用应用程序时从最近的活动中学习并更新建议。这使您的互动数据保持最新并提高了 Amazon Personalize 化推荐的相关性。

您可以使用Amazon开发工具包,AmazonAmplify 或Amazon Command Line Interface(Amazon CLI)。当您记录事件时,Amazon Personalize 会将事件数据附加到数据集组中的互动数据集中。

注意

AmazonAmplify 包括一个用于记录 Web 客户端应用程序中的事件的 JavaScript 库和一个用于记录服务器代码中的事件的库。有关更多信息,请参阅 。Amplify 析

记录事件和训练模特的要求

要记录事件,您需要以下项:

  • 包含一个 Interactions 数据集的数据集组,该数据集可以为空。如果你经历了开始使用指南中,您可以使用您创建的同一数据集组和数据集。有关创建数据集组和数据集的信息,请参阅准备和导入数据.

  • 事件跟踪器

  • 调用 PutEvents 操作。

您可以从空的 Intertions 数据集开始,如果记录了足够的数据,则只使用新的录制事件训练模型。训练模型的最低数据要求为:

  • 1000 条组合交互数据记录(按 eventTypeeventValueThreshold 筛选之后,如果提供)

  • 25 个唯一用户,每个用户至少 2 个交互

实时事件如何影响推荐

在您创建广告活动(用于自定义解决方案)或推荐者(适用于域数据集组)后,Amazon Personalize 会自动为现有项目(您用于训练最新模型或创建最新推荐者的数据中包含的项目)使用新的记录事件数据,在为用户。这不需要重新训练模型(除非您使用 SIMS 或 Popularity Count 配方来进行自定义解决方案)。

相反,Amazon Personalize 化会将新记录的事件数据添加到用户的历史记录中。然后,Amazon Personalize 化在为用户(仅限此用户)生成推荐时使用修改过的数据。

  • 对于录制的事件新物品(你用来训练模型的数据中没有包含的物品),如果你创建了推荐者最适合你的选择推荐给你使用案例(对于域数据集组)或者如果您使用用户个性化训练模型(解决方案版本),Amazon Personalize 会每两小时自动更新模型。每次更新完成后,新项目都会影响推荐。有关用户个性化配方的自动更新的信息,请参阅配方用户个性化配方.

    对于任何其他域名使用案例,从推荐人创建之日起,Amazon Personalize 将每 7 天自动为您的推荐人培训一次新模型。对于任何其他自定义配方,您必须重新训练新记录的模型以影响推荐。Amazon Personalize 化存储新商品记录的事件,一旦您创建新的解决方案版本(训练新模型),这些新数据将影响亚马逊为用户提供的个性化推荐。

  • 对于录制的事件新用户(不包括在用于创建推荐者或解决方案版本的数据中的用户),推荐最初仅适用于热门商品。随着您为用户记录更多事件,推荐将更加相关。Amazon Personalize 化存储新的用户数据,当 Amazon Personalize 化更新推荐人或手动训练新的解决方案版本时,将包括用户。

    对于新的匿名用户(没有 userId 的用户),Amazon Personalize 化使用sessionId你通过PutEvents操作以在用户登录之前将事件与用户关联起来。这将创建一个连续的事件历史记录,其中包括用户匿名时发生的事件。

创建事件跟踪器

网络 ACL 和安全组都允许 (因此可到达您的实例) 的发起 ping 的事件跟踪器为新事件数据指定目标数据集组。您可以使用 Amazon Personalize 化控制台或CreateEventTrackerAPI 操作。您可以将包含目标交互数据集的数据集组的 Amazon Resource Name (ARN) 作为参数传递。有关使用 Amazon Personalize 控制台创建事件跟踪器的说明,请参阅创建事件跟踪器(控制台).

事件跟踪器包括跟踪 ID,当你使用时你将它作为参数传递PutEventsoperation. 然后,Amazon Personalize 化会将新事件数据附加到您在事件跟踪器中指定的数据集组的互动数据集中。

注意

您只能为数据集组创建一个事件跟踪器。

Python
import boto3 personalize = boto3.client('personalize') response = personalize.create_event_tracker( name='MovieClickTracker', datasetGroupArn='arn:aws:personalize:us-west-2:acct-id:dataset-group/MovieClickGroup' ) print(response['eventTrackerArn']) print(response['trackingId'])

此时将显示事件跟踪器 ARN 和跟踪 ID,例如:

{ "eventTrackerArn": "arn:aws:personalize:us-west-2:acct-id:event-tracker/MovieClickTracker", "trackingId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" }
Amazon CLI
aws personalize create-event-tracker \ --name MovieClickTracker \ --dataset-group-arn arn:aws:personalize:us-west-2:acct-id:dataset-group/MovieClickGroup

此时将显示事件跟踪器 ARN 和跟踪 ID,例如:

{ "eventTrackerArn": "arn:aws:personalize:us-west-2:acct-id:event-tracker/MovieClickTracker", "trackingId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" }
SDK for Java 2.x
public static String createEventTracker(PersonalizeClient personalizeClient, String eventTrackerName, String datasetGroupArn) { String eventTrackerId = null; String eventTrackerArn = null; long maxTime = 3 * 60 * 60; long waitInMilliseconds = 30 * 1000; String status; try { CreateEventTrackerRequest createEventTrackerRequest = CreateEventTrackerRequest.builder() .name(eventTrackerName) .datasetGroupArn(datasetGroupArn) .build(); CreateEventTrackerResponse createEventTrackerResponse = personalizeClient.createEventTracker(createEventTrackerRequest); eventTrackerArn = createEventTrackerResponse.eventTrackerArn(); eventTrackerId = createEventTrackerResponse.trackingId(); System.out.println("Event tracker ARN: " + eventTrackerArn); System.out.println("Event tracker ID: " + eventTrackerId); maxTime = Instant.now().getEpochSecond() + maxTime; DescribeEventTrackerRequest describeRequest = DescribeEventTrackerRequest.builder() .eventTrackerArn(eventTrackerArn) .build(); while (Instant.now().getEpochSecond() < maxTime) { status = personalizeClient.describeEventTracker(describeRequest).eventTracker().status(); System.out.println("EventTracker status: " + status); if (status.equals("ACTIVE") || status.equals("CREATE FAILED")) { break; } try { Thread.sleep(waitInMilliseconds); } catch (InterruptedException e) { System.out.println(e.getMessage()); } } return eventTrackerId; } catch (PersonalizeException e){ System.out.println(e.awsErrorDetails().errorMessage()); System.exit(1); } return eventTrackerId; }

PutEvents 操作

要记录事件,请调用 PutEvents 操作。以下示例显示PutEvents该操作传递一个包含最少必需信息的事件。将显示对应的 Interactions 架构,以及 Interactions 数据集中的一个示例行。

您的应用程序生成sessionId当用户首次访问您的网站或使用您的应用程序时。例如,您可以生成通用唯一标识符 (UUID) 并将此值用于sessionId. Amazon Personalize 使用sessionId在用户登录之前将事件与用户关联(匿名)。用户登录并发送包括userId,Amazon Personalize 化将之前的匿名历史事件数据与他们的userId通过匹配sessionId. 这将创建一个连续的事件历史记录,其中包括用户匿名时发生的事件。我们建议最多有一个用户映射到一个用户sessionID.

事件列表是 Event 对象的数组。网络 ACL 和安全组都允许 (因此可到达您的实例) 的发起 ping 的eventType每个事件都是必需的,但在本例中,eventType数据不在训练中使用,因为它不包括在模式中。您可以提供占位符值来满足要求。

userIditemIdsentAt 参数映射到相应的历史 Interactions 数据集的 USER_ID、ITEM_ID 和 TIMESTAMP 字段。有关更多信息,请参阅 数据集和架构

相应的交互架构

Interactions schema: USER_ID, ITEM_ID, TIMESTAMP Interactions dataset: user123, item-xyz, 1543631760

代码示例

Python
import boto3 personalize_events = boto3.client(service_name='personalize-events') personalize_events.put_events( trackingId = 'tracking_id', userId= 'USER_ID', sessionId = 'session_id', eventList = [{ 'sentAt': TIMESTAMP, 'eventType': 'eventTypePlaceholder', 'itemId': 'ITEM_ID' }] )
Amazon CLI
aws personalize-events put-events \ --tracking-id tracking_id \ --user-id USER_ID \ --session-id session_id \ --event-list '[{ "sentAt": "TIMESTAMP", "eventType": "eventTypePlaceholder", "itemId": "ITEM_ID" }]'
SDK for Java 2.x
public static void putEvents(PersonalizeEventsClient personalizeEventsClient, String trackingId, String sessionId, String userId, String itemId) { try { Event event = Event.builder() .sentAt(Instant.ofEpochMilli(System.currentTimeMillis() + 10 * 60 * 1000)) .itemId(itemId) .eventType("typePlaceholder") .build(); PutEventsRequest putEventsRequest = PutEventsRequest.builder() .trackingId(trackingId) .userId(userId) .sessionId(sessionId) .eventList(event) .build(); int responseCode = personalizeEventsClient.putEvents(putEventsRequest) .sdkHttpResponse() .statusCode(); System.out.println("Response code: " + responseCode); } catch (PersonalizeEventsException e) { System.out.println(e.awsErrorDetails().errorMessage()); } }

在本示例中,您将仅使用所需属性来继续训练模型。

下一个示例说明如何提交对事件值进行训练的数据。它还演示如何传递多个不同类型(“喜欢”和“评级”)的事件。在这种情况下,您必须在 CreateSolution 操作中指定训练所基于的事件类型(参阅事件和解决方案)。该示例还显示记录额外属性的情况,numRatings,则由某些配方用作元数据。

Interactions schema: USER_ID, ITEM_ID, TIMESTAMP, EVENT_TYPE, EVENT_VALUE, NUM_RATINGS Interactions dataset: user123, movie_xyz, 1543531139, rating, 5, 12 user321, choc-ghana, 1543531760, like, 4 user111, choc-fake, 1543557118, like, 3
Python
import boto3 import json personalize_events = boto3.client(service_name='personalize-events') personalize_events.put_events( trackingId = 'tracking_id', userId= 'user555', sessionId = 'session1', eventList = [{ 'eventId': 'event1', 'sentAt': '1553631760', 'eventType': 'like', 'properties': json.dumps({ 'itemId': 'choc-panama', 'eventValue': 4, 'numRatings': 0 }) }, { 'eventId': 'event2', 'sentAt': '1553631782', 'eventType': 'rating', 'properties': json.dumps({ 'itemId': 'movie_ten', 'eventValue': 3, 'numRatings': 13 }) }] )
Amazon CLI
aws personalize-events put-events \ --tracking-id tracking_id \ --user-id user555 \ --session-id session1 \ --event-list '[{ "eventId": "event1", "sentAt": "1553631760", "eventType": "like", "properties": "{\"itemId\": \"choc-panama\", \"eventValue\": \"true\"}" }, { "eventId": "event2", "sentAt": "1553631782", "eventType": "rating", "properties": "{\"itemId\": \"movie_ten\", \"eventValue\": \"4\", \"numRatings\": \"13\"}" }]'
SDK for Java 2.x
public static void putMultipleEvents(PersonalizeEventsClient personalizeEventsClient, String trackingId, String sessionId, String userId, String event1Type, Float event1Value, String event1ItemId, int event1NumRatings, String event2Type, Float event2Value, String event2ItemId, int event2NumRatings) { ArrayList<Event> eventList = new ArrayList<Event>(); try { Event event1 = Event.builder() .eventType(event1Type) .sentAt(Instant.ofEpochMilli(System.currentTimeMillis() + 10 * 60 * 1000)) .itemId(event1ItemId) .eventValue(event1Value) .properties("{\"numRatings\": "+ event1NumRatings +"}") .build(); eventList.add(event1); Event event2 = Event.builder() .eventType(event2Type) .sentAt(Instant.ofEpochMilli(System.currentTimeMillis() + 10 * 60 * 1000)) .itemId(event2ItemId) .eventValue(event2Value) .properties("{\"numRatings\": "+ event2NumRatings +"}") .build(); eventList.add(event2); PutEventsRequest putEventsRequest = PutEventsRequest.builder() .trackingId(trackingId) .userId(userId) .sessionId(sessionId) .eventList(eventList) .build(); int responseCode = personalizeEventsClient.putEvents(putEventsRequest) .sdkHttpResponse() .statusCode(); System.out.println("Response code: " + responseCode); } catch (PersonalizeEventsException e) { System.out.println(e.awsErrorDetails().errorMessage()); } }
注意

属性键使用与交互架构中的字段匹配的采用驼峰式大小写的名称。例如,如果在交互架构中定义了字段 “NUM_RATINGS”,则属性键应为。numRatings.

记录展示数据

如果您将用户个性化为域数据集组中的数据集配方或将展示字段添加到您的架构中,您可以在 PutEvents 操作中记录展示数据。展示次数是用户在与特定项目互动(例如点击或观看)特定项目时可见的项目列表。Amazon Personalize 化使用展示量数据来指导探索,其中建议包括互动数据或相关性较少的商品。有关含蓄明确的展示 Amazon Personalize 化可以建模,请参阅展示数据.

重要

如果您在您的中提供了冲突的隐含和显式展示数据PutEvents请求,默认情况下,Amazon Personalize 化使用显式展示次数。

要记录您将用户显示为展示量数据的 Amazon Personalize 化建议,请包括recommendationId在你的PutEvents请求和 Amazon Personalize 化根据您的推荐数据得出隐含的展示次数。

要手动记录活动的展示量数据,请在PutEvents命令的impression输入参数。以下代码示例显示如何包含recommendationIdimpression在使用 SDK for Python (Boto3) 或适用于 SDK for Java 发工具包 2.x 的 PutEvents 操作中。如果您包含两者,则默认情况下,Amazon Personalize 化会使用明确的展示

SDK for Python (Boto3)
import boto3 personalize_events = boto3.client(service_name='personalize-events') personalize_events.put_events( trackingId = 'tracking_id', userId= 'userId', sessionId = 'sessionId', eventList = [{ 'eventId': 'event1', 'eventType': 'rating', 'sentAt': 1553631760, 'itemId': 'item id', 'recommendationId': 'recommendation id', 'impression': ['itemId1', 'itemId2', 'itemId3'] }] )
SDK for Java 2.x

使用以下命令putEvents方法用于记录包含展示数据和一个 CompemicId 的事件。对于展示次数参数,请将 itemID 列表作为 ArrayList 传递。

public static void putEvents(PersonalizeEventsClient personalizeEventsClient, String trackingId, String sessionId, String userId, String eventType, Float eventValue, String itemId, ArrayList<String> impressions, String recommendationId) { try { Event event = Event.builder() .eventType(eventType) .sentAt(Instant.ofEpochMilli(System.currentTimeMillis() + 10 * 60 * 1000)) .itemId(itemId) .eventValue(eventValue) .impression(impressions) .recommendationId(recommendationId) .build(); PutEventsRequest putEventsRequest = PutEventsRequest.builder() .trackingId(trackingId) .userId(userId) .sessionId(sessionId) .eventList(event) .build(); int responseCode = personalizeEventsClient.putEvents(putEventsRequest) .sdkHttpResponse() .statusCode(); System.out.println("Response code: " + responseCode); } catch (PersonalizeEventsException e) { System.out.println(e.awsErrorDetails().errorMessage()); } }

事件指标

要监控发送到 Amazon Personalize 的事件的类型和数量,请使用 Amazon CloudWatch 指标。有关更多信息,请参阅 监控 Amazon Personalize

事件和解决方案

在训练使用事件数据的模型时,CreateSolution 操作的两个参数是相关的。在记录多个事件类型时,必须指定 eventType 参数。这些区域有:eventType指示 Amazon Personalize 将哪种类型的事件用作模型训练的标签。

SolutionConfig 对象的 eventValueThreshold 参数会创建事件筛选器。在指定此参数时,仅具有大于或等于阈值的值的事件用于训练模型。使用 eventValueThreshold 时必须指定事件类型。

示例 Jupyter 笔记本

有关演示如何使用 Amazon Personalize 操作的 Jupyter 笔记本示例,该笔记本示例使用事件跟踪器和PutEvents操作,请参阅2.VIE_Campaign _AND _ 互动 .iPynb中的getting_Start的文件夹亚马逊个性化样品GitHub 存储库。