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

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

记录事件

Amazon Personalize 可以基于实时提供建议event仅数据,仅限历史事件数据(请参阅导入批量记录),或两者的混合物。实时记录事件,以便 Amazon Personalize 可以从用户最近的活动中学习,并在用户使用您的应用程序时更新建议。这将使您的互动数据保持最新,并提高 Amazon Personalize 建议的相关性。

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

注意

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

记录事件和培训模型的要求

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

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

  • 一个事件跟踪器。

  • 调用 PutEvents 操作。

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

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

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

实时事件如何影响建议

在您创建广告活动后,Amazon Personalize 会在为用户生成推荐时自动为现有商品(您用于训练最新模型的数据中包含的商品)使用新记录的事件数据。这不需要重新训练模型(除非您使用的是 SIMS 或普及计数配方)。

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

  • 对于录制的事件新项目(您用于训练模型的数据中未包含的项目),如果您使用用户个性化配方训练模型(解决方案版本),Amazon Personalize 会每两小时自动更新一次模型,每次更新新项目都会影响建议。请参阅 用户个性化配方

    对于任何其他配方,您必须重新训练新记录的模型以影响建议。Amazon Personalize 存储新商品记录的事件,一旦您创建了新的解决方案版本(培训新模型),这些新数据将影响亚马逊为用户提供的个性化建议。

  • 对于录制的事件新用户(用于训练模型的数据中未包含的用户),建议最初仅针对热门项目。随着您为用户记录更多事件,建议将更加相关。Amazon Personalize 存储新的用户数据,因此您也可以重新培训模型,以获得更多相关的建议。

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

创建事件跟踪器

一个事件跟踪器指定新事件数据的目标数据集组。要创建事件跟踪器,请调用CreateEventTrackerAPI 操作,并将包含目标交互数据集的数据集组的 Amazon 资源名称 (ARN) 作为参数传递。有关使用 Amazon Personalize 控制台创建事件跟踪器的说明,请参阅创建事件跟踪器(控制台)

当您创建事件跟踪器时,响应包含一个跟踪编号,当您使用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 对象的数组。一个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)(Bto3)或适用于 Java 2.x 的软件开发工具包。如果您同时包含两者,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方法来记录包含展示数据和建议 ID 的事件。对于展示参数,请将 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. 视图活动和互动。IPynb中的正在开始亚马逊个性化示例GitHub 存储库。