公開日:2019-08-25
JAWS UG KANSAI の Amazon Personalizeをやってみよう! ハンズオンに参加してきました。
実はハンズオンで実施した内容は GitHub その他で公開されており、予め行っていたので、今回はハンズオンの内容を踏まえて試してみたことと、先日GAになった Personalize の弟分サービス Amazon Forecast について検証したことを書いてみようと思います。
(長くなってしまいましたが最後までお読みいただけると嬉しいです。Amazon Forecast については後半に書いており、続編 があります。)
まずは Amazon Personalize について、ハンズオンでは ユーザー610人による9,700本の映画視聴履歴とその評価(レーティング)のCSVファイルを Personalize にインポートし学習させます。この学習結果のモデルを Personalize では「ソリューション」と呼びます。そして、この学習結果をもとにレコメンドを提供してくれるエンドポイントを作ります。このエンドポイント(Personalize では「キャンペーン」と呼ぶ)に対して GetRecommendations API を実行すると以下のようにレコメンドを得られます。

このサンプルは https://github.com/perima/personalize-workshop をもとにしました
他のユーザーで GetRecommendations すると異なる結果が返ってきます。

別のユーザー、ID: 15 でレコメンドを取得した結果
パーソナライズされた順位の取得( GetPersonalizedRanking )
キャンペーンに問い合わせするための API `personalize-runtime` には GetRecommendations とは別に、もう一つ GetPersonalizedRanking という API があります。これは渡されたアイテムの一覧に「パーソナライズした順位」を付けて返すというものです。GetPersonalizedRanking を使用するには PERSONALIZED_RANKING タイプのレシピを使用してソリューションを作成する必要があります。PERSONALIZED_RANKING タイプのレシピは現状 Personalized-Ranking というレシピ 一つなので、このレシピを使用して、もう一つ別のソリューションを作成します。

Personalized-Ranking レシピを指定してソリューションを作成する
現状、AutoML は HRNN 系のみサポートしているようなので、Manual で使用するレシピを選択します。
Personalized-Ranking レシピで作ったソリューションを使うキャンペーンを作成すると、マネジメントコンソール画面のキャンペーンをテストする箇所の内容が変わります。ユーザーIDとアイテムの一覧(ここでは映画のID)をカンマ区切りで渡してやると順位を付けて返してきます。

GetPersonalizedRanking によるパーソナライズされた順位の取得
異なるユーザーで GetPersonalizeRanking すると、異なる順位付けで返ってきます。

ユーザーによって異なる(パーソナライズされた)順位が返る
イベントの記録( PutEvents )
Amazon Personalize は CSVでインポートしたデータだけでなく、リアルタイムに発生するイベントデータをもとにレコメンデーションを行うことが出来ます。 Amazon Personalize へ イベントを送るのを試してみました。
まず、イベントを送れるようにするには Event-Interactions という種類のデータセットを作ります。このデータセットのスキーマによって、どのようなイベントを送れるようになるかが決まってきます。このあたりは https://github.com/perima/personalize-workshop に沿うと分かりやすかったです(多謝) 以下のスキーマによって映画の評価(レーティング)を送れるようになります。
{
“type”: “record”,
“name”: “Interactions”,
“namespace”: “com.amazonaws.personalize.schema”,
“fields”: [
{
“name”: “USER_ID”,
“type”: “string”
},
{
“name”: “ITEM_ID”,
“type”: “string”
},
{
“name”: “rating“,
“type”: “double”
},
{
“name”: “timestamp”,
“type”: “long”
}
],
“version”: “1.0”
}
さらに Event tracker を作成します。これはマネコンで「Create event tracker」するだけ。Tracking ID (追跡ID) が発行されます。
boto3 を使う場合は以下の要領でイベントを送ることができます。
import os
import json
import boto3
import datetime
personalize_events = boto3.client(service_name=’personalize-events‘)
def lambda_handler(event, context):
response = personalize_events.put_events(
trackingId = os.environ[‘EVENT_TRACKING_ID’],
userId = os.environ[‘USER_ID’],
sessionId = ‘session_id_{}’.format(os.environ[‘USER_ID’]),
eventList = [{
‘sentAt’: datetime.datetime.now(),
‘eventType’: ‘Interactions’,
‘properties’: “{“itemId“”: “””” + os.environ[‘ITEM_ID’] + “”””
投稿者プロフィール
