Amazon Personalizeの動的なレコメンデーションフィルターで範囲クエリを適用してみる

久々にAmazon Personalizeのレコメンデーションフィルターの話です。ぶっちゃけ最初は全く実用に耐えなかったこの機能も実戦投入可能なレベルになってきました。
2022.12.18

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

データアナリティクス事業本部 インテグレーション部 機械学習チームの貞松です。

本記事は「クラスメソッド 機械学習チーム アドベントカレンダー 2022」の18日目です。
昨日(17日目)は クルトン による BiqQuery MLでTensorFlowのモデルをインポートして予測やメタデータの確認などをしてみた でした。

Amazon Personalizeには、任意の条件でレコメンドアイテムを絞り込むことができるレコメンデーションフィルタ機能が存在します。
レコメンデーションフィルタには、固定の値で条件判定する静的なフィルターとフィルタ適用時に動的に変更された値で条件判定する動的なフィルターを作成することができます。 少し前のアップデートにより、動的フィルターの条件判定部分で、任意の値に対する範囲クエリを使用できるようになっているので、今回はこの機能について実際に動作を検証します。

使用するデータセット

使用するデータセットのスキーマは以下の通りです。
UsersにAGE(ユーザーの年齢)、ItemsにRATING(年齢制限区分)が含まれています。

  • Interactions
    • USER_ID
    • ITEM_ID
    • TIMESTAMP
  • Users
    • USER_ID
    • AGE
  • Items
    • ITEM_ID
    • RATING

各データセットにインポートするデータは以下のようなデータとなっています。

interactions

users

items

フィルターの作成

フィルターを作成します。
itemsデータセットのRATINGに関する条件式とusersデータセットのAGEに関する条件式について、動的に値をセット可能なプレースホルダー(先頭に$をつけた変数)を設定しています。
AGEに関する条件式について、範囲クエリ(この場合は"<"演算子)を使用しています。

EXCLUDE ItemID WHERE Items.RATING IN ($RATING) IF CurrentUser.AGE < $AGE

フィルターの適用

キャンペーン機能(リアルタイムレコメンド機能)を使用したレコメンドアイテムの生成時に、作成したフィルターの適用有無でどのように挙動が変わるかを確認します。

対象ユーザーはUSER_ID=535のユーザーとします。AGEは14です。

まずはフィルター適用なしで実行します。

ITEM_ID=356や318など、RATINGがR18+のアイテムが含まれています。

次に作成したフィルターを適用して実行します。
動的フィルターとして作成しているので、プレースホルダーのRATINGには「R18+」を、AGEには「18」を入力します。
これにより、「AGEが"18"未満のユーザーは、レコメンドアイテムからRATINGが"R18+"のアイテムを除外する」というフィルターが掛かります。

ITEM_ID=356や318など、フィルター適用なしの時に含まれていたRATINGがR18+のアイテムが除外されていることが確認できます。

動的フィルターに範囲クエリが使用できると何が嬉しいのか

今回の例で言うと、RATINGがGとR15+のみに変更された場合でも、フィルターを作り直すことなく、フィルター適用時のプレースホルダーの値として「R15+」と「15」を入力するだけで目的のフィルタリングが実行できるので、固定値や静的フィルターしか無かった時と比較して、かなり柔軟にフィルタリングできるようになったと言えます。他にも実際の利用ケースに合わせたフィルター式を構築できそうです。

まとめ

Amazon Personalizeの動的なレコメンデーションフィルターで新たに利用可能となった範囲クエリについて、実際の作成から動作までを検証しました。
いよいよ本番環境運用時にも柔軟にレコメンデーションフィルターを適用できそうな感じになってきました。
本記事の内容が、これまでAmazon Personalizeから生成したレコメンドアイテムに対して、自前実装のフィルタリングを適用していた方々の助けになれば幸いです。