[推荐系统]mahout支持的对推荐引擎的评价方法

来源:互联网 发布:中国海洋大学 知乎 编辑:程序博客网 时间:2024/06/06 16:17
先说3种简单的评测方式

1,平均绝对误差,Average Absolute difference,越小越好

2,RMS,Root-mean-square,对偏离较大的值惩罚较大。也是越小越好

3,准确率和召回率
在有rating的评测里,要给 prcision 和 recall 设置一个 threashold 用于区分good recommendation和bad recommendation。如果没有明确指定,mahout这个framework会为每一个user设定一个threshold,就是user的平均rating ,加上标准差.
threshold = mu + sigma

这种评测方法可能面临一个问题:就是user 可能对某个item非常感兴趣,但是user从来没有看过它,而我们的推荐引擎 评测方法 并不会把这个推荐作为一个good recommendation。mahout能做的最好的就是随机选user 喜欢的item作为 good recommendation。
这种评测方法是有用的,但绝对不是完美的。
在boolean preference的推荐中,只有precision和recall可以用。所以我们要明白这种评测方法的局限性

*下面是使用平均绝对误差的例子

RandomUtils.useTestSeed();     // generate repeatable resultsDataModel model = new FileDataModel (new File("intro.csv"));RecommenderEvaluator evaluator =new AverageAbsoluteDifferenceRecommenderEvaluator ();RecommenderBuilder builder = new RecommenderBuilder() { // builds recommender@Overridepublic Recommender buildRecommender(DataModel model)      throws TasteException {UserSimilarity similarity = new PearsonCorrelationSimilarity (model); UserNeighborhood neighborhood = new NearestNUserNeighborhood (2, similarity, model);  return new GenericUserBasedRecommender (model, neighborhood, similarity); }};double score = evaluator.evaluate(    builder, null, model, 0.7, 1.0);//  trains with 70%, test with 30%System.out.println(score);

大部分工作都在evaluate里面发生,RecommenderEvaluator把数据分为 training 和test集合。
用training DataModel来做推荐,然后用test data对推荐结果进行评测

RandomUtils.useTestSeed() 使每次实现的随机数一样,这样保证分割数据不会出乱子。
但是这个只能用于unit test。不能出现在real code

这里使用的是 Average absolute difference,如果要使用root-mean-square,可以把 AverageAbsoluteDifferenceRecomenderEvaluator 改为 RMSRecommenderEvaluator

*下面是使用准确率和召回率的例子 
RandomUtils.useTestSeed();DataModel model = new FileDataModel (new File("intro.csv"));RecommenderIRStatsEvaluator evaluator =          new GenericRecommenderIRStatsEvaluator ();RecommenderBuilder recommenderBuilder = new RecommenderBuilder() { @Overridepublic Recommender buildRecommender(DataModel model)throws TasteException {UserSimilarity similarity = new PearsonCorrelationSimilarity (model); 
UserNeighborhood neighborhood = new NearestNUserNeighborhood (2, similarity, model);  return new GenericUserBasedRecommender (model, neighborhood, similarity); }};IRStatistics stats = evaluator.evaluate(recommenderBuilder, null, model, null, 2, GenericRecommenderIRStatsEvaluator.CHOOSE_THRESHOLD, 1.0);System.out.println(stats.getPrecision());System.out.println(stats.getRecall());



0 0
原创粉丝点击