Mahout in Action 读书笔记chapter2 推荐系统
2014-07-08 21:39
295 查看
http://blog.csdn.net/feitongxunke
1.推荐定义
基于用户(user-based):要找到你可能喜欢的物品,你可以观察与你志趣相投的人喜欢什么。基于物品(item-based):通过观察其他人的明显偏好,你可以弄清楚哪些东西和你已然喜欢的物品相似。
基于内容(content-based):立足于物品的属性来推荐,但是很难规整为一个框架。
Mahout对于基于内容的推荐较少。前两者是协同过滤的返利,也就是仅仅通过了解用户与物品之间的关系进行推荐。
2.运行第一个推荐引擎
2.1创建输入test.csv
这里的数据是以偏好值表达的,指的是用户对物品的喜好指数。[code]1,101,5
1,102,3
1,103,2.5
2,101,2
2,102,2.5
2,103,5
2,104,2
3,101,2.5
3,104,4
3,105,4.5
3,107,5
4,101,5
4,103,3
4,104,4.5
4,106,4
5,101,4
5,102,3
5,103,2
5,104,4
5,105,3.5
5,106,4
[/code]
这个时候可以分析下,用户对物品的喜欢,这里举个例子:1,5用户喜好相同,都喜欢101,然后喜欢102,最后103。然后5用户对104,106的评价是4,那么推荐给1用户应该不错。下面就是我们第一个推荐程序。
2.2第一个推荐程序
直接放出代码:[code]import org.apache.mahout.cf.taste.impl.model.file.*;
import org.apache.mahout.cf.taste.impl.neighborhood.*;
import org.apache.mahout.cf.taste.impl.recommender.*;
import org.apache.mahout.cf.taste.impl.similarity.*;
import org.apache.mahout.cf.taste.model.*;
import org.apache.mahout.cf.taste.neighborhood.*;
import org.apache.mahout.cf.taste.recommender.*;
import org.apache.mahout.cf.taste.similarity.*;
import java.io.*;
import java.util.*;
class RecommenderIntro {
public static void main(String[] args) throws Exception {
DataModel model = new FileDataModel(new File("/Users/ericxk/Downloads/test.csv"));
UserSimilarity similarity = new PearsonCorrelationSimilarity(model);
UserNeighborhood neighborhood =new NearestNUserNeighborhood(2, similarity, model);
Recommender recommender = new GenericUserBasedRecommender( model, neighborhood, similarity); //生成推荐系统
List<RecommendedItem> recommendations = recommender.recommend(1, 2); //为用户1推荐2个物品
for (RecommendedItem recommendation : recommendations) {
System.out.println(recommendation);
}
}
}
[/code]
3评估一个推荐程序
常见的方法是评估其估计的偏好值的质量,也就是评估所估计的偏好在多大程度上与实际的偏好相匹配。3.1训练数据与评分
书中这里用的平均差和均方根来作为评价指标,下面的代码是用平均差。3.2运行评估程序
代码如下:[code]import org.apache.mahout.cf.taste.common.TasteException;
import org.apache.mahout.cf.taste.eval.RecommenderBuilder;
import org.apache.mahout.cf.taste.eval.RecommenderEvaluator;
import org.apache.mahout.cf.taste.impl.eval.AverageAbsoluteDifferenceRecommenderEvaluator;
import org.apache.mahout.cf.taste.impl.model.file.*;
import org.apache.mahout.cf.taste.impl.neighborhood.*;
import org.apache.mahout.cf.taste.impl.recommender.*;
import org.apache.mahout.cf.taste.impl.similarity.*;
import org.apache.mahout.cf.taste.model.*;
import org.apache.mahout.cf.taste.neighborhood.*;
import org.apache.mahout.cf.taste.recommender.*;
import org.apache.mahout.cf.taste.similarity.*;
import org.apache.mahout.common.RandomUtils;
import java.io.*;
class RecommenderIntro {
public static void main(String[] args) throws Exception {
RandomUtils.useTestSeed();
DataModel model = new FileDataModel(new File("/Users/ericxk/Downloads/test.csv"));
RecommenderEvaluator evaluator = new AverageAbsoluteDifferenceRecommenderEvaluator();
RecommenderBuilder builder = new RecommenderBuilder() { //构建推荐程序
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); //训练70% 测试30%
System.out.println(score);
}
}
[/code]
3.3评估结果
如果要使用均方根,可以用RMSRecommenderEvaluator代替AverageAbsoluteDifferenceRecommenderEvaluator。这里吐槽下,这些函数名字都好长。不过长的好处就是一看函数名就知道是干什么用的。4.评估查准率与查全率
查准率(precision)查全率(recall),这两个很好理解,不懂可以百度下。在放出precision和recall之前要说问题。##就是我们推荐系统是推荐用户没有交互过##,但是最好的推荐结果不一定都在那些用户已知的物品中,测试框架这里只会从用户已有的偏好集合中选择好的推荐。这里可以打个比喻就是,一道题有很多种解法,结果你做的解法都不在正确解法里面,但是也有可能是对的。话题转过来,对于推荐系统,如果偏好是布尔型即是01,那么这个问题就很麻烦,因为没有相对偏好的概念可用于选出包含好物品的数据子集。但是这个precision和recall还是有一定用处的,不能说是很完美的选择。下面放出代码:
[code]import org.apache.mahout.cf.taste.common.TasteException;
import org.apache.mahout.cf.taste.eval.IRStatistics;
import org.apache.mahout.cf.taste.eval.RecommenderBuilder;
import org.apache.mahout.cf.taste.eval.RecommenderIRStatsEvaluator;
import org.apache.mahout.cf.taste.impl.eval.GenericRecommenderIRStatsEvaluator;
import org.apache.mahout.cf.taste.impl.model.file.*;
import org.apache.mahout.cf.taste.impl.neighborhood.*;
import org.apache.mahout.cf.taste.impl.recommender.*;
import org.apache.mahout.cf.taste.impl.similarity.*;
import org.apache.mahout.cf.taste.model.*;
import org.apache.mahout.cf.taste.neighborhood.*;
import org.apache.mahout.cf.taste.recommender.*;
import org.apache.mahout.cf.taste.similarity.*;
import org.apache.mahout.common.RandomUtils;
import java.io.*;
class RecommenderIntro {
public static void main(String[] args) throws Exception {
RandomUtils.useTestSeed();
DataModel model = new FileDataModel(new File("/Users/ericxk/Downloads/test.csv"));
RecommenderIRStatsEvaluator evaluator = new GenericRecommenderIRStatsEvaluator();
RecommenderBuilder recommenderBuilder = new RecommenderBuilder() {
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());
}
}
[/code]
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 in Action 第二章推荐系统 读书笔记 思维导图
- Mahout in Action 读书笔记chapter5 让推荐程序实用化
- Mahout in Action 读书笔记chapter4 进行推荐
- mahout in Action2.2-给用户推荐图书(3)-评价推荐系统
- mahout in action推荐系统代码解释
- mahout in action[中文] 第2章 推荐系统简介
- mahout in action推荐系统阅读笔记(5)
- 使用Mahout搭建推荐系统之入门篇2-玩转你的数据1
- Mahout in action 中文版-6.分布式推荐计算-6.1
- Mahout in action 中文版-6.分布式推荐计算-6.2
- 推荐系统思考小结(基于Mahout)
- 使用Mahout搭建推荐系统之入门篇1-搭建REST风格简单推荐系统
- mahout in action推荐系统阅读笔记(7)
- 基于Mahout的电影推荐系统
- 推荐系统思考小结(基于Mahout)
- Mahout的taste推荐系统里的几种Recommender分析
- 使用Mahout搭建推荐系统之入门篇1-搭建REST风格简单推荐系统
- Myrrix——基于Mahout的开源推荐系统
- Mahout in action 中文版-2.推荐器的介绍-2.4~2.6
- 推荐系统学习之mahout 学习评分计算