[アップデート] Amazon Personalizeに選択したEventTypeのアイテムをレコメンドから除外するフィルターが追加されました

ECサイトやら動画配信サービスで、既に購入済み・視聴済みとか、欲しいものリスト・マイリストに登録済みのモノを改めてレコメンドされるとちょっとイラっとしますよね。
2020.06.10

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

データアナリティクス事業本部の貞松です。

Amazon Personalizeのアップデートにより、選択したEventTypeのアイテムをレコメンドから除外することができるようになりました。このアップデートにより、既に購入済みの商品を除外してレコメンドを作成する等の処理について自前でコードを記述する必要がなくなります。

Introducing Recommendation Filters in Amazon Personalize - AWS Machine Learning Blog

実際にフィルターを使用した実行例を以下で解説していきます。

検証内容

今回検証する内容を下記のように設定します。

  • 映像作品に対するユーザーの視聴履歴データを対象とする
  • EVENT_TYPEとして、watched(視聴済み)とbookmark(あとで観る)の2種類を用意
  • ソリューション(レコメンドモデル)の学習にはEVENT_TYPEがwatchedのデータのみを使用
  • 作成される各ユーザーに対するレコメンドから、そのユーザーの視聴履歴に含まれるアイテム(EVENT_TYPEがwatched、bookmark両方)をフィルターで除外する

上記設定の意図としては「ソリューションの学習には実際に各ユーザーが視聴したデータのみを対象としつつ、作成されるレコメンドからは視聴済みとあとで観るの両方を除外したい(ユーザーが既に視聴あるいは注目しているアイテムなのでレコメンドしても効果がない)」というケースを想定しています。

※結論から先に述べてしまうと、Personalizeのレコメンデーションフィルターではソリューション作成時に学習データとして含まれていないEVENT_TYPEはレコメンド作成時にフィルター適用しても除外することができません(元のデータセットには含まれているEVENT_TYPEだとしても)
今回の例で言うところのEVENT_TYPEがwatchedとbookmark両方のデータを学習データとして使用(watchedだけのデータに絞り込まない)してソリューションを作成し、そのソリューションでレコメンドを作成した場合は、watchedとbookmarkを除外する設定をしたフィルターを適用することで、watchedだけでなくbookmarkもレコメンドアイテムから除外されます。

EVENT_TYPEを含むスキーマでデータセットを作成する

レコメンデーションフィルターではEVENT_TYPEをフィルタの対象とする為、まずはスキーマにEVENT_TYPEが設定されたデータセットを作成します。(必須のスキーマはUSER_ID ITEM_ID TIMESTAMP)

上記で作成したデータセットに対して、定義されたスキーマに沿ったデータをインポートします。

学習で対象とするEVENT_TYPEを指定してソリューションを作成する

データのインポートが完了したら、ソリューションを作成します。

検証内容のセクションで記載した通り、学習に使用するデータを絞り込みたいので、Event typeにwatchedを設定して実行します。

レコメンデーションフィルタを作成する

ソリューション作成にはかなり時間が掛かるので、その隙に今回の肝であるレコメンデーションフィルターを作成します。

今回のアップデートにより、Personalizeの画面に左にあるサイドメニューにfilterが追加されているので、それを選択してフィルターの画面を開きます。

フィルターの画面が開いたら、右上のCreate new filterをクリックします。

フィルター作成画面のAdd filtered event typesで、除外したいEVENT_TYPEを入力してAdd event typeをクリックします。 除外したいEVENT_TYPEを全て(今回はwatchedとbookmarkの2つ)追加したらFinishをクリックしてフィルタを作成します。

レコメンデーションフィルターを適用してレコメンドを作成する

ソリューションの作成が完了したら、作成したソリューションを使用してレコメンドを作成します。 検証の為、フィルター適用のあり・なし2パターンを作成して比較します。

コンソール上でリアルタイムレコメンデーションを実行する為に、まずキャンペーンを作成します。

キャンペーンの作成が完了したら、作成したキャンペーンの画面を開いて、レコメンド対象となるUSER_IDと適用するフィルターを選択します。

ここではUSER_ID=199を対象として、フィルターの挙動を確認します。

USER_ID=199のユーザーはITEM_ID=1466をブックマーク登録、ITEM_ID=1513を既に視聴しています。

まずはフィルター適用なしのレコメンド結果です。
ITEM_ID=1466およびITEM_ID=1513が含まれています。

次に前述で作成済みのフィルターを適用したレコメンド結果です。
視聴済みのITEM_ID=1513が除外されていますが、ブックマーク済みのITEM_ID=1466が除外されていません。

レコメンデーションフィルターの仕様確認

前述の挙動から察するに、どうやらレコメンデーションフィルターで除外できるのは、ソリューション作成時に学習データに含まれているEVENT_TYPEだけのようです。
念の為、学習データにwatchedとbookmarkが両方含むソリューションを作成して挙動を確認します。

ここではUSER_ID=28を対象として、フィルターの挙動を確認します。

USER_ID=28のユーザーはITEM_ID=47099をブックマーク登録、ITEM_ID=4446を既に視聴しています。

まずはフィルター適用なしのレコメンド結果です。
ITEM_ID=47099およびITEM_ID=4446が含まれています。

次にフィルターを適用したレコメンド結果です。
ITEM_ID=47099とITEM_ID=4446の両方ともレコメンドから除外されています。

学習データに含まれているEVENT_TYPEであればちゃんとフィルターによってレコメンドアイテムから除外されることが確認できました。

まとめ

Amazon Personalizeのアップデートで追加されたレコメンデーションフィルターについて動作を検証しました。
残念ながら冒頭に記載した想定ケースの使い方はできませんでしたが、購入・視聴履歴データに対して、単純に購入済み・視聴済みを除外する処理など、これまで自力でコード実装していた部分が楽に処理できるようになり、Personalizeの利便性が増したと言えます。

参考URL

Amazon Personalize Developer Guide - Filtering Recommendations
※2020/06/10現在 英語ページのみ