Mahout in Action-2.简介
一、推荐的定义
推荐:是一种用户体验的预测模式,采用这个模式发现你原先不知道,并且对你来说是新颖和感兴趣的事物。
推荐引擎算法分两种:
- 找出和你喜好相类似的人,把他们的喜好推荐给你。基于用户(user-base);
- 根据你已经喜欢的产品,找出其他明显满足你喜好的产品。
二、运行第一个推荐引擎
数据准备:
数据所展现出的趋势:
给User1推荐那本书?101、102、103?No,这些书User1已经看过了,应该推荐给他新东西。直觉上,User4和User5与User1喜好相似,应该把User4和User5喜好并且User1没有看过的书推荐给User1,也就是104、105、106推荐给User1。其中104分数最高4.5,所以推荐104。
Java代码:
public static void main(String[] args) throws Exception { DataModel model = new FileDataModel(new File("src/main/java/mia/recommender/ch02/intro.csv")); UserSimilarity similarity = new PearsonCorrelationSimilarity(model); UserNeighborhood neighborhood = new NearestNUserNeighborhood(2, similarity, model); Recommender recommender = new GenericUserBasedRecommender( model, neighborhood, similarity); // Create recommender engine
List<RecommendedItem> recommendations = recommender.recommend(1, 1); // For user 1,recommend 1 item
for (RecommendedItem recommendation : recommendations) { System.out.println(recommendation); }
输出结果:
RecommendedItem[item:104, value:4.257081]
分析代码:
DataModel:实现数据的存储,提供输入数据入口;
UserSimilarity:计算或度量用户有多相似;
UserNeighborhood:定义了给定用户最相似的一组用户;
Recommender:汇集这些组件,最终推荐给用户产品。
三、评估推荐结果
对于用户什么是最好的推荐?
推荐的产品应该是用户非常可能喜欢的产品(准确率),推荐的产品应该覆盖用户将来感兴趣的所有产品(召回率)
如何度量预测的准确性?(训练集和评分)
分为测试级和训练集,通过训练集预测测试级的喜好,然后与测试级的真实情况作比较,最后评分。
MAE(Mean Average difference):平均绝对误差
RMSE(Root Mean Square):均方根误差,对预测不准的用户物品(item2)进行惩罚,因而对系统的评测更加苛刻。
Java代码:
public static void main(String[] args) throwsException { RandomUtils.useTestSeed(); // the same random choices each time
DataModel model = new FileDataModel(new File("src/main/java/mia/recommender/ch02/intro.csv")); RecommenderEvaluator evaluator = new AverageAbsoluteDifferenceRecommenderEvaluator();
// new RMSRecommenderEvaluator();
// Build the same recommender for testing that we did last time: 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); } }; // Use 70% of the data to train; test using the other 30%. double score = evaluator.evaluate(recommenderBuilder, null, model, 0.7, 1.0); // 1.0 how much of the overall input data is used.
System.out.println(score);
}
分析代码与结果:
RecommenderEvaluator:将数据集分为训练集和测试集,构造一个新的训练DataModel和Recommender用于预测测试集,最后评估测试集预测喜好与真实喜好的差别。
AverageAbsoluteDifferenceRecommenderEvaluator:可替换为RMSE的RMSRecommenderEvaluator.
结果为1.0:意味着预测的推荐喜好平均与真实喜好差别1.0.
四、评估准确率和召回率
TopN推荐:网站提供推荐服务时,一般给用户一个个性化的推荐列表,这种推荐叫做TopN推荐。
准确率:(根据用户在训练集上的行为给用户做出的推荐列表,也在测试集里)/根据用户在训练集上的行为给用户做出的推荐列表;
召回率:(根据用户在训练集上的行为给用户做出的推荐列表,也在测试集里)/该用户在测试集里的行为;