我是推荐系统的新手。我正在尝试学习 Mahout,到目前为止我认为我已经掌握了它。
但是,当我尝试使用 Mahout in Action( list 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 时,结果非常低......例如 Precision and Recall @ 2 等于: P:0.00573 和 R:0.005882
我没有想法,所以如果有人遇到或遇到过类似的问题,我会很高兴听到有解决方案...
最佳答案
第 2.4.2 节涉及解释:精确度和召回率测试对推荐系统而言意义不大,因为您实际上不知道哪些项目是“相关”结果。您可以猜测评分高的项目是相关的,但您不知道未评分的项目是否相关。该测试相当于找出推荐与评分最高的项目相交的程度,这并不是精确度/召回率需要做的。
所以你得到低分。实际上,10% 还不错。现在,0.5% 很差,是的。这意味着这不是该数据集的好算法。
Mean average precision , 或 AUC ,可能会让您更全面地了解结果的质量,因为他们正在查看更大范围的结果的行为。这些未在 Mahout 中实现(无论如何都未在代码的这一部分中实现)。
但他们在Myrrix .我知道您将在 Grouplens 10M 数据集上获得 25+% 的准确率/召回率和 14+% 的平均准确率,因为有一个 unit test for this。 . (我是 Mahout 这部分的作者,并将其作为 Myrix 商业化。)如果您正在寻找开箱即用的能够很好地处理此类数据的东西,我认为值得您花时间看看。
关于Mahout 精确召回 Movielens 10M,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15504762/