AWS入門ブログリレー2024〜Amazon Personalize編〜

Amazon Personalizeでレコメンデーションしてみよう
2024.05.11

当エントリは弊社AWS事業本部による『AWS 入門ブログリレー 2024』にデータアナリティクス事業本部なのに参加している41日目のエントリです。

このブログリレーの企画は、普段 AWS サービスについて最新のネタ・深い/細かいテーマを主に書き連ねてきたメンバーの手によって、 今一度初心に返って、基本的な部分を見つめ直してみよう、解説してみようというコンセプトが含まれています。

AWS をこれから学ぼう!という方にとっては文字通りの入門記事として、またすでに AWS を活用されている方にとっても AWS サービスの再発見や 2024 年のサービスアップデートのキャッチアップの場となればと考えておりますので、ぜひ最後までお付合い頂ければ幸いです。

では、さっそくいってみましょう。今回のテーマは『Amazon Personalize』です。

Amazon Personalizeとは

ユーザー向けにパーソナライズしたレコメンデーションを提供するフルマネージドな機械学習サービスです。こうしたレコメンドシステムを導入することでアイテムのクリック率が増加したり、各ユーザーに対してより効果的な訴求施策ができたり、購買につながるような動線を作ることができます。

ECサイトを例にとると、Amazon Personalizeを使って以下のようなレコメンド方式が提供できます。

  • 商品購入履歴に応じたおすすめ:アイテムベース
    • 「この商品を購入した人におすすめの商品です」
  • ユーザーの属性に応じたおすすめ:ユーザーベース
    • 「あなたにおすすめの商品です」
  • パーソナライズされたランキングの表示
    • おすすめ商品が10個あった場合、それらを表示する順序をユーザーごとに変えるイメージ

こうしたレコメンデーションを実装するには機械学習の知識や経験が必要となりますが、この分野のスキルセットを持っている人は限られています。そこで、フルマネージドサービスであるAmazon Personalizeを使うことでマネジメントコンソールからガイドに沿ってデータの取り込み・モデルの作成などが手軽に実施可能です。

Amazon Personalize とは - Amazon Personalize

Personalize基礎用語

利用するにあたって知っておいた方がいい概念をかいつまんで紹介します。図にすると以下のようなイメージです。(この2つの違いは後述します。)

カスタムデータセットグループ:

ドメインデータセットグループ:

データセットグループ

Personalizeで最初に作るのがこのデータセットグループです。データセットグループはその名の通りデータセットをまとめる役割を持ちます。

ドメインデータセットグループとカスタムデータセットグループ

データセットグループを作成する際にドメインを指定します。

種類 説明
ドメインデータセットグループ 特定のドメインに特化したレコメンドをするためのデータセットグループ。VIDEO_ON_DEMANDとECOMMERCEが利用可能。リアルタイムジョブのみ可能。
カスタムデータセットグループ 広範囲な用途のレコメンドに使えるカスタムデータセットグループ。リアルタイムジョブとバッチジョブの両方に対応。

上記の図で示しているように、ドメインデータセットグループはSolution/Solution Version/Campaignの部分をラップして比較的設定が少なくリアルタイム推論ができる機能です。詳細は以下のブログをご参照ください。

データセット

レコメンドモデルを作成するためのデータを指します。格データセットに最低データ件数があります。少なくとも2件以上のアイテムインタラクションを持つ1000人のユーザーから、最低でも50000件のアイテムインタラクションがあるとより高品質なレコメンドを実施できます。

データセット種類 説明
Item interactions ユーザーとアイテムの間のインタラクションの履歴。最低1000件のレコードが必要。(例:特定のアイテムにユーザーが「いいね!」をした履歴)
Users ユーザーに関するメタデータ。最低25件のユニークなuserIDが必要。(例:年齢、性別、ポイント会員)
Items アイテム(商品)に関するメタデータ(例:価格、SKUタイプ、在庫状況)
Actions 顧客に勧めたいエンゲージメント活動に関するメタデータ(例:アプリのインストール、プロフィールの記入、プロモーションメールの購読など)
Action interactions ユーザーとアクション(顧客に勧めたいエンゲージメント活動)の間のインタラクションの履歴。最低2件必要。(例:特定のユーザーがプロフィールの記入をした/しなかった履歴)

レシピ

レコメンドに利用するアルゴリズムを指します。利用可能なレシピは以下の通り。

レシピ 説明
USER_PERSONALIZATION 特定ユーザーに向けてパーソナライズされたリスト取得(例:「あなたにおすすめの商品です」)
PERSONALIZED_RANKING アイテムのリストを特定ユーザーに向けて並び替える(例:「あなたが気に入りそうな商品です」)
RELATED_ITEMS 類似アイテムを推薦(例:「この商品を購入した人におすすめの商品です」)
POPULAR_ITEMS トレンドや人気アイテムを推薦
PERSONALIZED_ACTIONS 特定ユーザーに最適な次のアクションを推薦(例:ロイヤリティプログラムへの参加をおすすめする)
USER_SEGMENTATION ユーザーのセグメントを取得(例:購入してほしい商品に合うユーザーを探す)

その他制限事項や詳細については以下のドキュメントをご確認ください。

Choosing a recipe - Amazon Personalize

user-personalization、personalized-rankingについては2024/5/2のアップデートでv2がリリースされました。公式リリースによると、前バージョンと比べてレコメンデーションの精度が最大9%向上し、レコメンデーションの対象範囲が最大1.8倍拡大したとのことです。

検証ブログは以下の通り。

ソリューション

複数のモデルを入れる箱のようなイメージです。レシピやパラメータを指定してソリューションを作成します。

ソリューションバージョン

ソリューションでトレーニングを行うとソリューションバージョンが作成されます。モデルのようなものだと考えてください。

キャンペーン

ソリューションバージョンからキャンペーンを作成し、APIアクセスすることでレコメンド結果を取得できる環境を作成します。

レコメンダー

ソリューションとキャンペーンをラップしたものというイメージです。ドメインデータセットグループを利用した場合、レコメンダー(Recommender)に対してリクエストをします。

参考:

使い方

ざっくりとした流れ

Amazon Personalizeの利用の流れとしては、以下のとおりです。

  1. データの準備・取り込み
  2. モデルの作成・学習
  3. レコメンデーション作成

バッチ推論を試してみる

実際にPersonalizeを使ってみましょう。今回はこちらのハンズオンをベースにバッチ推論を試してみます。

データの準備

以下のサイトより映画の評価データ(ml-latest-small.zip)をダウンロードして利用します。このデータを加工して、「特定のユーザーがある映画をある時間に見た」というリストを作成し、次に見る映画をPersonalizeを使っておすすめしてみましょう。

ratings.csvinteractions.csvにリネームし、レコメンドに利用しないrating列を削ってカラムをそれぞれ予約語であるUSER_ID, ITEM_ID, TIMESTAMPにリネームします。これらは必須の入力データです。設定ができたらinteractions.csvをS3バケットに配置します。

  • USER_ID: 会員IDなど、ユーザーを一意に識別するID
  • ITEM_ID: SKUなど、商品やアイテムを一意に識別するID(今回は映画のID)
  • TIMESTAMP: 購買処理日時など(今回は映画を見た日時)
    • UNIX TIMESTAMPのみ利用可能です

データを取り込む

まずはCreate dataset groupからデータセットグループを作成します。E-commerceやVideo on demandの用途には該当しないので、ドメインはCustomを選択します。

Create datasetからitem interactions datasetを選択します。

Import methodを選択します。今回はすでにデータが整形され、すぐに使える状態のため、Import data directly into Amazon Personalize datasetsで進めます。

データセットのスキーマを定義します。データセットの種類ごとに定義が必要です。今回はInteractionsの定義をしました。

{
	"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"
}

Personalizeを利用するためのIAMロールを作成します。

データを置いたS3バケットにもバケットポリシーを以下のように指定します。

{
    "Version": "2012-10-17",
    "Id": "PersonalizeS3BucketAccessPolicy",
    "Statement": [
        {
            "Sid": "PersonalizeS3BucketAccessPolicy",
            "Effect": "Allow",
            "Principal": {
                "Service": "personalize.amazonaws.com"
            },
            "Action": [
                "s3:GetObject",
                "s3:ListBucket",
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::<作成したバケット名>",
                "arn:aws:s3:::<作成したバケット名>/*"
            ]
        }
    ]
}

全て完了したらインポートジョブを実行し、データを取り込みます。

モデルの作成・実行

データインポートが終了し、データセットが作成されるとソリューションが作成できるようになります。Create solutionsから実施します。 Solution TypeにはItem recommendationを、Recipeにはaws-user-personalizationを指定します。

ハイパーパラメータ変更やトレーニングするカラムの指定などができますが、デフォルト設定のまま進んでソリューション作成します。

レコメンデーション作成

今回は冒頭で記載したとおり、バッチ推論を行います。バッチ推論をする際はバッチ入力JSONデータを準備する必要があります。今回はuserIdを含めたJSONLファイルを以下の通り準備し、input.jsonlと名前をつけてS3バケットに配置しました。これらのuserIdに応じたレコメンド結果を取得できます。

なお、userIdは厳密に大文字小文字を区別して記載する必要があります。

Preparing input data for batch recommendations - Amazon Personalize

{"userId": 1}
{"userId": 2}
{"userId": 3}
{"userId": 4}
{"userId": 5}
{"userId": 6}
{"userId": 7}
{"userId": 8}
{"userId": 9}
{"userId": 10}

Get recommendationsからcreate batch inference jobを指定します。campaignを指定するとリアルタイム推論のレコメンデーションを作成します。

先ほど作成したソリューションやソリューションバージョンや入力データ、出力先S3バケットを指定してcreate batch inference jobを実行します。

実行が完了すると出力先に指定したS3バケットにoutファイルが生成されます。 中身を見ると、スコア順が高いおすすめ順に並んでアイテム(今回は映画)がレコメンドされていることが確認できました。

{
  "input": {
    "userId": 1
  },
  "output": {
    "recommendedItems": [
      "2081",
      "1380",
      "3793",
      "1035",
(中略)
      "2692",
      "4308",
      "2797",
      "2671",
      "2712"
    ],
    "scores": [
      0.0088618,
      0.0065327,
      0.0053816,
      0.0053691,
      0.0050853,
      0.0048317,
(中略)
      0.002566
    ]
  },
  "error": null
}

料金

大きく分けてデータ取り込み、トレーニング、レコメンデーション(バッチ/リアルタイム)で料金がかかります。

データ取り込み

Personalizeにアップロードされたデータに対し、1GBあたり0.05USD課金されます。

トレーニング

トレーニングにかかる時間、1時間あたり0.24USD課金されます。

レコメンデーション

以下から表を引用しています。

料金 - Amazon Personalize | AWS

リアルタイム推論

リアルタイムで課金が発生するため、バッチ推論よりも比較的高額になりやすいです。1秒あたりのリクエスト回数を指すTransaction per second(TPS)という概念があり、Minimum provisioned transaction per secondという設定項目で1秒間に処理可能な最低スループットを指定可能ですが、この最小値は1のため、まったくリクエストが無い状態でも最低でも1日4ドルは課金されます。

リアルタイムレコメンデーション レコメンデーションリクエスト 1,000 件あたりの料金
1 か月あたり 最初の 7,200 万件のリクエスト 0.0556 USD
次の 1 か月あたり 6 億 4,800 万件のリクエスト 0.0278 USD
1 か月あたり 7 億 2,000 万件超のリクエスト 0.0139 USD

バッチ推論

バッチ推論はリクエストされたレコメンデーションの数に応じた課金が発生します。

バッチレコメンデーション レコメンデーション 1,000 件あたりの料金
対象リージョンごとに最初の 2,000 万件のレコメンデーション/月 0.067 USD
対象リージョンごとに次の 1 億 8,000 万件のレコメンデーション/月 0.058 USD
対象リージョンごとに 2 億件以上のレコメンデーション/月 0.050 USD

最後に

以上、『AWS 入門ブログリレー 2024』の41日目のエントリ『Amazon Personalize』編でした。 次回、5/12は弊社Nayuta S.による「AWS Glue編」の予定です!