Amazon Web Services ブログ

Amazon Personalize で使用できる項目属性数が 10 倍以上となり、レコメンデーションの関連性が改善

Amazon Personalize は Amazon Personalize で作成できるカスタム機械学習モデルを使用することで、これまでに機械学習の経験がなくても、ウェブサイト、アプリ、広告、E メールなどをパーソナライズできる機械学習サービスの 1 つです。このたび、Amazon Personalize が Personalizeでのモデリング用にこれまでの 10 倍以上の項目属性数をサポートするようになりましたことをお知らせします。Amazon Personalize で ML モデルを構築する際、以前は最大 5 つの項目属性を使用できました。現在、この属性数の上限が 50 となりました。項目に関する詳細情報、たとえば、カテゴリ、ブランド、価格、期間、サイズ、作成者、リリース年などを使用して、レコメンデーションの関連性を高めることができます。

この投稿では、カスタムの属性を持つ項目メタデータを Amazon Personalize に追加し、このデータとユーザー操作を使ってモデルを作成する方法を学びます。この投稿では、美容製品の Amazon カスタマーレビューをデータとして使用します。詳細およびこのデータをダウンロードするには、「Amazon Customer Reviews Dataset」をご参照ください。ユーザーがレビューした項目の履歴をユーザーおよび項目のメタデータとともに使用し、それらに対する製品のレコメンデーションを生成します。

データの前処理

Amazon Personalize でデータをモデル化するには、そのデータを次のようなデータセットに分割する必要があります。

  • Users – ユーザーに関するメタデータが含まれます
  • Items – 項目に関するメタデータが含まれます
  • Interactions – 操作 (この投稿では、レビュー) および操作に関するメタデータが含まれます

各データセットについて、この投稿では次の属性を使用します。

  • Userscustomer_idhelpful_votestotal_votes
  • Itemsproduct_idproduct_categoryproduct_parent
  • Interactionsproduct_idcustomer_idreview_datestar_rating

この投稿では、marketplacereview_idproduct_titlevineverified_purchasereview_headlinereview_body を含む、他の利用可能な属性は使用しません。

さらに、Amazon Personalize のキーワードに準拠するため、この投稿では customer_id の名前を USER_ID に、product_id の名前を ITEM_ID に、review_date の名前を TIMESTAMP に変更しています。

Amazon Personalize への入力用データをダウンロードして処理するには、次の Python サンプルコードを使用してください。

Users データセットには、次のコードを入力します。

#Downloading data
$aws s3 cp s3://amazon-reviews-pds/tsv/amazon_reviews_us_Beauty_v1_00.tsv.gz .
$gunzip amazon_reviews_us_Beauty_v1_00.tsv.gz
#Generating the user dataset
import pandas as pd
fields = ['customer_id', 'helpful_votes', 'total_votes']
df = pd.read_csv('amazon_reviews_us_Beauty_v1_00.tsv', sep='\t', usecols=fields)
df = df.rename(columns={'customer_id':'USER_ID'})
df.to_csv('User_dataset.csv', index = None, header=True)

以下のスクリーンショットは、Users データセットを示しています。この出力は、以下で生成できます。

df.head()

Items データセットには、次のコードを入力します。

#Generating the item dataset
fields = ['product_id', 'product_category', 'product_parent']
df1 = pd.read_csv('amazon_reviews_us_Beauty_v1_00.tsv', sep='\t', usecols=fields)
df1= df1.rename(columns={'product_id':'ITEM_ID'})

#Clip category names to 999 characters to confirm to Personalize limits
maxlen = 999
for index, row in df1.iterrows():
    product_category = row['product_category'][:maxlen]
df1.to_csv('Item_dataset.csv', index = None, header=True)

次のスクリーンショットは、Items データセットを示しています。この出力は、以下で生成できます。

df1.head()

Interactions データセットには、次のコードを入力します。

#Generating the interactions dataset
from datetime import datetime
fields = ['product_id', 'customer_id', 'review_date', 'star_rating']
df2 = pd.read_csv('amazon_reviews_us_Beauty_v1_00.tsv', sep='\t', usecols=fields, low_memory=False)
df2= df2.rename(columns={'product_id':'ITEM_ID', 'customer_id':'USER_ID', 'review_date':'TIMESTAMP'})

#Converting timstamp to UNIX timestamp and rounding milliseconds
num_errors =0
for index, row in df2.iterrows(): 
    time_input= row["TIMESTAMP"]
    try:
        time_input = datetime.strptime(time_input, "%Y-%m-%d")
        timestamp = round(datetime.timestamp(time_input))
        df2.set_value(index, "TIMESTAMP", timestamp)
    except:
        print("exception at index: {}".format(index))
        num_errors += 1
print("Total rows in error: {}".format(num_errors))
df2.to_csv("Interaction_dataset.csv", index = None, header=True)

次のスクリーンショットは、Interactions データセットを示しています。この出力は、以下で生成できます。

df2.head()

データの取り込み

上記のデータを処理した後、Amazon Personalize にデータを取り込むことができます。

データセットグループの作成

アプリケーションが送信するイベント (ユーザー操作)、およびユーザーと項目のメタデータを保存するデータセットグループを作成するには、次の手順を実行してください。

  1. Amazon Personalize コンソールの [Dataset groups] で、[Create dataset group] を選択します。
  2. [Dataset group name] にデータセットグループの名前を入力します。この投稿では、DemoLimitIncrease という名前を入力します。
  3. [Next] をクリックします。

データセットの作成とスキーマの定義

データセットグループを作成したら、データセットを作成し、それぞれのスキーマを定義します。次の手順は、Items データセット用です。

  1. [Dataset name] に名前を入力します。
  2. [Schema details] で [Create new schema] を選択します。
  3. [New schema name] で名前を入力します。
  4. [Schema definition] で次のコードを入力します。
    {
    	"type": "record",
    	"name": "Items",
    	"namespace": "com.amazonaws.personalize.schema",
    	"fields": [
    		{
    			"name": "ITEM_ID",
    			"type": "string"
    		},
    		{
    			"name": "product_parent",
    			"type": "string",
    			"categorical": true
    		},
    		{
    			"name": "product_category",
    			"type": "string",
    			"categorical": true
    		}
    	],
    	"version": "1.0"}
  5. [Next] をクリックします。

Users データセットと Interactions データセットについても同じ手順を実行し、インポートする列に適合するようにスキーマを定義します。

データのインポート

データセットを作成したら、Amazon S3 からデータをインポートします。バケットへの Amazon Personalize 読み込みアクセスを、必ず提供してください。Items データをインポートするには、以下の手順を実行します。

  1. [Dataset import job details] の [Dataset import job name] で、名前を入力します。
  2. [IAM Service role] で [AmazonPersonalize-ExecutionRole] をクリックします。
  3. [Data location] で S3 バケットの場所を入力します。
  4. [Create dataset import job] をクリックします。

同じ手順に従って、Users データセットと Interactions データセットをインポートします。

モデルのトレーニング

データを Amazon Personalize に取り込むと、モデルをトレーニングする準備が整います (solutionVersion)。トレーニングを行うには、使用するレシピ (アルゴリズム) をユースケースにマッピングします。利用可能なオプションは、次のとおりです。

  • ユーザーへの項目のレコメンデーションなど、ユーザーのパーソナライズには、次のレシピのいずれかを使用してください。
    • HRNN – 操作データについてのみトレーニングして、ベースラインを提供します
    • HRNN-Metadata – 操作 + ユーザー、項目、操作メタデータのトレーニングを行います。このようなデータが利用可能な場合に、使用することが推奨されます
    • HRNN-Coldstart – コールド (新しい) 項目をユーザーにレコメンドするときに使用します
  • 入力項目に類似した項目をレコメンドするには、SIMS を使用します
  • 特定のユーザーの入力項目のリストを再度ランク付けするには、Personalized-Ranking を使用します。

この投稿では、HRNN-Metadata レシピを使用してソリューションを定義してから、solutionVersion (モデル) をトレーニングします。次の手順を完了してください。

  1. Amazon Personalize コンソールの [Dataset groups] で、[DemoLimitIncrease] を選択します。
  2. [Solutions] をクリックします。
  3. [Create solution] をクリックします。
  4. [Solution configuration] の [Solution name] で、名前を入力します。
  5. [Recipe selection] で [Manual] を選択します。
  6. [Recipe] で [aws-hrnn-metadata] をクリックします。
  7. [Next] をクリックします。

デフォルトのハイパーパラメーターを変更したり、ソリューションのハイパーパラメーター最適化を実行したりすることもできます。

レコメンデーションを取得する

レコメンデーションを取得するには、先ほど作成したソリューションとソリューションバージョンを使用してキャンペーンを作成します。次の手順を完了してください。

  1. [Dataset groups] の [DemoLimitIncrease] で、[Campaigns] を選択します。
  2. [Create new campaign] をクリックします。
  3. [Campaign details] の [Campaign name] で、名前を入力します。
  4. [Solution] で [the solution name from previous step] をクリックします。
  5. [Solution version ID] で、作成したソリューションバージョンを選択します。
  6. [Minimum provisioned transactions per second] で 1 と入力します。
  7. [Create campaign] をクリックします。
  8. キャンペーンの作成後、コンソールで詳細を確認し、それを使用してレコメンデーションを取得できます。

キャンペーンをセットアップしたら、プログラムでキャンペーンを呼び出し、項目 ID の形式でレコメンデーションを取得できます。コンソールを使用してレコメンデーションを取得し、スポットチェックを実行することもできます。さらに Amazon Personalize では、レコメンデーションをバッチ処理する機能もあります。詳細については、「Now available: Batch Recommendations in Amazon Personalize」をご覧ください。

まとめ

これで、これらのレコメンデーションを使って、ユーザーに関する知識に基づいて美容ウェブサイトのホームページをパーソナライズしたり、レコメンデーションを記載したャンペーンに関する E メールを送信したりするなど、見出しの内容を強化できます。Amazon Personalize でリアルタイムのレコメンデーションを実行するには、発生したユーザーイベントも送信する必要があります。詳細については、「Amazon Personalize is Now Generally Available」をご参照ください。今すぐ Amazon Personalize を始めましょう。


著者について

Vaibhav Sethi は Amazon Personalize のプロダクトマネージャーです。機械学習ソリューションの構築を支援する製品を提供することに取り組んでいます。趣味はハイキングと読書です。