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

本文介绍了在推荐系统中,如何利用Apache Mahout进行推荐效果的评估,特别是通过平均绝对误差(Mean Absolute Error, MAE)这一指标来衡量推荐的准确性。" 105131615,5661518,Go语言互斥锁Mutex深度解析,"['golang', '并发编程', 'go']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先说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 results
DataModel model = new FileDataModel (new File("intro.csv"));
RecommenderEvaluator evaluator =
new AverageAbsoluteDifferenceRecommenderEvaluator ();


RecommenderBuilder builder = new RecommenderBuilder() { // builds recommender
@Override
public 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() { @Override
public 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());



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值