[アップデート] Amazon Personalizeの推論フィルターでアイテムやユーザーのメタデータを条件としてフィルタできるようになりました

2020.08.28

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

2020年6月に追加されたAmazon Personalizeの推論フィルターが早くもアップデートされました!
INTERACTIONデータのEVENT_TYPEだけでなく、アイテムメタデータによるフィルタリングに対応しました。これにより、さらに柔軟なレコメンドのフィルタリングが可能となります。 本記事では、新しい推論フィルターの作成方法から実際の適用例までを解説します。

記事の概要

  • Amazon Personalizeの推論フィルターがアップデートした
  • InteractionsのEVENT_TYPEに対する条件しか使えなかったのが、アイテムやユーザーのメタデータを条件に使えるようになった
  • 推論フィルターの条件は独自のフィルター式で記述する
  • 実際に推論フィルターを作成してレコメンド作成時に適用したところ、意図通りにレコメンドアイテムを絞り込むことができた

アップデート以前の推論フィルター

アップデート以前の推論フィルターではINTERACTIONデータのEVENT_TYPE列のみを条件として、レコメンドアイテムから指定したEVENT_TYPEのアイテムを除外することができました。
詳細は以下の記事を参照してください。

アップデートによる変更点

アップデート後の推論フィルターでは、INTERACTIONデータのEVENT_TYPE列だけでなく、アイテムやユーザーのメタデータに含まれる列項目もフィルタの条件として使用できるようになりました。
例えば、アイテムのメタデータに含まれるアイテムのカテゴリに対して、特定のカテゴリに該当するアイテムのみをレコメンドアイテムから除外したり、ユーザーのメタデータに含まれるユーザーの年齢に対して、指定した範囲の年代のユーザーに対するレコメンド結果に絞り込むような操作が可能になります。

推論フィルターの条件は専用のフィルター式を用いて設定します。
フィルター式は特定のアイテムを含む、あるいは除外するという2パターンを使用できます。

  • INCLUDE ItemID WHERE <条件式> : 特定のアイテムをレコメンドに含めます。
  • EXCLUDE ItemID WHERE <条件式> : 特定のアイテムをレコメンドから除外します。

条件として使用するデータセットの指定は以下の通りです。ユーザーのメタデータだけ少し特殊なキーワードになります。

Interactionsデータセット : Interaction Itemsデータセット : item Usersデータセット : CurrentUser

フィルター式で使用できる要素は以下の通りです。

  • IN / NOT IN : 指定した値に一致する、もしくは一致しないデータに絞り込みます。
  • =, <, <=, >, >, = : 比較演算子による条件を設定し、当てはまるデータに絞り込みます。
  • AND / OR : 論理演算子により、複数の条件式を一つのフィルター式内で接続します。
  • IF : CurrentUserのみ使用可能で、フィルター式の最後に一回だけ使用できます。itemに対する条件式とCurrentUserに対する条件式を接続する際に使用します。
  • * (ワイルドカード) : Interactionのevent_typeプロパティに対してのみ*で「何らかのevent_typeで行動したデータ」を指定できます。
  • | (パイプ区切り文字) : 複数のフィルター式を接続します。

例として、アイテムメタデータにアイテムのダウンロード数(number_of_download)、ユーザーメタデータに年齢(age)がスキーマ定義されているとします。

  • Item
    • item_id (必須フィールド)
    • number_of_down_loads
  • User
    • user_id (必須フィールド)
    • age

ユーザーの年齢が19〜29歳ダウンロード数が20未満という条件でレコメンドアイテムを除外する場合は以下のフィルター式になります。

EXCLUDE ItemID WHERE item.number_of_downloads < 20 IF CurrentUser.age > 18 AND CurrentUser.age < 30

詳細については下記の公式ドキュメントを参照してください。

メタデータを条件に利用したフィルタリングを適用してみる

検証用データの準備

検証用データとしてみんな大好きMovieLensのデータを加工してそれっぽくしたものを使用します。

各データセットのスキーマは以下の通りです。

  • Interaction
    • user_id
    • item_id
    • timestamp
  • Item
    • item_id
    • category
  • User
    • user_id
    • age
    • gender

実際にインポートしたデータは下図のような感じです。

データセットのインポートからソリューション作成(モデル学習)までの処理

データセットグループの作成、データセットの作成とデータインポート、ソリューションの作成(モデルの学習)までの処理については従来と変わらない為、本記事では省略します。
これらの操作については下記の記事などをご参照ください。

推論フィルターの作成

Filtersの画面でCreate new filterを選択して、レコメンドに適用する推論フィルターを作成する画面を開きます。

推論フィルターのフィルター式はBuild expressionにより、GUIでの作成も可能です。

今回はAdd expression manuallyで直接フィルター式を記述してフィルターを作成します。

入力したフィルター式は以下の通りです。

INCLUDE ItemId where items.category IN ("Action", "ScienceFiction") IF CurrentUser.age >= 18 AND CurrentUser.gender = "1"

問題発生:想定外のフィルタ作成処理時間

ここで少々問題が発生しまして、上記設定で実行したフィルタ作成の処理が一晩経っても(12時間ぐらい)完了しておらず、ずっとCreate in progress状態になっていました。
これについては、別途調査・検証が必要ではあるのですが、一旦もう少しシンプルなフィルター式で推論フィルターを作成してみます。

以下の通り、アイテムのメタデータに対する条件のみに絞り込みました。

INCLUDE ItemId where items.category IN ("Action", "ScienceFiction")

推論フィルターを適用したレコメンドの作成

作成した推論フィルターを実際にレコメンド作成時に適用してみます。

比較の為に、まずはフィルター未適用のレコメンド結果を取得します。

次にフィルターを適用したレコメンド結果を取得します。
幾つかのアイテムが絞り込まれていることが確認できます。

レコメンドされているアイテムのcategoryを確認すると、ちゃんとフィルター条件に該当するアイテムはレコメンドに含まれていて、該当しないアイテムが除外されています。

ScienceFictionはレコメンドに含まれている

Fantasyはレコメンドから除外されている

まとめ

Amazon Personalizeのアップデートされた推論フィルターについて解説しました。
以前の推論フィルターでは意図通りにレコメンドアイテムを絞り込めなかったケースにも対応できるので、各所の本番環境への適用が加速しそうです。