--------------------------
评价一个推荐系统的好坏,有很多种方式,项亮的《推荐系统实践》中已经有比较全面的描述。书中给出了十种评价的维度,其中准确率、召回率、多样性这三种指标可以通过离线实验计算得出。其余的用户满意度、信任度等指标则需要通过问卷调查和在线实验得出。
在《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/ 。好吧,其实我没看懂
![](/images/smiles/icon_redface.gif)
最后F1Measure是准确率和召回率的一个加权平均,是一个对准确率和召回率的综合衡量指标。不多说了。可参考: http://www.cnblogs.com/bluepoint2009/archive/2012/09/18/precision-recall-f_measures.html
但是。。这些指标里边没有流行度、多样性、新颖性的计算指标。要实现还得自己来。