主要是记录一下学到的一个简单的推荐程序的书写,同时对于这个推荐程序我们给出评价标准。包含差值评价、查全率、查准率评价。
输入数据:(用户ID,书籍ID,偏好程度)
-
1,101,5.0
-
1,102,3.0
-
1,103,2.5
-
-
2,101,2.0
-
2,102,2.5
-
2,103,5.0
-
2,104,2.0
-
-
3,101,2.5
-
3,104,4.0
-
3,105,4.5
-
3,107,5.0
-
-
4,101,5.0
-
4,103,3.0
-
4,104,4.5
-
4,106,4.0
-
-
5,101,4.0
-
5,102,3.0
-
5,103,2.0
-
5,104,4.0
-
5,105,3.5
-
5,106,4.0
简单的推荐程序:
-
//DataModel 实现存储并为计算提供所需的所有偏好(Mahout中数据是以偏好的形式表示的 格式为用户ID、物品ID、偏爱程度的数值)、用户和物品数据
-
//UserSimilarity 实现给出两个用户的相似度,可以从多种可能度量或计算中选用一种作为依据
-
//UserNeighborhood 实现明确了与给定用户最相似的一组用户
-
//Recommender实现合并所有这些组件为用户推荐商品
-
-
//intro.csv中的数据含义是 前面是用户ID 中间是书籍ID 最后是偏好程度
-
-
//程序最后的数据结果是 RecommendedItem[item:104, value:4.257081] 含义是将104号书籍推荐给用户1
-
public class RecommenderIntro {
-
-
public static void main(String[] args) throws Exception{
-
// TODO Auto-generated method stub
-
-
DataModel model=new FileDataModel(new File("intro.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); //这个函数中前一个表示对哪一个用户进行推荐,后一个表示推荐几个
-
for(RecommendedItem recommendation:recommendations){
-
System.out.println(recommendation);
-
}
-
}
-
-
}
对推荐程序做差值评价
-
//整个评估的原理就是将数据集中的一部分数据作为测试数据。也就是这一部分数据程序不可见,然后推荐引擎通过剩余的训练数据推测测试数据的值,然后将推测值与真实的测试数据进行比较。
-
//比较的方法有平均差值,就是每一项与真实数据做差然后求平均值,另一种方式就是均方根。就是差值求平方和,然后求平方和的平均值,然后取平方根。这种方式会放大差值的影响,比如推荐的结果中差一个星值,产生的影响远大于1倍的影响就可以使用这种评估算法。
-
//评估推荐引擎,此处使用的AverageAbsoluteDifferenceRecommenderEvaluator 采用的平均差值进行评估。这只是为了方便,通常会采用均方根的方式进行评估,也就是使用RMSRecommenderEvaluator替代前面的评估器
-
-
public class RecommenderIntroEvaluator {
-
-
public static void main(String[] args) throws Exception{
-
// TODO Auto-generated method stub
-
-
RandomUtils.useTestSeed();
-
DataModel model=new FileDataModel(new File("ua.base")); //此处采用的是从网上下载的一个大数据集,最后的评价结果是0.8761682242990649,表示的是平均与真实结果的差值是0.9.
-
RecommenderEvaluator evaluator=new AverageAbsoluteDifferenceRecommenderEvaluator();
-
//我们创建了一个推荐器生成器,因为评估的时候我们需要将源数据中的一部分作为测试数据,其他作为算法的训练数据,需要通过新训练的DataModel构建推荐器,所以采用生成器的方式生成推荐器
-
RecommenderBuilder builder=new RecommenderBuilder() {
-
-
@Override
-
public Recommender buildRecommender(DataModel model) throws TasteException {
-
// TODO Auto-generated method stub
-
UserSimilarity similarity=new PearsonCorrelationSimilarity(model);
-
UserNeighborhood neighborhood=new NearestNUserNeighborhood(2, similarity, model);
-
return new GenericUserBasedRecommender(model, neighborhood, similarity);
-
}
-
};
-
//参数中0.7代表训练数据为70%,测试数据是30%。最后的1.0代表的是选取数据集的多少数据做整个评估。如果你想更快的做出评估,可以选取0.1.表示的是10%的数据做整个评估测试,在这10%的数据集中70%作为训练,30%作为测试。
-
double score=evaluator.evaluate(builder, null, model, 0.7, 1.0); //此处第二个null处,使用null就可以满足基本需求,但是如果我们有特殊需求,比如使用特殊的DataModel,在这里可以使用DataModelBuilder的一个实例。
-
System.out.println(score);
-
}
-
-
}
进行查全率和查准率的评价
-
public class IRStatsRecommender {
-
-
public static void main(String[] args) throws Exception{
-
// TODO Auto-generated method stub
-
-
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 {
-
// TODO Auto-generated method stub
-
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()); //查准率为0.75 上面设置的参数为2,表示 Precision at 2(推荐两个结果时的查准率),平均有3/4的推荐结果是好的
-
System.out.println(stats.getRecall());//Recall at 2 推荐两个结果的查全率是1.0 表示所有的好的推荐都包含在这些推荐结果中
-
}
-
-
}
-
另一种评价器:
-
//这种推荐器SlopeOneRecommender生成评价结果更快了一些。但是这并不是说Slope-one更好或者更快。每个算法都有其特征和属性。这种推荐器0.9版本之后就没有了。
-
-
public class RecommenderIntroEvaluatorSlope {
-
-
public static void main(String[] args) throws Exception{
-
// TODO Auto-generated method stub
-
-
RandomUtils.useTestSeed();
-
DataModel model=new FileDataModel(new File("ua.base"));
-
RecommenderEvaluator evaluator=new RMSRecommenderEvaluator();
-
-
RecommenderBuilder builder=new RecommenderBuilder() {
-
-
@Override
-
public Recommender buildRecommender(DataModel model) throws TasteException {
-
// TODO Auto-generated method stub
-
-
return new SlopeOneRecommender(model);
-
}
-
};
-
-
double score=evaluator.evaluate(builder, null, model, 0.7, 1.0);
-
System.out.println(score);
-
}
-
-
}
阅读(1694) | 评论(0) | 转发(0) |