2.3 Evaluating a recommender/2.4 Evaluating precision and recall

今回は 2.3 Evaluating a recommender と 2.4 Evaluating precision and recall です。

Recommender を評価するために Evaluator が用意されています。
ここで使うのは以下 3 種。

AverageAbsoluteDifferenceRecommenderEvaluator 予測と実際の値の差 (絶対値) の平均
RMSRecommenderEvaluator 予測と実際の値の差の RMS (2 乗平均平方根)
GenericRecommenderIRStatsEvaluator precision/recall など

2.3 Evaluating a recommender

まず差の平均を使う例

object EvaluatorIntro extends App {

  RandomUtils.useTestSeed()
  val model = new FileDataModel(new File("../MIA/src/main/java/mia/recommender/ch02/intro.csv"))
  val evaluator = new AverageAbsoluteDifferenceRecommenderEvaluator
  //val evaluator = new RMSRecommenderEvaluator

  val builder = new RecommenderBuilder {
    def buildRecommender(model: DataModel) = {
      val similarity = new PearsonCorrelationSimilarity(model)
      val neighborhood = new NearestNUserNeighborhood(2, similarity, model)
      new GenericUserBasedRecommender(model, neighborhood, similarity)
    }
  }

  val score = evaluator.evaluate(builder, null, model, 0.7, 1.0)
  println(score)
}

RecommenderEvaluator の evaluate メソッドの定義は以下の通り。

  double evaluate(RecommenderBuilder recommenderBuilder,
                  DataModelBuilder dataModelBuilder,
                  DataModel dataModel,
                  double trainingPercentage,
                  double evaluationPercentage) throws TasteException;

dataModelBuilder にはここでは null を渡しています。DataModel をカスタマイズしたい場合に指定するらしい。
trainingPercentage はトレーニングデータセットの割合を指定します。残りはテストデータセットとして使われます。
evaluationPercentage は全体のデータセットのうち評価で使う割合を指定します。上の例では 100% 全部使います。評価にかかる時間を短くしたい場合に調整するそうです。

2.4 Evaluating precision and recall

続いて GenericRecommenderIRStatsEvaluator を使って precision と recall を計算する例です。ちなみに IR は Information Retrieval の略です。Wikipedia が詳しいですね。http://en.wikipedia.org/wiki/Information_retrieval

この Evaluator により Precision, Recall を計算できます。

object IREvaluatorIntro extends App {

  RandomUtils.useTestSeed()
  val model = new FileDataModel(new File("../MIA/src/main/java/mia/recommender/ch02/intro.csv"))
  val evaluator = new GenericRecommenderIRStatsEvaluator

  val builder = new RecommenderBuilder {
    def buildRecommender(model: DataModel) = {
      val similarity = new PearsonCorrelationSimilarity(model)
      val neighborhood = new NearestNUserNeighborhood(2, similarity, model)
      new GenericUserBasedRecommender(model, neighborhood, similarity)
    }
  }

  val stats = evaluator.evaluate(
    builder, null, model, null, 2,
    GenericRecommenderIRStatsEvaluator.CHOOSE_THRESHOLD,
    1.0)
  println(stats)
}

GenericRecommenderIRStatsEvaluator は RecommenderIRStatsEvaluator インタフェースを実装していて、その evaluate メソッドの定義は以下の通りです。

  IRStatistics evaluate(RecommenderBuilder recommenderBuilder,
                        DataModelBuilder dataModelBuilder,
                        DataModel dataModel,
                        IDRescorer rescorer,
                        int at,
                        double relevanceThreshold,
                        double evaluationPercentage) throws TasteException;

なんか全体的に引数が多いですね。
relevanceThreshold は関連があるとみなす最低の preference 値、上の例のように CHOOSE_THRESHOLD とするとその人の preference 値の平均 + 標準偏差にしてくれるとのこと。
低い preference 値を付けると予測されているのに推薦しないように設定するそうです。

実行結果はこんなの

IRStatisticsImpl[precision:0.75,recall:1.0,fallOut:0.08333333333333333,nDCG:1.0]

precision, recall が計算できました。

今回はここまで。
コードはこちらにあります https://github.com/akr4/mia-study