推荐系统的评价指标

最近一直在看推荐系统相关的东西,深深感到人过30后记忆力下降,一些概念看过很容易就忘了,还是记录到这里。

--------------------------
评价一个推荐系统的好坏,有很多种方式,项亮的《推荐系统实践》中已经有比较全面的描述。书中给出了十种评价的维度,其中准确率、召回率、多样性这三种指标可以通过离线实验计算得出。其余的用户满意度、信任度等指标则需要通过问卷调查和在线实验得出。

在《Recommender Systems Handbook》中,论述的更加详细,对实验设计、各种评测指标的来源都很学术化,如推荐物品覆盖程度的测量中,用到了基尼系数(Gini Index)和香农熵(Shannon entropy),这些货太过于高端大气上档次,等有时间再看吧。(不过看得出来《推荐系统实践》写作时参考了《Recommender Systems Handbook》)。

update:重新看了下《推荐系统实践》,里边也提到了基尼系数和香农熵。

实际工程中可使用Mahout的实现来进行离线数据评测,Mahout提供了一套评价器用来做这个事情。评价器分别实现了RecommenderEvaluator和RecommenderIRStatsEvaluator接口,RecommenderEvaluator接口提供了evaluate方法
double evaluate(RecommenderBuilder recommenderBuilder,
                  DataModelBuilder dataModelBuilder,
                  DataModel dataModel,
                  double trainingPercentage,
                  double evaluationPercentage) throws TasteException;

这个评测器是拿一部分数据做训练集,一部分数据做测试集,返回的是训练集推荐结果与测试集实际结果的差异评测值(即偏好度的差异)。

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

这个接口会返回更详细的测评结果IRStatistics。
public interface IRStatistics {

  double getPrecision();
  double getRecall();
  double getFallOut();
  double getF1Measure();
  double getFNMeasure(double n);
  double getNormalizedDiscountedCumulativeGain();
  double getReach();
  
}

IRStatistics中包含的指标就是上边接口列出来的内容,mahout已经很贴心的给出了这些指标在维基上的定义。可以看出来,所有指标都是信息检索(Information_retrieval)这个学科用到的,并不是专门为推荐系统定义的。


下边详细看一下指标含义:
Precision:准确率,有的地方又叫查准率。不贴公式了,直接看计算代码
// Precision
precision.addDatum((double) intersectionSize / (double) numRecommendedItems);

intersectionSize 的定义见下边:
      int intersectionSize = 0;
      List<RecommendedItem> recommendedItems = recommender.recommend(userID, at, rescorer);
      for (RecommendedItem recommendedItem : recommendedItems) {
        if (relevantItemIDs.contains(recommendedItem.getItemID())) {
          intersectionSize++;
        }
      }

很明显,intersectionSize 就是推荐结果里边被用户实际点到的数量。而准确率就是实际点到的数量除以推荐的总数量。有5个推荐结果,用户点了一个,准确率就是20%。

Recall:召回率
// Recall
      recall.addDatum((double) intersectionSize / (double) numRelevantItems);

召回率是推荐中用户实际点到的数量除以用户点击的总数量。用户一共点了5次,其中一次是推荐系统给出的,召回率是20%.

Reach:到达率,比较简单,就是有推荐的人数占总人数比率,(double) numUsersWithRecommendations / (double) numUsersRecommendedFor)

Fall-out:不知道怎么翻译,计算方式是
fallOut.addDatum((double) (numRecommendedItems - intersectionSize)
                         / (double) (numItems - numRelevantItems));

推荐的物品中用户没点击的数量除以 用户每点击的总数量。比较奇怪的一个指标。

NormalizedDiscountedCumulativeGain参见 http://blog.163.com/bit_runner/blog/static/5324221820115206420604/ 。好吧,其实我没看懂

最后F1Measure是准确率和召回率的一个加权平均,是一个对准确率和召回率的综合衡量指标。不多说了。可参考: http://www.cnblogs.com/bluepoint2009/archive/2012/09/18/precision-recall-f_measures.html


但是。。这些指标里边没有流行度、多样性、新颖性的计算指标。要实现还得自己来。

猜你喜欢

转载自yuxie.iteye.com/blog/1919341