はじめに
本ブログ記事は、以下の読者を想定しております。
- TreasureDataにサイトのアクセス履歴など、学習に利用できるデータを保持している方
- Amazon Personalizeを利用して手軽に関連ページの推定を実装したい方
本ブログ記事では、TreasureDataのWebsite Tracking機能とAmazon Personalizeを利用して、関連ページの推定を行う流れをまとめます。
今回の目的
AmazonなどのECサイトには、商品ページの詳細画面に「この商品を見た人はこれらの商品も見ています」「この商品を買った人は、これらの商品も買っています」と行った、関連する商品のリコメンドがあります。
あの機能を一から作るとかなり難しいのですが、既存のサービスを組み合わせて、「この商品を見た人はこれらの商品も見ています」機能をサクッと作ってみましょう。
今回の構成概要
下記の図が、今回のシステムの構成図になります。
上のルートで学習に必要なデータをAmazon Personalizeに与えます。下のルートでは、学習結果を使って、WEBサイト上に関連ページの取得を行ないます。
- WEBサイト
- ECサイトなど関連ページをレコメンドを行いたいWEBサイト
- TreasureData
- カスタマーデータプラットフォーム(旧名プライベートDMP)として有名なPaaSサービス
- 学習に利用するアクセス履歴の取得は、標準機能のWebsite Tracking機能利用
- Amazon Personalizeに入れるのに必要な前処理は、TreasureData上でSQLを利用して実装
- Amazon Personalize
- AWSが提供しているPaaSサービス 詳しくはこちら{前の記事へのリンク}
- 今回は最初から用意されている学習モデルSIMS レシピを利用
- AWS APIGateway + AWS Lambda
学習データの取得(Aルート)
今回の学習モデルは、Amazon PersonalizeのSIMS レシピを利用します。これは、「ユーザID」、「アイテムID」「タイムスタンプ」の3つの情報を与えると、自動的に関連するItem IDを学習してくれるモデルです。
今回は、WEBサイトのアクセス履歴から、以下の情報を抽出して利用します。
(A-1) WEBサイトからデータを抽出するために、TreasureDataのWebSite_Tracking機能を利用します。この機能を使うことで、WEBサイトのアクセスログがTresureDataに正規化された状態で取り込まれます。
(A-2) 取り込まれたデータをAmazon Personalizeに読み込める形に加工します。これは前処理(Preprossessing)という機械学習において必須の工程ですが、TreasureData内にデータが正規化された状態で保持されており、データの加工にSQLを使えるので、プログラムをゴリゴリ書くのに比べて、簡単に処理ができます。
(A-3) 処理が終わったら、TreasureDataのコネクション機能を使ってデータをS3にエクスポートします。これは現状Amazon Personalizeにデータを取り込む手段がS3経由しかないからです。
なお、(A-2)と(A-3)はスケジュールとして、TreasureDataにスケジュールとして登録すると自動実行することができます。レコメンドの精度を上げるためには、定期的に学習データを最新化することが必要になるので、この仕組みを使います。
(A-4) S3に保存されたデータは、Amazon personalizeの”Detasets”として取り込みます。データセットタイプは、User-item interactionになります。
(A-5) 学習する際は、Amazon personalizeの”Solution and recipes”にて実行します。Recipe selection -> Manual -> aws-simsを選択します。学習に関する各種パラメータが設定できますが、とりあえずデフォルト値のままでも学習は実行できます。
学習が完了すれば、学習済みのモデルを”Campaigns”として登録することで、APIで利用できるようになります。aws-simsの場合は、アイテムIDを与えると関連するアイテムIDのリストが帰ってきます。
学習結果の利用(Bルート)
Aルートで学習済みのモデルができたら、実際にサイトに組み込んでレコメンド機能を実装してみます。今回はAmazon PersonalizeのAPIを実行する部分は、Lambdaで実装し、APIGatewayと組みわせることで、REST APIとして利用できるようにします。
もちろん、Javascriptでフロントエンドから直接Amazon PersonalizeのAPIを実行することもできるのですが、高アクセスになるとAmazon Personalizeの費用が跳ね上がるので不正アクセスや高アクセス時に利用を停止する仕組みは用意しておいた方が良いでしょう。
(B-1) 商品の詳細ページにアクセスが発生したら、その商品の商品IDでAPI Garewayに関連商品IDを問い合わせます。
(B-2)(B-3) Lamabdaは、以下のようなプログラムでAmazon PersonalizeのAPIを実行し、商品IDのリストを取得します。
def get_recommend(event, context): item_id = event['itemId'] personalizert = boto3.client('personalize-runtime', aws_secret_access_key='{シークレットキー}', region_name='ap-northeast-1') response=personalizert.get_recommendations( campaignArn = "arn:aws:personalize:ap-northeast-1:{アカウントID}:campaign/similaritiy-item", itemId=str(item_id),) item_list = [] for item in response['itemList']: item_list.append(item['itemId']) body = { 'item_list': item_list } response = { 'statusCode': 200, 'isBase64Encoded': False, 'headers': {'Content-Type': 'application/json'}, 'body': json.dumps(body) } |
(B-4) 実行結果は、httpのレスポンスとしてWEBサーバに返却されます。このIDを利用して、商品画像やリンク先を生成することで、レコメンド部分をクライアントに渡すことができます。
まとめ
Amazon PersonalizeとTreasureDataを利用して、簡単にレコメンド機能を作る方法についてご紹介しました。前回と比較して、TreasureDataを利用することで、学習データの前処理が格段に簡単になりました。また、Amazon Personalizeに最初から用意されている学習モデルのレシピaws-simsは、ユーザIDと商品ID、そしてタイムスタンプを持つデータがあれば簡単に関連アイテムの推定ができるので、アクセス履歴があれば簡単にレコメンド機能を実装できます。
次回は購買情報やその他顧客行動ログをかけ合わせたレコメンデーションを作ってみたいと思います。