Mahout in Action 读书笔记chapter2 推荐系统

http://blog.csdn.net/feitongxunke​

1.推荐定义

  • 基于用户(user-based):要找到你可能喜欢的物品,你可以观察与你志趣相投的人喜欢什么。
  • 基于物品(item-based):通过观察其他人的明显偏好,你可以弄清楚哪些东西和你已然喜欢的物品相似。
  • 基于内容(content-based):立足于物品的属性来推荐,但是很难规整为一个框架。

Mahout对于基于内容的推荐较少。前两者是协同过滤的返利,也就是仅仅通过了解用户与物品之间的关系进行推荐。

2.运行第一个推荐引擎

2.1创建输入test.csv

这里的数据是以偏好值表达的,指的是用户对物品的喜好指数。

   
   
   
   
  1. 1,101,5
  2. 1,102,3
  3. 1,103,2.5
  4. 2,101,2
  5. 2,102,2.5
  6. 2,103,5
  7. 2,104,2
  8. 3,101,2.5
  9. 3,104,4
  10. 3,105,4.5
  11. 3,107,5
  12. 4,101,5
  13. 4,103,3
  14. 4,104,4.5
  15. 4,106,4
  16. 5,101,4
  17. 5,102,3
  18. 5,103,2
  19. 5,104,4
  20. 5,105,3.5
  21. 5,106,4

这个时候可以分析下,用户对物品的喜欢,这里举个例子:1,5用户喜好相同,都喜欢101,然后喜欢102,最后103。然后5用户对104,106的评价是4,那么推荐给1用户应该不错。下面就是我们第一个推荐程序。

2.2第一个推荐程序

直接放出代码:

   
   
   
   
  1. import org.apache.mahout.cf.taste.impl.model.file.*;
  2. import org.apache.mahout.cf.taste.impl.neighborhood.*;
  3. import org.apache.mahout.cf.taste.impl.recommender.*;
  4. import org.apache.mahout.cf.taste.impl.similarity.*;
  5. import org.apache.mahout.cf.taste.model.*;
  6. import org.apache.mahout.cf.taste.neighborhood.*;
  7. import org.apache.mahout.cf.taste.recommender.*;
  8. import org.apache.mahout.cf.taste.similarity.*;
  9. import java.io.*;
  10. import java.util.*;
  11. class RecommenderIntro {
  12. public static void main(String[] args) throws Exception {
  13. DataModel model = new FileDataModel(new File("/Users/ericxk/Downloads/test.csv"));
  14. UserSimilarity similarity = new PearsonCorrelationSimilarity(model);
  15. UserNeighborhood neighborhood =new NearestNUserNeighborhood(2, similarity, model);
  16. Recommender recommender = new GenericUserBasedRecommender( model, neighborhood, similarity); //生成推荐系统
  17. List<RecommendedItem> recommendations = recommender.recommend(1, 2); //为用户1推荐2个物品
  18. for (RecommendedItem recommendation : recommendations) {
  19. System.out.println(recommendation);
  20. }
  21. }
  22. }

3评估一个推荐程序

常见的方法是评估其估计的偏好值的质量,也就是评估所估计的偏好在多大程度上与实际的偏好相匹配。

3.1训练数据与评分

书中这里用的平均差和均方根来作为评价指标,下面的代码是用平均差。

3.2运行评估程序

代码如下:

   
   
   
   
  1. import org.apache.mahout.cf.taste.common.TasteException;
  2. import org.apache.mahout.cf.taste.eval.RecommenderBuilder;
  3. import org.apache.mahout.cf.taste.eval.RecommenderEvaluator;
  4. import org.apache.mahout.cf.taste.impl.eval.AverageAbsoluteDifferenceRecommenderEvaluator;
  5. import org.apache.mahout.cf.taste.impl.model.file.*;
  6. import org.apache.mahout.cf.taste.impl.neighborhood.*;
  7. import org.apache.mahout.cf.taste.impl.recommender.*;
  8. import org.apache.mahout.cf.taste.impl.similarity.*;
  9. import org.apache.mahout.cf.taste.model.*;
  10. import org.apache.mahout.cf.taste.neighborhood.*;
  11. import org.apache.mahout.cf.taste.recommender.*;
  12. import org.apache.mahout.cf.taste.similarity.*;
  13. import org.apache.mahout.common.RandomUtils;
  14. import java.io.*;
  15. class RecommenderIntro {
  16. public static void main(String[] args) throws Exception {
  17. RandomUtils.useTestSeed();
  18. DataModel model = new FileDataModel(new File("/Users/ericxk/Downloads/test.csv"));
  19. RecommenderEvaluator evaluator = new AverageAbsoluteDifferenceRecommenderEvaluator();
  20. RecommenderBuilder builder = new RecommenderBuilder() { //构建推荐程序
  21. public Recommender buildRecommender(DataModel model)throws TasteException {
  22. UserSimilarity similarity = new PearsonCorrelationSimilarity(model);
  23. UserNeighborhood neighborhood = new NearestNUserNeighborhood(2, similarity, model);
  24. return new GenericUserBasedRecommender(model, neighborhood, similarity);
  25. }
  26. };
  27. double score = evaluator.evaluate(builder, null, model, 0.7, 1.0); //训练70% 测试30%
  28. System.out.println(score);
  29. }
  30. }

3.3评估结果

如果要使用均方根,可以用RMSRecommenderEvaluator代替AverageAbsoluteDifferenceRecommenderEvaluator。这里吐槽下,这些函数名字都好长。不过长的好处就是一看函数名就知道是干什么用的。

4.评估查准率与查全率

查准率(precision)查全率(recall),这两个很好理解,不懂可以百度下。在放出precision和recall之前要说问题。##就是我们推荐系统是
推荐用户没有交互过##,但是最好的推荐结果不一定都在那些用户已知的物品中,测试框架这里只会从用户已有的偏好集合中选择好的推荐。这里可以打个比喻就是,一道题有很多种解法,结果你做的解法都不在正确解法里面,但是也有可能是对的。话题转过来,对于推荐系统,如果偏好是布尔型即是01,那么这个问题就很麻烦,因为没有相对偏好的概念可用于选出包含好物品的数据子集。但是这个precision和recall还是有一定用处的,不能说是很完美的选择。下面放出代码:

   
   
   
   
  1. import org.apache.mahout.cf.taste.common.TasteException;
  2. import org.apache.mahout.cf.taste.eval.IRStatistics;
  3. import org.apache.mahout.cf.taste.eval.RecommenderBuilder;
  4. import org.apache.mahout.cf.taste.eval.RecommenderIRStatsEvaluator;
  5. import org.apache.mahout.cf.taste.impl.eval.GenericRecommenderIRStatsEvaluator;
  6. import org.apache.mahout.cf.taste.impl.model.file.*;
  7. import org.apache.mahout.cf.taste.impl.neighborhood.*;
  8. import org.apache.mahout.cf.taste.impl.recommender.*;
  9. import org.apache.mahout.cf.taste.impl.similarity.*;
  10. import org.apache.mahout.cf.taste.model.*;
  11. import org.apache.mahout.cf.taste.neighborhood.*;
  12. import org.apache.mahout.cf.taste.recommender.*;
  13. import org.apache.mahout.cf.taste.similarity.*;
  14. import org.apache.mahout.common.RandomUtils;
  15. import java.io.*;
  16. class RecommenderIntro {
  17. public static void main(String[] args) throws Exception {
  18. RandomUtils.useTestSeed();
  19. DataModel model = new FileDataModel(new File("/Users/ericxk/Downloads/test.csv"));
  20. RecommenderIRStatsEvaluator evaluator = new GenericRecommenderIRStatsEvaluator();
  21. RecommenderBuilder recommenderBuilder = new RecommenderBuilder() {
  22. public Recommender buildRecommender(DataModel model)throws TasteException {
  23. UserSimilarity similarity = new PearsonCorrelationSimilarity(model);
  24. UserNeighborhood neighborhood =new NearestNUserNeighborhood(2, similarity, model);
  25. return new GenericUserBasedRecommender(model, neighborhood, similarity);
  26. }
  27. };
  28. IRStatistics stats = evaluator.evaluate(recommenderBuilder, null, model, null, 2, GenericRecommenderIRStatsEvaluator.CHOOSE_THRESHOLD, 1.0);
  29. System.out.println(stats.getPrecision());
  30. System.out.println(stats.getRecall());
  31. }
  32. }

5.评估GroupLens数据集

书中介绍了这个网站https://www.grouplens.org/, 具体给的数据集链接给错了,应该是这个https://www.grouplens.org/datasets/movielens/ ,下载了个几M的数据集,跑了下,偏差是
0.926020408163265,这个结果并不理想。

书中这里介绍了其他的推荐程序,org.apache.mahout.cf.taste.impl.recommender.slopeone.SlopeOneRecommeder 不过很遗憾我用的mahout0.9并没有在impl.recommender中找到slopeone。

你可能感兴趣的:(Mahout)