Amazon EC2にFlaskアプリを構築し、Personalizeから推薦情報を受け取ってみるPart1

Amazon Personalizeはフルマネージド型の機械学習サービスで、用意したデータをもとにユーザーへのおすすめ商品・情報を生成します。

 

おすすめ情報が利用される状況は、Eコマース・コンテンツ配信・メディア・広告など、多岐にわたりますよね。

 

今回の記事ではAmazon Prsonalizeが生成する推薦情報をWebアプリケーションでユーザーごとに表示してみるハンズオンを紹介します。

 

Webアプリケーションに関しては、初心者の方でも扱いやすいFlaskを利用しますのでご安心ください。

 

↓ボリュームが多いため、Part1とPart2に分けてあります。

 

  • Amazon EC2にFlaskアプリを構築し、Personalizeから推薦情報を受け取ってみるPart1
  • Amazon EC2にFlaskアプリを構築し、Personalizeから推薦情報を受け取ってみるPart2(後日投稿予定)

 

 

FlaskアプリでPersonalizeのおすすめ情報を表示

flaskapp-personalize構築図

Personalizeのハンズオンをいろいろやりましたが、"ユーザーにどう届ければいいか"の部分を紹介する記事があまりありませんでした。

 

この記事では、「Eコマースサイトでユーザーにおすすめの果物を2つ紹介する」を想定して、AWSクラウド上にWebアプリとAmazon Personalizeを作成していきます。

 

↓できあがりイメージは下の画像です。サイトデザインやログイン仕様は無視しています。

 

flaskapp-personalize構築図

 

↓ユーザーIDを入力すると、PersonalizeのAPIを使ってユーザーにおすすめのItemIDを取得し、ItemIDに基づいたデータベースに登録されたフルーツを2つ表示します。

 

flaskapp-personalize構築図

 

 

■必要な前提知識と準備

今回のハンズオンは以下の前提知識が必要です。できるだけ初心者の方でも迷わずにできるように書きましたが、エラーがおきたときの対処など含めて前提知識があったほうがスムーズにハンズオンができるかと思います。

 

  • AWSアカウントのセットアップ
  • VPC,SecurityGroups,EC2の基本知識
  • Amazon Personalizeについての基本知識
  • 必要なツールとライブラリ(Flask, Boto3など)

 

【構築の流れ】
saitou-flaskapp-personalize2構築図2

  • Amazon S3作成

  • Amazon Personalize

 

 

■ダミーデータ作成

まずはPesonalizeにインポートするダミーデータを作成します。Personalizeから推薦情報を得るためには、インタラクションデータが最低限あれば問題ありません。

 

以下のコードを利用し、インタラクションデータのダミーデータを作成しましょう。ユーザー数とレコード数は増やしても大丈夫ですが、アイテム数に関しては30でお願いします。理由はFlaskアプリのデータベースに登録するフルーツが30件のためです。

 

"""インタラクションデータ作成"""
import pandas as pd
import random
import time

# レコード数を定義
num_records = 10000

# パラメータ設定
user_id_range = 1000  # USER_IDの範囲(1から500までの整数)
item_id_range = 30  # ITEM_IDの範囲(1から1000までの整数)
event_types = ["click", "view", "buy", "save"]

# ダミーデータの生成
user_ids = [random.randint(1, user_id_range) for _ in range(num_records)]
item_ids = [random.randint(1, item_id_range) for _ in range(num_records)]
timestamps = [int(time.time()) for _ in range(num_records)]
event_types_list = [random.choice(event_types) for _ in range(num_records)]

# pandasのDataFrameに変換
df = pd.DataFrame({
    "USER_ID": user_ids,
    "ITEM_ID": item_ids,
    "TIMESTAMP": timestamps,
    "EVENT_TYPE": event_types_list
})

# CSVファイルに保存
df.to_csv('interaction_dummy_data.csv', index=False)

print("interaction_dummy_data.csv ファイルを作成しました。")

 

IDEツールがある方はそちらを利用するか、お使いのローカルPCにPythonがインストールされていれば、Pandasライブラリをpipでインストールするだけでダミーデータを作成できます。

 

↓コードをメモ帳にペーストし、[create_dummy_data.py]というファイル名でダウンロードフォルダに保存します。

 

flaskapp-personalizeダミーデータ作成

 

 

flaskapp-personalizeダミーデータ作成

 

↓ダウンロードフォルダ内でマウスポインタを合わせ、右クリックから[ターミナルで開く]をクリックします。

 

flaskapp-personalizeダミーデータ作成

 

↓次のコマンドを実行します。
python .\create_dummy_data.py

 

flaskapp-personalizeダミーデータ作成

 

↓ダウンロードフォルダにダミーデータが作成されます。

 

flaskapp-personalizeダミーデータ作成

 

 

flaskapp-personalizeダミーデータ作成

 

ダミーデータの作成は以上です。

 

 

■S3バケット作成

作成したダミーデータを保存するS3バケットを作成します。

 

↓AWSにログインし、サービス検索窓で[S3]を検索します。

 

flaskapp-personalizeS3バケット作成

 

↓[バケット]から[バケットを作成]をクリックします。

 

flaskapp-personalizeS3バケット作成

 

↓バケット名は任意の名前で入力し、AWSリージョンは自身の環境に合わせて設定してください。特に要件がなければ、東京リージョンを選択しましょう。

 

flaskapp-personalizeS3バケット作成

 

↓[バケットを作成]をクリックします。

 

flaskapp-personalizeS3バケット作成

 

↓作成したバケットをクリックます。

 

flaskapp-personalizeS3バケット作成

 

↓[アクセス許可]タブをクリックし、[バケットポリシー]の[編集]をクリックします。

 

flaskapp-personalizeS3バケット作成

 

↓以下のポリシーで"YOUR_BUCKET_NAME"部分2カ所を自身が作成したS3バケット名に修正して、JSONドキュメントを貼り付けます。

 

{
    "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:::YOUR_BUCKET_NAME",
                "arn:aws:s3:::YOUR_BUCKET_NAME/*"
            ]
        }
    ]
}

 

flaskapp-personalizeS3バケット作成

 

↓[変更の保存]をクリックします。

 

flaskapp-personalizeS3バケット作成

 

↓つづいて、[オブジェクト]タブをクリックし、[フォルダの作成]をクリックします。

 

flaskapp-personalizeS3バケット作成

 

↓[フォルダ名]を[interactions]とし、[フォルダの作成]をクリックします。
interactions

 

flaskapp-personalizeS3バケット作成

 

↓作成したフォルダをクリックします。

 

flaskapp-personalizeS3バケット作成

 

↓[ファイルを追加]をクリックします。

 

flaskapp-personalizeS3バケット作成

 

↓作成したダミーデータを追加し、[アップロード]をクリックします。

 

flaskapp-personalizeS3バケット作成

flaskapp-personalizeS3バケット作成

 

S3バケットの作成は以上です。

 

 

■Amazon Personalize作成

おすすめ情報を生成するAmazon Personalizeソリューション・キャンペーンを作成していきます。

 

↓サービス検索窓で[Amazon Personalize]を検索し、クリックします。

 

flaskapp-personalizePersonalize作成

 

↓[Create dataset group]をクリックします。

 

flaskapp-personalizePersonalize作成

 

↓[Name]は任意で入力していいただき、[Domain]を[E-commerce]を選択し、[Create group]をクリックします。
saitou-personalize-handson-datasetgroup

 

flaskapp-personalizePersonalize作成

 

↓Pesonalizeを簡単に作成するためのフローが出てきます。[Create datasets]で[Import interaction data]をクリックします。

 

flaskapp-personalizePersonalize作成

 

↓[Import data directly into Amazon Personalize datasets]を選択し、[Next]をクリックします。

 

flaskapp-personalizePersonalize作成

 

↓[Dataset name]は任意の名前を入力し、[Dataset schema]は[Create a new domain schema by modifying the existing default schema for your domain]を選択します。[Schema name]も任意の名前を入力してください。
saitou-personalize-handson-dataset-interaction

 

flaskapp-personalizePersonalize作成

 

↓[Schema definition]はそのままで、[Next]をクリックします。

 

flaskapp-personalizePersonalize作成

 

↓[Data import source]は[Import data from S3]を選択し、[Dataset import job name]は任意の名前を入力してください。
saitou-personalize-handson-importjob

 

flaskapp-personalizePersonalize作成

 

↓[Data location]は作成したS3バケットのプレフィックス/interactions/を入力します。
s3://saitou-personalize-handson-bucket/interactions/

 

flaskapp-personalizePersonalize作成

 

↓S3バケットでコピーできます。

 

flaskapp-personalizePersonalize作成

 

↓Personalizeへの権限付与の設定します。[IAM service role]の[Create a new role]をクリックします。

 

flaskapp-personalizePersonalize作成

 

↓[Specific S3 buckets]で作成したS3バケット名を入力し、[Create role]をクリックします。

 

flaskapp-personalizePersonalize作成

 

↓[Start import]をクリックします。

 

flaskapp-personalizePersonalize作成

 

↓ステータスが[create pending]から[active]になるのを待ちましょう。レコード数にもよりますが、5分ほどでActiveになるかと思います。

 

flaskapp-personalizePersonalize作成

flaskapp-personalizePersonalize作成

 

↓つづいて、フローの中段で[Use custom resources (advanced)]タブをクリックし、[Create solution]をクリックします。

 

flaskapp-personalizePersonalizeソリューション作成

 

↓[Solution name]は任意の名前を入力し、[Solution type]は[Item recommendation]を選択、[Recipe]は[aws-user-personalization]を選択してください。[Next]をクリックします。
saitou-personalize-handson-solution

 

flaskapp-personalizePersonalizeソリューション作成

 

↓[Advanced configuration – optional]はインポートしたデータをより細かくチューニングしてトレーニングさせる設定部分です。今回はデフォルトでいくので、[Next]をクリックします。

 

flaskapp-personalizePersonalizeソリューション作成

 

↓[Review and create]で入力した内容を確認し、[Create solution]をクリックします。

 

flaskapp-personalizePersonalizeソリューション作成

 

↓作成中から[Active]になるのを待ちましょう。20分ほどかかりますので、ソリューションの[Solution version status]で都度確認してください。

 

flaskapp-personalizePersonalizeソリューション作成

flaskapp-personalizePersonalizeソリューション作成

flaskapp-personalizePersonalizeソリューション作成

flaskapp-personalizePersonalizeソリューション作成

 

↓さいごにトレーニングしたモデルをAPIで扱えるようにキャンペーンを作成します。[Campaigns]から[Create campaign]をクリックします。

 

flaskapp-personalizePersonalizeキャンペーン作成

 

↓[Campaign name]は任意の名前を入力し、[Solution]は作成したソリューションを選択、[Solution version ID]は自動で最新バージョンが選択されるのでそのままです。
saitou-personalize-handson-campaign

 

flaskapp-personalizePersonalizeキャンペーン作成

 

↓そのほかの設定は、推薦するアイテムの探索範囲の設定ですので、こちらもデフォルトのまま、[Create campaign]をクリックします。

 

flaskapp-personalizePersonalizeキャンペーン作成

 

↓こちらもソリューション同様、すこし時間がかかります。[Details]の[Status]で[Active]になるのを待ちましょう。

 

flaskapp-personalizePersonalizeキャンペーン作成

flaskapp-personalizePersonalizeキャンペーン作成

 

↓[Active]になりましたら、推薦情報が取得できるか確認します。[Personalization API]タブをクリックし、[Test campaign results]の[User ID]欄に適当な数字を入力、[Get recommendations]をクリックします。

 

flaskapp-personalizePersonalizeキャンペーン作成

flaskapp-personalizePersonalizeキャンペーン作成

 

↓画面下に25件分の推薦情報が返ってくるはずです。Scoreは相対的な尺度で表示され、25件分表示した場合はすべて足して"1"になるようになっています。1,000件取得した場合は、ひとつ当たりのScoreはかなり小さくなります。

 

flaskapp-personalizePersonalizeキャンペーン作成

 

私の場合は[User ID]が[1]に対し、[27]や[1]、[30]が返ってきました。ダミーデータの各パラメータはランダムに生成されているので、[User ID]を[1]と入力しても、わたしの結果とは異なるかと思います。ためしに色々なIDを入力してみましょう。

 

Amazon Personalizeの作成は以上です。

 

 

まとめ

Part1はここまでです。Part2ではAmazon Ec2のインスタンスを起動し、Flaskアプリをデプロイします。Flaskアプリのコードについては、GitHubからFlaskアプリのコードが格納されたリポジトリをクローンしますので、Flaskについて知識がなくても大丈夫です。

 

Part2は後日投稿しますので、よろしくお願いいたします。

 

 

☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
 
AIや機械学習のレコメンデーションサービスについて知りたい方は、ぜひ協栄情報にお問い合わせください。
https://www.cp-info.co.jp/contact/
 
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆

 

 

参考リンク:AWS公式ドキュメント

 

↓ほかの協栄情報メンバーも機械学習・AIに関する記事を公開しています。ぜひ参考にしてみてください。

 

■Amazon CodeWhispererを試してみた(dapeng)
https://cloud5.jp/amazon-codewhisperer/

 

■Amazon Personalizeの使い方や事例を紹介【ハンズオンあり】(齊藤弘樹)
https://cloud5.jp/saitou-amazonpersonalize-entry/

 

■Amazon Personalizeの使い方や事例を紹介【ハンズオンあり】 part2(齊藤弘樹)
https://cloud5.jp/saitou-amazonpersonalize-handson/

 

■Amazon Personalize学習用ダミーデータをPythonで作ってみた(齊藤弘樹)
https://cloud5.jp/saitou-personalize-create-dammydata/

 

■Amazon Personalizeのエラーを解決!各カラムのデータ型を調べる方法(齊藤弘樹)
https://cloud5.jp/saitou-check-data-type/

 

■AWS Lambdaを使ってAmazon Personalizeの推薦情報をCSVでS3にエクスポートする方法(齊藤弘樹)
https://cloud5.jp/saitou-personalize-attribute-recommendation/

 

Last modified: 2023-12-02

Author