イベントの記録 - Amazon Personalize

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

イベントの記録

ドメインデータセットグループとカスタムデータセットグループの両方を使用すると、Amazon Personalize は、リアルタイムイベントデータのみ、履歴イベントデータのみ (「バルクレコードのインポート」を参照)、または両方の組み合わせに基づいてレコメンデーションを作成できます。イベントをリアルタイムで記録して、Amazon Personalize がユーザーの最新のアクティビティから学習し、ユーザーがアプリケーションを使用するごとにレコメンデーションを更新できるようにします。これにより、インタラクションデータが最新の状態に保たれ、Amazon Personalize のレコメンデーションの関連性が向上します。

AWS SDK、AWS Amplify、または AWS Command Line Interface (AWS CLI) を使用して、リアルタイムのイベントを記録できます。イベントを記録すると、Amazon Personalize は、イベントデータをデータセットグループの Interactions データセットに追加します。

AWSAmplify には JavaScript Web クライアントアプリケーションからのイベントを記録するためのライブラリ、およびサーバーコードにイベントを記録するためのライブラリ。詳細については、「Amplify - 分析」を参照してください。

イベントの記録とモデルのトレーニングに関する要件

イベントを記録するには、以下が必要です。

  • Interactions データセットを含むデータセットグループ。これは空の場合があります。使用開始方法 ガイドを完了した場合は、作成したものと同じデータセットグループおよびデータセットを使用できます。データセットグループとデータセットの作成については、「データの準備とインポート」を参照してください。

  • イベントトラッカー

  • PutEvents オペレーションの呼び出し。

空の Interactions データセットから始めて、十分なデータを記録したら、新しく記録されたイベントのみを使用してモデルをトレーニングできます。モデルをトレーニングするための最小データ要件は次のとおりです。

  • 組み合わされたやり取りデータの 1000 レコード (eventType および eventValueThreshold が指定されている場合は、それらを使用したフィルタリング後)

  • 少なくともそれぞれ 2 つのやり取りを持つ 25 人の一意のユーザー

リアルタイムイベントがレコメンデーションに与える影響

キャンペーン (カスタムソリューションの場合) またはレコメンダー (ドメインデータセットグループの場合) を作成すると、Amazon Personalize は、ユーザー向けのレコメンデーションを生成する際に、既存のアイテム (最新モデルのトレーニングまたは最新のレコメンダーの作成に使用したデータに含めたアイテム) に関して記録された新しいイベントデータを自動的に使用します。これは、モデルの再トレーニングを必要としません (カスタムソリューションに SIMS または Popularity-Count レシピを使用している場合を除く)。

代わりに、Amazon Personalize は、新しく記録されたイベントデータをユーザーの履歴に追加します。その後、Amazon Personalize は、ユーザー (およびこのユーザーのみ) 向けのレコメンデーションを生成するときに、変更されたデータを使用します。

  • 記録されたイベントの場合新しいアイテム(モデルのトレーニングに使用したデータに含まれていないアイテム)、のレコメンダーを作成した場合上位のおすすめそしてあなたにおすすめユースケース (ドメインデータセットグループの場合) または、User-Personalization を使用してモデル (ソリューションバージョン) をトレーニングした場合、Amazon Personalize は 2 時間ごとにモデルを自動的に更新します。各更新が完了すると、新しいアイテムがレコメンデーションに影響を与えます。User-Personalization レシピの自動更新については、「ユーザーパーソナライズのレシピ」を参照してください。

    その他のドメインのユースケースでは、Amazon Personalize は、レコメンダーの作成日から 7 日ごとにレコメンダー用の新しいモデルを自動的にトレーニングします。その他のカスタムレシピについては、新しいレコードがレコメンデーションに影響を与えることができるように、モデルを再トレーニングする必要があります。Amazon Personalize は、新しいアイテムに関して記録されたイベントを保存します。新しいソリューションバージョンを作成すると (新しいモデルをトレーニングすると)、この新しいデータは、ユーザー向けの Amazon Personalize のレコメンデーションに影響を与えます。

  • 新規ユーザー (レコメンダーまたはソリューションバージョンの作成に使用したデータに含まれていなかったユーザー) に関して記録されたイベントについては、レコメンデーションは、最初は人気のあるアイテムのみについてのものとなります。ユーザーのためにより多くのイベントを記録すると、レコメンデーションの関連性が高まります。Amazon Personalize は新しいユーザーデータを保存し、Amazon Personalize がレコメンダーを更新するとき、または新しいソリューションバージョンを手動でトレーニングするときにユーザーを含めます。

    新規の匿名ユーザー (userId を持たないユーザー) については、Amazon Personalize は、ユーザーがログインする前に、PutEvents 操作で渡した sessionId を使用してイベントをそのユーザーに関連付けます。これにより、ユーザーが匿名のときに発生したイベントを含む継続的なイベント履歴が作成されます。

イベントトラッカーの作成

イベントトラッカーは、新しいイベントデータ用に宛先データセットグループを指定します。イベントトラッカーは、Amazon Personalize コンソールまたは CreateEventTracker API 操作を使用して作成します。ターゲットの Interactions データセットを含むデータセットグループの Amazon リソースネーム (ARN) をパラメータとして渡します。Amazon Personalize コンソールを使用してイベントトラッカーを作成する手順については、「イベントトラッカーの作成 (コンソール)」を参照してください。

イベントトラッカーには、PutEvents 操作を使用するときにパラメータとして渡す追跡 ID が含まれています。その後、Amazon Personalize は、イベントトラッカーで指定したデータセットグループの Interactions データセットに新しいイベントデータを追加します。

注記

データセットグループ用に作成できるイベントトラッカーは 1 つだけです。

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" }
AWS 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 オペレーションを呼び出します。次の例は、必要最小限の情報を含む 1 つのイベントを渡す PutEvents 操作を示します。対応する Interactions スキーマが表示され、Interactions データセットから行の例が表示されます。

アプリケーションは、ユーザーが最初にウェブサイトにアクセスしたとき、またはアプリケーションを使用したときに、sessionId を生成します。例えば、Universally Unique Identifier (UUID) を生成し、この値を sessionId に使用できます。Amazon Personalize は、sessionId を使用して、ユーザーがログインする前にイベントをそのユーザーに関連付けます (匿名)。ユーザーがログインし、userId を含むイベントを送信すると、Amazon Personalize は、sessionId を照合することにより、以前は匿名だった履歴イベントデータをユーザーの userId に関連付けます。これにより、ユーザーが匿名のときに発生したイベントを含む継続的なイベント履歴が作成されます。最大で 1 名のユーザーを 1 つの sessionID にマッピングすることをお勧めします。

イベントリストは Event オブジェクトの配列です。各イベントについて eventType が必要ですが、この例では、eventType データはスキーマに含まれていないため、トレーニングでは使用されません。要件を満たすためにプレースホルダーの値を指定できます。

InteractionsuserIditemIdsentAt パラメータは、対応する履歴データセットの 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' }] )
AWS 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()); } }

この例を終了したら、必要なプロパティのみを使用してモデルのトレーニングに進みます。

次の例は、イベント値でトレーニングするデータを送信する方法を示しています。また、異なる種類 ('like' と 'rating') の複数のイベントが渡される様子も示します。この場合は、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 }) }] )
AWS 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()); } }
注記

プロパティキーは、Interactions スキーマのフィールドと一致するキャメルケース名を使用します。例えば、フィールド「NUM_RATINGS」がインタラクションスキーマで定義されている場合、プロパティキーは numRatings である必要があります。

インプレッションデータの記録

ユーザーパーソナライゼーションレシピまたは Domain データセットグループのデータセットのスキーマに IMPREssions フィールドを追加すると、インプレッションデータを PutEvents オペレーション. インプレッションは、ユーザーが特定のアイテムを操作した (例えば、クリックや視聴した) ときに表示されたアイテムのリストです。Amazon Personalize は、インプレッションデータを使用して探索をガイドします。レコメンデーションには、インタラクションデータや関連性が少ないアイテムが含まれます。Amazon Personalize がモデル化できる暗黙的および明示的なインプレッションについては、「インプレッションデータ」を参照してください。

重要

PutEvents リクエストで競合する暗黙的および明示的なインプレッションデータを提供する場合、Amazon Personalize は、デフォルトで明示的なインプレッションを使用します。

ユーザーに表示する Amazon Personalize のレコメンデーションをインプレッションデータとして記録するには、PutEvents リクエストに recommendationId を含めます。Amazon Personalize は、レコメンデーションデータに基づいて暗黙的なインプレッションを派生させます。

イベントのインプレッションデータを手動で記録するには、PutEvents コマンドの impression 入力パラメータにインプレッションをリストします。次のコードサンプルは、recommendationIdimpressionで PutEvents SDK for Python (Boto3) または SDK for 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 メソッドを使用して、インプレッションデータと recommendationId を使用してイベントを記録します。インプレッションのパラメータについては、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 ノートブック

Amazon Personalize を使用してイベントトラッカーを使用してリアルタイムの動作に対応する方法を示すサンプル Jupyter ノートブックについては、PutEventsオペレーション、「」を参照してください2.view_Campaign_and_interactions.ipynbgetting_startedのフォルダAmazon-パーソナライズ-サンプル GitHub repository.

サンプル実装

レコメンデーションを操作するユーザーからイベントをストリーミングする方法を示す簡単な例については、を参照してください。streaming_eventAmazon Personalize サンプル Github リポジトリにあります。

Amazon Personalize リソースとクライアントアプリケーションの間に配置されたリアルタイム API をデプロイするためのソースコードとサポートファイルを含む完全な例については、「」を参照してください。リアルタイムパーソナライゼーション APIのAWSGithub リポジトリをサンプルします。このプロジェクトには、次の実装方法が含まれています。

  • ユーザーコンテキストとユーザーイベントコレクション

  • レスポンスのキャッシュ

  • アイテムのメタデータに基づいたレコメンデーションのデコレーション

  • A/B テスト

  • API 認証