我是第一次接触推荐系统。我正在尝试学习Mahout,到目前为止,我认为我已经掌握了它。
但是,当我尝试使用书Mahout in Action (清单2.4,第21页)中的示例计算Precision & Recall时,我遇到了一个相当奇怪的问题,为了更方便起见,我将正文复制粘贴到这里:
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());当我尝试使用在书中找到的小数据集执行上述操作时,一切都是正常的。但是,当我尝试使用Movielens 1M或10M来计算精度和召回率时,结果非常低……例如,Precision和Recall @2等于: P: 0.00573和R: 0.005882
我没有想法,所以如果有人有或有类似的问题,我很高兴听到有解决方案……
发布于 2013-03-20 01:22:25
第2.4.2节涉及到解释:精确度和召回率测试对推荐者来说意义不大,因为你实际上不知道哪些项目是“相关的”结果。你可以猜到高评级的项目是相关的,但你不知道未评级的项目是否相关。测试相当于找出推荐与排名最高的项目有多大的交集,这并不是精确/召回所需要做的。
所以你得到的分数很低。实际上,10%还不算坏。现在,0.5%是相当贫穷的,是的。这意味着对于这个数据集,这不是一个好的算法。
Mean average precision或AUC可能会让你对结果的质量有一个更广泛的了解,因为他们关注的是更大范围的结果的行为。这些都不是在Mahout中实现的(至少在代码的这一部分中没有实现)。
但它们是在Myrrix中。我知道你会在Grouplens 10M数据集上获得25+%精度/召回和14+%平均精度,因为有一个unit test for this。(我是Mahout这一部分的作者,并将其商业化为Myrrix。)如果您正在寻找在这种开箱即用的数据上做得很好的东西,我认为值得您花时间去看看。
发布于 2016-03-05 03:28:45
我想问题出在你的邻里大小。我记得看过一篇关于邻居大小的文章,10的大小是很少的。尝试使用大于10的数字。
https://stackoverflow.com/questions/15504762
复制相似问题