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

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

记录事件

借助域数据集组和自定义数据集组,Amazon Personalize 可以实时提供建议事件仅限数据,仅限历史事件数据(请参阅导入批记录),或者两者兼而有之。实时记录事件,这样 Amazon Personalize 就可以在用户使用您的应用程序时了解用户的最新活动并更新推荐。这样可以使您的互动数据保持最新状态,并提高Amazon Personalize 推荐的相关性。

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

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

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

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

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

  • 一个事件跟踪器

  • 调用 PutEvents 操作。

您可以从空的 Interactions 数据集开始,在记录了足够的数据后,仅使用新记录的事件来训练模型。对于所有用例(域数据集组)和配方(自定义数据集组),您的交互数据在训练前必须具有以下内容:

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

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

实时事件如何影响推荐

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

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

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

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

  • 对于已录制的事件新用户(未包含在用于创建推荐者或解决方案版本的数据中的用户),推荐最初仅针对热门项目。随着您为用户记录更多的事件,推荐将变得更加相关。Amazon Personalize 会存储新的用户数据,并在 Amazon Personalize 更新您的推荐人或手动训练新的解决方案版本时使用这些数据进行培训。

    对于新的匿名用户(没有用户 ID 的用户),Amazon Personalize 使用sessionId你通过了PutEvents操作在用户登录之前将事件与用户相关联。有关更多信息,请参阅为匿名用户录制事件

创建事件跟踪器

网络 ACL 和安全组都允许 (因此可到达您的实例) 的发起 ping 的事件跟踪器为新事件数据指定目标数据集组。您可以使用Amazon Personalize 控制台或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当用户首次访问您的网站或使用您的应用程序时。Amazon Personalize erizesessionId在用户登录之前将事件与用户关联(匿名)。有关更多信息,请参阅为匿名用户录制事件.

事件列表是 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_RATINATING”,则属性键应为numRatings.

为匿名用户录制事件

您可以在用户创建账户之前为他们录制事件。这使您可以获得针对匿名用户的推荐。你可以提供sessionId作为userID在你的GetRecommendations请求.

为匿名用户记录事件,以使用他们登录前后的事件建立连续的事件历史记录。这为Amazon Personalize 提供了更多有关用户的互动数据,有助于生成更相关的推荐。

要为用户建立连续的事件历史记录,请使用以下命令至少记录一个事件sessionId来自匿名事件和他们的新userId. 然后你可以录制任意数量的事件userId. 这些区域有:sessionId可以改变。在下一次全面再培训期间,Amazon Personalize 会将userId事件历史记录追踪到sessionId. 重新训练可以是您下次创建训练模式设置为 FULL(自定义数据集组)的新解决方案版本时,也可以是针对推荐者的下一个自动再训练(域数据集组)。

再训练完成后,建议将基于匿名会话跟踪到 SessionID 的活动以及跟踪到其 userId 的任何事件。

记录展示数据

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

重要

如果您在自己的网站上提供了冲突的隐式和显式展示数据PutEvents请求,Amazon Personalize 默认使用显式展示次数。

要记录您向用户显示的展示次数数据的Amazon Personalize 推荐,请包含recommendationId在你的PutEvents请求,Amazon Personalize 将根据您的推荐数据推导出隐含的展示量。

要手动记录活动的展示次数数据,请在PutEvents指挥官的impression输入参数。以下代码示例说明如何包含recommendationId还有一个impression在一个 PutEvents 使用SDK for Python (Boto3) 或适用于 Java 的开发工具包 (Boto3)。如果您同时包含两者,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 的事件。对于 impressions 参数,将 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

Jupyter 笔记本示例

有关 Jupyter 笔记本示例,该示例说明如何使用 Amazon Personalize 对使用事件跟踪器和PutEvents操作,请参阅2.view_campaign_and_Interactions.ipynb中的getting_starte的文件夹amazon-personalize-samples GitHub 存储库。

示例实现

有关演示如何流式传输用户与推荐互动的事件的简单示例,请参阅streaming_events在Amazon Personalize 样本 Github 存储库中。

有关包含源代码和支持文件的完整示例,以部署位于 Amazon Personalize 资源和客户端应用程序之间的实时 API,请参阅实时个性化 API中的Amazon样本 Github 存储库 该项目包括如何实现以下内容:

  • 用户上下文和用户事件集合

  • 响应缓存

  • 根据物品元数据装饰推荐

  • A/B 测试

  • API 身份验证