推荐系统的评价指标
最近一直在看推荐系统相关的东西,深深感到人过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;
IRStatistics evaluate(RecommenderBuilder recommenderBuilder, DataModelBuilder dataModelBuilder, DataModel dataModel, IDRescorer rescorer, int at, double relevanceThreshold, double evaluationPercentage) throws TasteException;
public interface IRStatistics { double getPrecision(); double getRecall(); double getFallOut(); double getF1Measure(); double getFNMeasure(double n); double getNormalizedDiscountedCumulativeGain(); double getReach(); }
// Precisionprecision.addDatum((double) intersectionSize / (double) numRecommendedItems);
int intersectionSize = 0; List<RecommendedItem> recommendedItems = recommender.recommend(userID, at, rescorer); for (RecommendedItem recommendedItem : recommendedItems) { if (relevantItemIDs.contains(recommendedItem.getItemID())) { intersectionSize++; } }
// Recall recall.addDatum((double) intersectionSize / (double) numRelevantItems);
fallOut.addDatum((double) (numRecommendedItems - intersectionSize) / (double) (numItems - numRelevantItems));