HAL_DATA_techBlog

HALDATAの技術ブログとリリース情報です。

Amazon Personalizeを使ってみる

はじめに

本ブログ記事は、以下の読者を想定しております。

  • 手軽に商品レコメンデーションを実現できるPaaSをお探しの方
  • Amazon Personalizeがどんなサービスか理解したい方

本ブログ記事では、Amazon Personalize概要と、料金体系、実際に使ってみる流れをまとめます。

 

Amazon Personalize概要

Amazon Personalizeは、Amazon.comで利用されているのと同じ、ユーザーのパーソナライズ、類似アイテム、および再ランキングが利用できるPaaSサービスです。

2018年に発表され、2019年6月にGA(一般利用可能)となりました。現在では、東京リージョンでも利用可能です。

本サービスは、以下の3つのデータを入力としてトレーニング(学習)を行います。

  • ユーザ情報(Users)
  • アイテム情報(Items)
  • ユーザとアイテムを結びつける操作(interaction) ※例:閲覧履歴や購入履歴など

学習したモデルを用いて、以下のAPIが利用可能になります。

  1. ユーザの履歴に基づくアイテムの推薦
  2. アイテムから関連アイテムの推薦
  3. ユーザ毎のアイテムランキング

Amazon Personalizeの料金体系

Amazon Personalizeの料金は、以下の3つにより構成されております。

  1. データの取り込み(トレーニング用データ+レコメンデーション用データ)
  2. レーニン
  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の入力形式に加工する必要があります。

今回の場合には、以下の加工を行います

  1. 元のデータを”pandas”の”read_csv”で読み込める形に整形する
  2. 文字列にカンマがあるとAmazon Personalizeは読み込めないため、カンマを置換する
  3. 不要なカラムを削除して、必要な要素に絞る
  4. interactionに必須なTIMESTAMPがないので、現在のエポック秒を付与する
  5. カラム名Amazon Personalize用に変更する
  6. カンマ区切りの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の初歩部分を実際に動作させながらまとめてみました。

レコメンデーションの精度や、急なアクセス像が発生した時の性能劣化具合やオートスケール速度など、実際に利用するには調査が必要な点が見えてきたので引き続き、調査した結果をブログにまとめていきたいと思います。

 

参考資料