Amazon Web Services ブログ

Amazon Personalizeにおけるレコメンドのビジネス影響を測定する

Amazon Personalizeで、パーソナライズされたレコメンデーションがビジネス目標の達成にどのように役立つかを測定できるようになったことをお知らせします。追跡したいメトリクスを指定した後、どのキャンペーンやレコメンダーが最もインパクトがあるかを特定し、レコメンデーションがビジネス指標に与える影響を理解することができます。

すべてのお客様は、自社のビジネスにとって最も重要な指標をトラッキングしたいとお考えです。例えば、オンラインショッピングアプリケーションは、レコメンデーションのクリックスルー率(CTR)と総購入数の2つの指標をトラッキングしたいと思うかもしれません。異なるレコメンダーがレコメンドを提供するカルーセルを持つビデオオンデマンドのプラットフォームは、CTRまたは視聴時間を比較したいと考えるかもしれません。また、例えばユーザーが商品を購入した場合など、指定したイベントタイプの総売上やマージンをモニタリングすることもできます。この新しい機能により、Amazon Personalizeのキャンペーンやレコメンダー、サードパーティソリューションによって生成されたインタラクションの影響を測定することができます。

この投稿では、Eコマースのユースケースでメトリクスを追跡し、Personalizeレコメンデーションの影響を評価する方法を紹介します。

ソリューション概要

これまでは、パーソナライズされたレコメンデーションの効果を理解するために、手動でワークフローを構築してビジネス指標データを取得し、それを意味のある表現で提示して比較を行う必要がありました。しかし、Amazon Personalizeでは、追跡したいメトリクスを定義して監視できるようになったため、このような運用上の手間は不要になりました。Amazon Personalizeは、パフォーマンスデータをAmazon CloudWatchに送信して可視化と監視を行うこともできますし、Amazon Simple Storage Service (Amazon S3)のバケットに送信して、メトリクスにアクセスしたり、他のビジネスインテリジェンスツールに統合したりすることも可能です。これにより、イベントやレコメンデーションがビジネス目標に与える影響を効果的に測定し、監視したいあらゆるイベントの結果を観察することができます。

レコメンデーションの影響を測定するには、Amazon PersonalizeコンソールまたはAPIを使用してレポートしたいイベントタイプのリストである「metric attribution」を定義します。各イベントタイプについて、計算したいメトリクスと関数(合計またはサンプル数)を定義するだけで、Amazon Personalizeが計算を実行し、生成されたレポートをCloudWatchまたはAmazon S3に送信します。

次の図は、単一のレコメンダーまたはキャンペーンからメトリクスを追跡する方法を表しています:

図1. 機能概要: インタラクションデータセットは、レコメンダーやキャンペーンをトレーニングするために使用されます。次に、ユーザーがレコメンドしたアイテムとインタラクションすると、これらのインタラクションはAmazon Personalizeに送信され、対応するレコメンダーまたはキャンペーンに紐づけられます。次に、これらのメトリクスはAmazon S3およびCloudWatchにエクスポートされ、それらをモニタリングして各レコメンダーまたはキャンペーンのメトリクスを比較できるようにします。

metric attributionでは、各インタラクションに対して、ユーザーがアイテムにインタラクションした際のシナリオを指定するeventAttributionSourceも提供しています。次の図は、Amazon Personalizeのmetric attributionを使用して、2つの異なるレコメンダーのメトリクスを追跡する方法を表しています。

図2. 2つのシナリオのレコメンデーションにおけるビジネス影響を測定する: インタラクションデータセットは、2つのレコメンダーまたはキャンペーン(この場合は「Blue」と「Orange」)をトレーニングするために使用されます。そして、ユーザーがレコメンドされたアイテムにインタラクションしたとき、これらのインタラクションはAmazon Personalizeに送信され、そのとき利用されたレコメンダー、キャンペーン、シナリオに紐付けられます。次に、これらのメトリクスはAmazon S3とCloudWatchに出力されるため、それらをモニタリングして各レコメンダーやキャンペーンのメトリクスを比較ができるようになります。

この例では、Amazon Personalizeでインタラクションデータのmetric attributionを定義するプロセスについて説明します。まず、データをインポートし、レコメンデーションのビジネス影響を測定するために2つのmetric attributionを作成します。次に、2つの小売レコメンダーを作成し(カスタムレコメンデーションソリューションを使用している場合も同じプロセスです)、メトリクスを追跡するためにイベントを送信します。最低限始めるためには、インタラクションのデータセットだけが必要です。しかし、この例で追跡するメトリクスの1つはマージンなので、itemsデータセットをインポートする方法も紹介します。このユースケースのコードサンプルは、GitHubで公開されています。

前提条件

AWS ConsoleやAPIを使用して、Amazon Personalizeでレコメンデーションを作成することができます。APIでは例えば、AWS Command Line InterfaceまたはAWS SDK for Pythonを使用することができます。

レコメンデーションの影響を計算してレポートするには、まずいくつかのAWSリソースをセットアップする必要があります。

Amazon Personalizeが引き受けるAWS Identity and Access Management(IAM)ロールを、適切なロールポリシードキュメントと共に作成する必要があります。また、Amazon PersonalizeがS3バケットからデータにアクセスし、CloudWatchにデータを送信できるようにするためのポリシーを添付する必要があります。詳細については、「Amazon PersonalizeにAmazon S3バケットへのアクセス許可を与える」や「Amazon PersonalizeにCloudWatchへのアクセス許可を与える」を参照してください。

次に、いくつかのAmazon Personalizeリソースを作成する必要があります。データセットグループを作成し、データをロードし、レコメンダーをトレーニングします。完全な手順については、「Getting started」を参照してください。

1 . データセットグループを作成する。metric attributionはドメインデータセットグループカスタムデータセットグループのどちらもで使用できます。

2 . 以下のスキーマを使用して、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"
    },
    {
        "name": "EVENT_TYPE",
        "type": "string"
    }
],
 "version": "1.0" 
}

3 . 以下のスキーマを使用してItemsデータセットを作成します:

{
    "type": "record",
    "name": "Items",
    "namespace": "com.amazonaws.personalize.schema",
    "fields": [
        {
            "name": "ITEM_ID",
            "type": "string"
        },
        {
            "name": "PRICE",
            "type": "float"
        },
        {
            "name": "CATEGORY_L1",
            "type": ["string"],
            "categorical": True
        },
        {
            "name": "CATEGORY_L2",
            "type": ["string"],
            "categorical": True
        },
        {
            "name": "MARGIN",
            "type": "double"
        }
    ],
"version": "1.0"
}

Amazon Personalizeにデータをインポートする前に、metric attributionを定義します。

Metric Attributionの作成

メトリクスの生成を開始するには、メトリクスの収集をしたいイベントのリストを指定します。選択したイベントタイプごとに、Amazon Personalizeがデータを収集する際に適用する関数を定義します。利用できる関数はSUM(DatasetType.COLUMN_NAME)SAMPLECOUNT()で、DatasetTypeにはINTERACTIONSまたはITEMSデータセットが使用できます。可視化とモニタリングのためにメトリクスデータをCloudWatchに送信するか、代わりにS3バケットにエクスポートすることができます。

metric attributionを作成し、イベントを記録するか、増分バルクデータをインポートすると、メトリクスごとにいくらかのCloudWatchの月額コストが発生します。CloudWatchの価格については、CloudWatchの価格ページを参照してください。CloudWatchへのメトリクス送信を停止するには、metric attributionを削除してください。

この例では、2つのmetric attributionを作成します:

  1. SAMPLECOUNT()を使用して、「View」イベントの総数をカウントする。この関数は、INTERACTIONS データセットのみを必要とします。
  2. SUM(DatasetType.COLUMN_NAME)を使用して、購入イベントが発生したときのマージンの合計を計算します。この場合、DatasetTypeITEMS、カラム名はMARGINで、アイテム購入時のマージンを追跡することになります。PurchaseイベントはINTERACTIONSデータセットに記録されています。マージンを購入イベントでトリガーするためには、購入した各アイテムの個々のユニットに対して購入イベントを送信する必要があることに注意してください。もし、ユーザーがチェックアウト時に複数のアイテムを購入することができ、すべてのアイテムに対して1つの購入イベントを送信するだけであれば、別の指標がより適切でしょう。

サンプル数を計算する機能は、INTERACTIONSデータセットでのみ利用可能です。しかし、マージンの合計はITEMSデータセットを持っていることと、計算の設定をすることが必要です。それぞれについて、追跡するeventType、使用する関数を指定し、エクスポートした後にメトリクスを識別するためのmetricNameを与えます。この例では、「countViews」と「sumMargin」という名前を付けています。

コードサンプルはPythonで書かれています。

import boto3 
personalize = boto3.client('personalize')

metrics_list = [{
        "eventType": "View",
        "expression": "SAMPLECOUNT()",
        "metricName": "countViews"
    },
    {
        "eventType": "Purchase",
        "expression": "SUM(ITEMS.MARGIN)",
        "metricName": "sumMargin"
}]

また、データのエクスポート先も定義します。この場合、S3バケットです。

output_config = {
    "roleArn": role_arn,
    "s3DataDestination": {
    "path": path_to_bucket    
    }
}

そして、metric attributionを作成します。

response = personalize.create_metric_attribution(
name = metric_attribution_name,
datasetGroupArn = dataset_group_arn,
metricsOutputConfig = output_config,
metrics = metrics_list
)
metric_attribution_arn = response['metricAttributionArn']

メトリクス属性に名前(name)を付け、datasetGroupArnを使用してメトリクスが紐づくデータセットグループを示し、前回作成したmetricsOutputConfigmetricsオブジェクトを指定する必要があります。

これで、metric attributionが作成されたので、データセットのインポートジョブに進めることができます。S3バケットからアイテムおよびインタラクションデータセットを、先程設定したデータセットグループにロードします。

既存のmetric attributionを変更または削除する方法については、metric attributionを管理するを参照してください。

データの取り込みとレコメンダーの作成

まず、Amazon S3からAmazon Personalizeにインタラクションデータをインポートします。この例では、以下のデータファイルを使用します。Retail Demo Storeプロジェクトのコードに基づき、人工データを生成しました。人工データと想定される用途の詳細については、GitHubリポジトリを参照してください。

次に、レコメンダーを作成します。この例では、2つのレコメンダーを作成します:

  1. Recommended for you“。このレコメンダーは、指定したユーザーに対して、パーソナライズされたアイテムのおすすめを作成します。
  2. Customers who viewed X also viewed“。このレコメンダーは、指定したアイテムに対して、顧客が他にも閲覧しているアイテムのおすすめを作成します。

Amazon Personalizeにイベントを送信し、レコメンダーに紐付ける

Amazon Personalizeにインタラクションを送信するには、Event Trackerを作成する必要があります。

各イベントについて、Amazon PersonalizeはeventAttributionSourceを付与できます。これはrecommendationIdから推測することもできますし、明示的に指定してレポートでEVENT_ATTRIBUTION_SOURCEカラムで特定することもできます。eventAttributionSourceには、レコメンダー、シナリオ、またはサードパーティが管理する、インタラクションが発生したページの一部を指定することができます。

  • もしrecommendationIdを付与した場合、Amazon Personalizeは自動的にソースキャンペーンまたはレコメンダーを推測します。
  • もし両方の属性を付与した場合、Amazon Personalizeはソースのみを使用します。
  • ソースまたは recommendationId を提供しない場合、Amazon Personalize はレポートにおいてソースに SOURCE_NAME_UNDEFINED というラベルを付けます。

次のコードは、PutEvents操作でイベントにeventAttributionSourceを付与する方法を示しています。

response = personalize_events.put_events(
trackingId = 'eventTrackerId',
userId= 'userId',
sessionId = 'sessionId123',
eventList = [{
'eventId': event_id,
'eventType': event_type,
'itemId': item_id,
'metricAttribution': {"eventAttributionSource": attribution_source},
'sentAt': timestamp_in_unix_format
}
}]
)
print (response)

メトリクスを見る

Amazon Personalizeは、メトリクスをAmazon CloudWatchまたはAmazon S3に送信します:

すべてのバルクデータについて、metric attributionを作成する際にAmazon S3バケットを指定した場合、Amazon S3バケットにメトリクスレポートを発行することができます。インタラクションデータのデータセットインポートジョブを作成するたびに、これを行う必要があります。

import boto3

personalize = boto3.client('personalize')

response = personalize.create_dataset_import_job(
    jobName = 'YourImportJob',
    datasetArn = 'dataset_arn',
    dataSource = {'dataLocation':'s3://bucket/file.csv'},
    roleArn = 'role_arn',
    importMode = 'INCREMENTAL',
    publishAttributionMetricsToS3 = True
)

print (response)

データのインポート時に、インポートモードでINCREMENTALまたはFULLを選択し、publishAttributionMetricsToS3Trueに設定することで、Amazon Personalizeにメトリクスを出力させます。Amazon S3へのメトリクスレポートの出力の詳細については、「Publishing metrics to Amazon S3」を参照してください。

Event Tracker経由のPutEventsデータ送信、および増分バルクデータインポートの場合、Amazon Personalizeは自動的にCloudWatchにメトリクスを送信します。Amazon CloudWatchでは、過去2週間分のデータを見ることができ、それ以前のデータは参照されません。

CloudWatchコンソールで直接メトリクスをグラフ化するには、metric attributionを作成したときに付けた名前を使って検索します。CloudWatchでこれらのメトリクスを表示する方法の詳細については、CloudWatchでメトリクスを表示するを参照してください。

図3: 2つのレコメンドのCTRを比較をCloudWatchコンソールで描画した例

インポートとAmazon S3へのメトリクスの出力

データセットインポートジョブによってAmazon Personalizeにデータをアップロードし、metric attributionにAmazon S3バケットのパスを指定した場合、ジョブが完了するとAmazon S3内にメトリクスを確認できます。

メトリクスを出力するたびに、Amazon PersonalizeはAmazon S3バケットに新しいファイルを作成します。ファイル名には、インポート方法と日付が含まれています。EVENT_ATTRIBUTION_SOURCEフィールドは、イベントソース、つまり、どのシナリオの下でインタラクションが行われたかを指定します。Amazon Personalizeでは、このフィールドを使用してEVENT_ATTRIBUTION_SOURCEを明示的に指定することができ、これはサードパーティのレコメンダーとすることもできます。詳細については、「Amazon S3へのメトリクスの出力」を参照してください。

要約

metric attributionを追加することで、レコメンデーションがビジネス指標に与える影響を追跡することができます。データセットグループにmetric attributionを追加し、追跡したいイベントと、イベントをカウントする機能またはデータセットフィールドを集約する機能を選択することで、これらのメトリクスを作成します。その後、CloudWatchまたはAmazon S3にエクスポートされたファイルで、興味のあるメトリクスを確認することができます。

Amazon Personalizeの詳細については、「What Is Amazon Personalize?」を参照してください。

翻訳はソリューションアーキテクト近藤が担当しました。原文はこちら(2023/2/14 公開)です。