Taste of Tech Topics

Acroquest Technology株式会社のエンジニアが書く技術ブログ

Amazon PersonalizeのEC用レコメンダーを利用してみた

こんにちは、@shin0higuchiです😊

今回はAmazon Personalize を利用して、ECサイト向けのレコメンデーションを実現したいと思います。

皆さんも普段ECサイトを利用するかと思いますが、
おすすめされた商品を、つい買ってしまう方もいるのではないでしょうか。(私も、買うつもりが無かった物につい手を出してしまうことがあります...)

近頃のECサイトでは、ユーザーの年代や性別、商品の閲覧履歴などを踏まえて、ひとりひとりに最適化(パーソナライズ)された推薦(レコメンデーション)を導入することが多くあります。

ユーザーごとに的確な商品を推薦することは、売り上げの増加に直結しますが、適切なレコメンダーを構築するには相応の仕組みや知識が必要となり、ハードルが高いと言えます。通常は、学習のためのデータ加工やモデルの設計なども含め自分で実施したり、計算リソースの整備をしたりと、導入までの時間やコストが膨らみがちかと思います。
AWSAmazon Personalizeを利用することで、専門知識がなくとも簡単にレコメンダーを構築することが可能です。

2021年の末に、Amazon Personalizeの新機能としてEC向けに最適化されたレコメンダーがリリースされたのでそちらを試してみました。
aws.amazon.com




1. Amazon Personalize とは?

「Amazon Personalize」は、Amazon.com でも利用されているという、機械学習アルゴリズムが利用でき、手軽に高精度なレコメンデーションを実現できるサービスです。
前述のとおり、機械学習の専門知識がなくとも利用できるというのが大きな売りと言えるでしょう。
f:id:shin0higuchi:20220220235836p:plain:w600
f:id:shin0higuchi:20220220234114p:plain:w600

2. ECサイトレコメンダーの基本的な使い方

Amazon Personalize を利用する際の基本的な使い方の流れは次のようになります。

  1. データの準備
  2. S3へのデータ配置
  3. データセットの作成
  4. レコメンダーの作成
  5. 推論(レコメンド)の実行

データの準備

以下の3種類のデータが登録可能。
最低限 Interactions のデータがあればレコメンド可能ですが、より適切なレコメンドのためには3種類とも用意するのが良いと言えます。

No. 種別 概要 含まれるカラム例
1 Users ユーザのマスタ情報 ユーザID、任意のカテゴリ・数値データ(性別や年齢等)
2 Items 商品のマスタ情報 商品ID、任意のカテゴリ・数値(商品カテゴリや価格、登録日等)
3 Interactions ユーザの商品に対するアクションを記録したもの タイムスタンプや、アクションの種別

上記のデータは、CSV形式で用意します。
例えばInteractionsであれば、次のようなデータを用意することになります。

USER_ID,ITEM_ID,TIMESTAMP,EVENT_TYPE
1000,1,1645375967,view
1000,2,1645376900,view
1000,1,1645380267,purchase
2000,5,1645450267,view
...

上記のデータは、ユーザ1000はが商品1と2を閲覧したあとで商品1を購入しているのがわかりますね。
こういったデータを学習データとして用いてレコメンダーを構築していきます。

S3へのデータ配置

用意したCSVファイルはS3の任意のバケットに配置しておき、後述のPersonalize側の設定でパスを指定します。この時、Personalizeからアクセスできるようにバケットポリシーを設定します。

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

データセットの作成

  • PersonalizeのメニューからDataset Groupを作成する。

f:id:shin0higuchi:20220304014233p:plain:w600

用意したCSVデータに合わせて、JSONスキーマを定義する。
f:id:shin0higuchi:20220313002736p:plain:w600

  • 必要に応じて、同様の手順でUser / Item のデータも登録する

f:id:shin0higuchi:20220313003219p:plain:w600

上記はS3から一括でデータを登録する方法ですが、以下のAPIからデータを登録することも可能です。
https://docs.aws.amazon.com/ja_jp/personalize/latest/dg/API_UBS_PutUsers.html
https://docs.aws.amazon.com/ja_jp/personalize/latest/dg/API_UBS_PutItems.html
https://docs.aws.amazon.com/ja_jp/personalize/latest/dg/API_UBS_PutEvents.html

レコメンダーの作成

これまでのAmazon Personalizeでは、ここから自前で「Solution」と「Campaign」を作成する必要がありました。(Solution≒「学習モデル」、Campaign≒「レコメンド実行APIのエンドポイント」と考えてもらえば良いかと思います。)

ですが、ECサイトドメインでは上記に相当する「レコメンダー」と呼ばれるものが用意されており、それを選択して有効化するのみで利用可能です。
f:id:shin0higuchi:20220313003605p:plain:w600

以下5種類のレコメンダーが用意されています。

  • Customers who viewed X also viewed(Xを見たお客様はこちらも見ています)
  • Frequently bought together(よく一緒に購入されている商品)
  • Best sellers(よく売れている商品)
  • Most viewed(よく閲覧されている商品)
  • Recommended for you(あなたへのオススメ)

いずれも実際に Amazon.com で利用されている内容のようで、実用的なものばかりですね。

推論(レコメンド)の実行

レコメンドの実行は REST API や、各種SDKが提供されています。たとえばPythonで呼び出す場合は以下のようになります。userIdが10のユーザに対して、5件のレコメンドを返す内容です。コメントアウトしていますが、フィルタを定義することで結果を絞って返すことも可能です。商品のカテゴリを絞ったり、特定の商品を除外したりする用途で利用できそうですね。

import boto3
client = boto3.client('personalize-runtime')
response = client.get_recommendations(
    userId='10',
    numResults=5,
#    filterArn='string',
#    filterValues={
#        'string': 'string'
#    },
    recommenderArn='作成されたレコメンダーのARN'
)

レスポンスは以下のように返ってきます。itemList というのが実際にレコメンドされた商品ですね。いとも簡単にレコメンダーが構築できました。

{
  "ResponseMetadata": {
    "RequestId": "22587508-868d-4683-b435-27fffe5db320",
    "HTTPStatusCode": 200,
    "HTTPHeaders": {
      "content-type": "application/json",
      "date": "Sat, 05 Mar 2022 10:33:53 GMT",
      "x-amzn-requestid": "22587508-868d-4683-b435-27fffe5db320",
      "content-length": "319",
      "connection": "keep-alive"
    },
    "RetryAttempts": 0
  },
  "itemList": [
    {
      "itemId": "210"
    },
    {
      "itemId": "582"
    },
    {
      "itemId": "535"
    },
    {
      "itemId": "93"
    },
    {
      "itemId": "30"
    }
  ],
  "recommendationId": "RID-d7fea433-9a85-45dd-868f-616e2f2d2870"
}

まとめ

Amazon Personalizeを利用することで、ECサイト向けのレコメンダーを構築する方法をご紹介しました。特にECサイトでの利用を想定して最適化されたモデルを、手軽にそのまま適用することができるのは大きな強みだと感じました。今回はデータ準備も含めて構築は1,2時間程度で済みました。全てゼロから実装したら検証も含め数週間~数ヶ月かかるのではないかと思います。

近頃のシステム開発の特徴として、時間をかけずに短期間で目に見える成果を求められるケースが多い印象があります。自前でゼロから構築すると時間やコストがかかるうえ、それに見合った効果が得られるかが見通しづらく、導入に踏み切るのは難しいと感じる方も多いのではないでしょうか。

ちなみに本記事では説明を割愛していますが、Amazon Personalizeは運用面でもかなり使いやすい設計になっています。レコメンドした後のユーザーの反応をフィードバックしてモデルを改善していくことも可能で、個人的にはそのメリットも非常に大きいと感じています。

精度の確認方法についてですが、従来の利用方法(レシピを自分で選択してSolutionと呼ばれるモデルを作る)では確認することができたのですが、ECサイト用のレコメンダーでは現状サポートされていないようです。現状ではレコメンド結果から自分で精度を算出する必要がありそうです。
#これまでも機能追加が頻繁におこなわれているので、そのうち実装されるのではないかと思っています。

また、料金体系は試される前に事前確認するようにしてください。(これまでの方式と異なりデータセット内のユニークユーザー数が料金に影響する点に注意です)
aws.amazon.com


Amazon.comでの実績をもとにECサイトに最適化されたレコメンダー。
是非導入を検討してみてはいかがでしょうか。


今回の記事は以上になります。最後までお読みいただきありがとうございました。


Acroquest Technologyでは、キャリア採用を行っています。

  • ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
  • Elasticsearch等を使ったデータ収集/分析/可視化
  • マイクロサービス、DevOps、最新のOSSを利用する開発プロジェクト
  • 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長

 
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。
Kaggle Grandmasterと話したいエンジニアWanted! - Acroquest Technology株式会社のデータサイエンティストの採用 - Wantedlywww.wantedly.com