代表的なレコメンド評価指標の実装と可視化

代表的なレコメンド評価指標の実装と可視化


最近、業務でレコメンドシステムの評価指標(メトリクス)の調査に取り組んでいます。
Precision@KやRecall@K、MAP@Kといったオフラインにおけるレコメンド指標の概要(簡単なsampleを使った説明)に関してはwebページの随所にみられますが、その実装コードや実際に指標を使って結果を比較している記事はなかなか見つかりません。
なので、今回は実際にテストデータをいくつか作成し、各指標を比較してみました。
実装したコードやテストデータはGithubにpushしています。

計測するレコメンド指標

今回は以下のオフラインレコメンド指標を対象とします。
以下、簡単に各指標の概要をまとめますが、丁寧な説明はブレインパッドさんの記事を参考にしてください。

指標説明
Precision@KレコメンドしたK個のアイテムにおいて、実際にユーザが嗜好したアイテムの割合。
$$ \frac{N(rec(K) \cap actual)}{K} $$
Recall@K実際にユーザが嗜好したアイテムにおいて、レコメンドしたK個のアイテムが含まれる割合。
$$ \frac{N(rec(K) \cap actual)}{N(actual)} $$
f1-score@KPrecision@K、Recall@Kを両方考慮した指標。$$ \frac{2\cdot Precision@K \cdot Recall@K}{Precision@K + Recall@K} $$
MAP@KユーザごとにPrecision@KのKについての平均を算出し(AP@K)、その結果についてユーザ全体の平均をとる。
$$ AP@K = \sum^k_{i=1}\frac{Precision@i}{min(k,N(actual))} $$
$$ MAP@K = \sum_{u \in U}\frac{{AP@K}_u}{N(U)} $$

オフライン指標の実装

上記で説明した指標を実装しました。
基本的にactual:ユーザが嗜好したアイテムのlist、predicted:レコメンドしたアイテムのlistとkを入力することで指標が得られます。
ただし、各リストの順番(ユーザ)は一致していることを前提とします。

テストデータ

実際にユーザが嗜好した場合は1、嗜好しなかった場合は0として以下のようなcsvデータを用意します。
ここで、各行はユーザ、各列は左から順にユーザが実際にアクションしたアイテムを意味しています。
test.csv

なお、テストデータは以下にあげています。異なる3つのテストデータを用意しています。


このcsvデータをlistで読み込みます。

この0、1のテストデータから、擬似的に実際に嗜好したアイテム、レコメンドしたアイテムを割り振ります。

上記により、実際にユーザが嗜好したアイテム、レコメンド結果のサンプルのlistを作成できます。

オフライン指標の可視化

上記で作成した実際にユーザが嗜好したアイテム、レコメンド結果のサンプルをもとに、各指標を算出し、可視化します。

まとめ

レコメンドのオフライン指標(メトリクス)は本記事で説明した以外にも様々なものが存在します。
レコメンドシステムが実装されているドメインやどんなアイテムをレコメンドしているのかに応じて指標は変わってくるのでしょう。
いずれにしてもこれらのオフラインレコメンド指標は、過去データに基づいてユーザの嗜好性を予測できているかどうかを測る指標にすぎません。
例え、オフライン指標が良い精度を出していたとしても、実際にユーザにアイテムをレコメンドした結果(オンライン)も良くなるとは限らないのです。

なので、レコメンドアルゴリズムを正しく評価するためには、オフライン指標単体ではなく、オンライン指標(A/BテストでCVRを測定)も見る必要があると思います。
このアルゴリズムはオフラインではこのくらいの指標なので、オンラインだとこれくらいになるとか、オンライン指標-オフライン指標の関係性を見いだせればいいのかなと思っています。

参考

以前に行動履歴を使ったレコメンドの実装方法に関して投稿しています。


MAP@Kを詳しく説明しているページです。