はじめに
本ブログ記事は、以下の読者を想定しております。
- 手軽に商品レコメンデーションを実現できるPaaSをお探しの方
- Amazon Personalizeがどんなサービスか理解したい方
本ブログ記事では、Amazon Personalize概要と、料金体系、実際に使ってみる流れをまとめます。
Amazon Personalize概要
Amazon Personalizeは、Amazon.comで利用されているのと同じ、ユーザーのパーソナライズ、類似アイテム、および再ランキングが利用できるPaaSサービスです。
2018年に発表され、2019年6月にGA(一般利用可能)となりました。現在では、東京リージョンでも利用可能です。
本サービスは、以下の3つのデータを入力としてトレーニング(学習)を行います。
- ユーザ情報(Users)
- アイテム情報(Items)
- ユーザとアイテムを結びつける操作(interaction) ※例:閲覧履歴や購入履歴など
学習したモデルを用いて、以下のAPIが利用可能になります。
- ユーザの履歴に基づくアイテムの推薦
- アイテムから関連アイテムの推薦
- ユーザ毎のアイテムランキング
Amazon Personalizeの料金体系
Amazon Personalizeの料金は、以下の3つにより構成されております。
例えば、月間2000万PV程度のECサイトで、表示毎に商品の推薦を行うと想定して費用を試算してみます。
上記のサイトの場合は、合計 1282USD/月の費用となります。
- データ取り込み: 10 USD/月 = 200GB × 0.05 USD/GB
- トレーニング: 72 USD/月 = 10トレーニング時間/日 × 30日 × 0.24 USD/トレーニング時間
- レコメンデーション: 1200USD/月 = (8時間 × 5PV/秒 + 16時間 × 10PV/秒) × 30日 × 0.20 USD/TPS-時間
個人的な感想としては、データ取り込みとトレーニングデータ費用はそれほど高くないですが、レコメンデーションを多用するECサイトなどでは、アクセス数が多い場合かなり費用が高くなってしまう可能性があります。
実際に使ってみる
学習に用意するデータ
今回は、Book-Crossing Dataset(http://www2.informatik.uni-freiburg.de/~cziegler/BX/)を利用させてもらいます。これは、本のレビューデータのデータセットです。データの量としては、以下の通りです。
- ユーザ数: 約28万人
- 要素: User-ID, Location, Age
- 本の数: 約21万冊
- 要素: ISBN, Book-Title, Book-Author, Year-Of-Publication, Publisher, Image-URL-S, Image-URL-M, Image-URL-L
- レビュー数: 約115万レビュー
- 要素: User-ID, ISBN, Book-Rating
データサイズは、そのままだと合計100MB程度です。
データの前処理
Datasetは、Amazon Personalize用ではないので、データの形式をAmazon Personalizeの入力形式に加工する必要があります。
今回の場合には、以下の加工を行います
- 元のデータを”pandas”の”read_csv”で読み込める形に整形する
- 文字列にカンマがあるとAmazon Personalizeは読み込めないため、カンマを置換する
- 不要なカラムを削除して、必要な要素に絞る
- interactionに必須なTIMESTAMPがないので、現在のエポック秒を付与する
- カラム名をAmazon Personalize用に変更する
- カンマ区切りのCSV形式で出力する
上記の加工を行うJupyter(IPython) Notebookは、下記にまとめているのでご参考にしてください。
amazon_personalizeで使うデータの前処理.ipynb
もし、手元で実行してみたい方は、無料でGoogleが提供しているJupyter Notebook互換の環境(Google Colaboratory)がオススメです。ipynbファイルをダウンロードして、Googleドライブに入れたら、Colaboratoryで起動すれば動きます。
データのImport
データはS3経由でAmazon Personalizeに渡します。
データの前処理で作成した、3つのCSVファイルをS3バケットに置きます。
データを置くS3バケットには以下のポリシーを設定しておく必要があります。
{ "Version": "2012-10-17", "Id": "PersonalizeS3BucketAccessPolicy", "Statement": [ { "Sid": "PersonalizeS3BucketAccessPolicy", "Effect": "Allow", "Principal": { "Service": "personalize.amazonaws.com" }, "Action": [ "s3:GetObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::bucket-name", "arn:aws:s3:::bucket-name/*" ] } ] }
Amazon Personalizeの各種モデルは、以下のような構造になっています。
Dataset group (Amazon Personalizeの一連のパーツを一まとまりにした単位) ├ Dataset (学習に使うデータセット) │ ├ Dataset type User │ ├ Dataset type Item │ └ Dataset type User-item interaction ├ Solution (学習済みデータモデル) └ Campaigns (学習済みモデルのエンドポイント) |
まず、今回用のDataset groupを作成し、DatasetとしてS3のcsvを登録していきます。
csvを登録する際に、データのスキーマをJsonで指定する必要があります。
今回は、以下のようなスキーマでデータを作成しています。
User-item interaction
{ "type": "record", "name": "Interactions", "namespace": "com.amazonaws.personalize.schema", "fields": [ { "name": "USER_ID", "type": "string" }, { "name": "ITEM_ID", "type": "string" }, { "name": "TIMESTAMP", "type": "long" } ], "version": "1.0" }
User
{ "type": "record", "name": "Users", "namespace": "com.amazonaws.personalize.schema", "fields": [ { "name": "USER_ID", "type": "string" }, { "name": "LOCATION", "type": "string", "categorical": true } ], "version": "1.0" }
Item
{ "type": "record", "name": "Items", "namespace": "com.amazonaws.personalize.schema", "fields": [ { "name": "ITEM_ID", "type": "string" }, { "name": "BOOK_AUTHOR", "type": "string", "categorical": true } ], "version": "1.0" }
この時、データImportに利用するIAMロールを作成することが必要なので、画面から新規にロールを作成して、”AmazonPersonalizeFullAccess”ポリシーをロールに付与しましょう。
学習の実行
3つのDatasetが登録できたら、Datasetを利用して学習を行います。
学習は、Solutionを作成することで実行されます。学習方法は、Recipeという名前で登録できます。今回は、デフォルトで用意されているaws-hrnnというレシピを利用します。aws-hrnnは”ユーザーの行動の変化をモデル化できる階層型リカレントニューラルネットワー ク”とのこと。
デフォルトで用意されているRecipeについては、以下のマニュアルの”事前定義済みレシピ”の章で詳しく説明されています。
https://docs.aws.amazon.com/ja_jp/personalize/latest/dg/personalize-dg.pdf
学習には、2〜3時間程度かかります。
APIのエンドポイントの作成
Solutionの作成が完了したら、Campaignsを作成し、APIで利用できるようにします。
Campaigns作成時に、利用するSolutionと最小で確保するスループットを指定します。
ここで注意なのが、最小で確保するスループットを最小値の1にしても、利用料金としては1時間辺り0.2USDの料金が発生します。月額に直すと144USDとそれなりの額になるので、終わったら忘れずにCampaignsを削除しましょう。
APIの利用
Campaignsが作成されれば、アクセスに利用できるarnが生成されます。このarnを利用して実際に”ユーザの履歴に基づくアイテムの推薦(GetRecommendations API)”を実行してみます。下記のプログラムでは、UserID 276746のユーザに対して、推奨されるBookのISBNを取得します。
実行プログラム
import boto3 ## campaign、ユーザーIDの指定 campaign_arn = "Campaingのarnを指定" user_id = '276746' def get_recommend(campaign_arn,user_id): personalizeRt = boto3.client('personalize-runtime', region_name='ap-northeast-1', aws_access_key_id='アクセスキーを指定', aws_secret_access_key='シークレットキーを指定') response = personalizeRt.get_recommendations( campaignArn = campaign_arn, userId = user_id) print("Recommended items") for item in response['itemList']: print (item['itemId']) get_recommend(campaign_arn,user_id)
実行結果
Recommended items 0062545035 0345350588 0345434811 1587611198 3596223946 0575400188 0688042171 055357535X 0684850265 0671780751 844507119X 0385335180 0671753819 0670887579 0312962444 0140170502 0552139912 0439087597 0449006778 3551551693 1400046610 0679441247 0451526570 3442435838 10987654321
まとめ
Amazon Personalizeの初歩部分を実際に動作させながらまとめてみました。
レコメンデーションの精度や、急なアクセス像が発生した時の性能劣化具合やオートスケール速度など、実際に利用するには調査が必要な点が見えてきたので引き続き、調査した結果をブログにまとめていきたいと思います。