首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 互联网 >

推荐系统的评估指标

2013-08-06 
推荐系统的评价指标最近一直在看推荐系统相关的东西,深深感到人过30后记忆力下降,一些概念看过很容易就忘

推荐系统的评价指标
最近一直在看推荐系统相关的东西,深深感到人过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:准确率,有的地方又叫查准率。不贴公式了,直接看计算代码
// Precisionprecision.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


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

热点排行