読者です 読者をやめる 読者になる 読者になる

MAHOUT In Action - RecommenderIRStatsEvaluatorの中身

Mahout In Action の中身から外れて、RecommenderIRStatsEvaluatorを hack してみましょう。
実装は、GenericRecommenderIRStatsEvaluatorクラスですね。
この evaluate()メソッドがどうなってるんでしょうか?

引数は以下です。

  • recommenderBuilder:レコメンダー作成用
  • dataModelBuilder:テストデータのデータモデル作成用
  • dataModel:データ全体
  • rescorer:スコアを修正用
  • at:上位何位までを推薦したときの精度を評価するか
  • relevanceThreshold:よい推薦と考える閾値
  • evaluationPercentage:テストに使うデータ量
中身の処理

evaluationPercentageは通常1.0を使うと思うので、これに関連する部分は省きます。
intro.csvを使って試してみましょう。

どうやら、ユーザごとに学習データを作成して、評価しているみたい。

以下をユーザごとに実行している。

1, ユーザA用学習データを作成
1-1, at*2個以上のコンテンツ評価がないユーザは評価しない(データ数が十分でないと判断)。
   ここで、ユーザID1は評価対象から除外。
1-2, よい推薦と考える閾値を設定(relevanceThresholdがある場合はこれ、NaNなら、平均+分散)。
1-3, テストデータを選択(コンテンツ評価上位からat個までで、かつ閾値以上のコンテンツ評価を選択)。
1-4, テストデータがないユーザは評価しない。
1-5, ユーザA以外のコンテンツ評価と、ユーザAのテストデータ以外の評価で、学習データを作成。

2, ユーザA用レコメンダーを作成
2-1, ユーザA用学習データを使ってレコメンダー作成

3, 正解数を測定し、適合率再現率を出す
3-1, ユーザA用レコメンダーから、ユーザAのat番目までの推薦アイテムを取得。
3-2, 推薦アイテムが、テストデータ内にあったら正解数カウント。
3-3, 適合率、再現率を計算

最後に、適合率と再現率は、ユーザごとの結果の平均を出力している。

この評価の仕方って普通?

なんか釈然としないところ

  • ユーザごとの適合率、再現率を平均している点
  • 各ユーザのもっともよさそうなコンテンツを除いている点

なんとなく、想像していたのは、全体の適合率と再現率を測ると思っていた。

なので、各ユーザからat個分のコンテンツ評価をランダムに選択し、テストデータにする。
残りを学習データにする。
レコメンダーは、学習データで学習。
レコメンダーから、全ユーザの推薦アイテムを取得。
全体の正解数をカウント。
適合率と再現率を出力。

後者のもっともよさそうなコンテンツを除いている点は、理解できる。
というのは、どのくらいベストな推薦ができるかを測るので、よい評価のアイテムをテストデータにするということ。

やっぱり、前者が釈然としない。

実際のシチュエーションでは、同じくらいの時間経過なので、各ユーザのデータの少なさも同じくらいなのではないかな。