2

我正在使用 Mahout 框架,以便使用著名的 movielens 数据集 (ml-100k) 在隐式反馈上下文中获得推荐,我已经将其二值化,考虑到 1 所有评级等于四或五,其他所有评级为零。在这个数据集中有五个拆分,每个拆分都像往常一样分为测试集和训练集。

在推荐过程中,我使用简单的 GenericBooleanPrefUserBasedRecommender 和 TanimotoCoefficientSimilarity 训练推荐器,如以下代码行所述:

    DataModel trainModel = new FileDataModel(new File(String.valueOf(Main.class.getResource("/binarized/u1.base").getFile())));
    DataModel testModel = new FileDataModel(new File(String.valueOf(Main.class.getResource("/binarized/u1.test").getFile())));
    UserSimilarity similarity = new TanimotoCoefficientSimilarity(trainModel);
    UserNeighborhood neighborhood = new NearestNUserNeighborhood(35, similarity, trainModel);

    GenericBooleanPrefUserBasedRecommender userBased = new GenericBooleanPrefUserBasedRecommender(trainModel, neighborhood, similarity);

    long firstUser = testModel.getUserIDs().nextLong(); // get the first user

    // try to recommender items for the first user
    for(LongPrimitiveIterator iterItem = testModel.getItemIDsFromUser(firstUser).iterator(); iterItem.hasNext(); ) {
        long currItem = iterItem.nextLong();
        // estimates preference for the current item for the first user
        System.out.println("Estimated preference for item " + currItem + " is " + userBased.estimatePreference(firstUser, currItem));

    }

当我执行此代码时,结果是一个 0.0 或 1.0 的列表,它们在隐式反馈上下文中的 top-n 推荐上下文中没有用。仅仅是因为我必须为每个项目获得一个保持在 [0, 1] 范围内的估计率,以便按降序对列表进行排名并适当地构建 top-n 推荐。

那么这段代码有什么问题呢?我错过了什么或有什么不正确的吗?或者也许是 Mahout 框架没有提供使用二进制反馈的正确方法?

先感谢您,

亚历山德罗·苏利亚

4

2 回答 2

0

如果您需要建议,您将调用错误的函数。你必须打电话推荐

List<RecommendedItem> items = userBased.recommend(firstUser, 10);
for(RecommendedItem item : items) {
    System.out.println(item.getItemID()+" Estimated preference: "+item.getValue());
}

更多信息可以在 javadocs 中找到: https ://builds.apache.org/job/mahout-quality/javadoc/org/apache/mahout/cf/taste/recommender/Recommender.html

可以在此处找到广泛的代码示例:

https://github.com/ManuelB/facebook-recommender-demo/blob/master/src/main/java/de/apaxo/bedcon/FacebookRecommender.java

于 2014-05-03T15:12:01.500 回答
0

如果您尝试离线评估推荐器并且您正在使用内存中的项目或基于用户的推荐器,那么 Mahout 有一个评估框架。它将自动随机地将数据分成训练和测试。它在训练集上训练并在测试集上运行评估,返回几个指标。

在此处查看 wiki 页面底部的“评估”部分: https ://mahout.apache.org/users/recommender/userbased-5-minutes.html

由于随机保留集,每次运行都会产生略有不同的结果。

我会警告在不同的推荐算法中这样做,因为测试只是针对自身检查一个。比较两种算法或实现更为复杂。确保使用完全相同的数据、训练和测试拆分,即使这样,在您进行 A/B 用户测试之前,结果也是有问题的。

更新: 离线您说您正在使用特定的评估系统并且不能使用 Mahout 的 - 无论如何。这是如何完成的:

您可以从数据集中删除一些数据。所以删除某些偏好。然后为保留一些数据的用户训练并获得推荐。测试数据尚未用于训练和获取推荐值,因此您可以将用户实际偏好的内容与推荐者做出的预测进行比较。如果它们都匹配,那么您就有 100% 的精度。请注意,您将推荐与实际但保留的偏好进行比较。

如果你使用一些特殊的工具,你可能会这样做来比较算法,这根本不是一个精确的事情,不管 Netflix 奖可能让我们相信什么。如果您使用离线测试来调整特定的推荐器,您可能会对结果有更好的运气。

在一次安装中,我们拥有真实数据,并按日期将其分为测试和训练。90% 的旧数据用于训练,最近的 10% 用于测试。这将模仿数据的输入方式。我们将来自训练数据的建议与帮助数据中的实际偏好进行比较,并使用 MAP@some-number-of-recs 作为分数。这使您可以测量排名,而 RMSE 不能。Map 分数使我们得出了几个关于数据依赖的调整的有用结论。

http://en.wikipedia.org/wiki/Information_retrieval#Mean_average_precision

于 2014-05-03T23:31:21.300 回答