我正在使用Mahout框架,以便使用着名的movielens数据集(ml-100k)在隐式反馈上下文中获得建议,我已将其二值化,考虑到所有等级为4或5,零所有其他。 在该数据集中有五个分割,每个分割在测试集和训练集中 通常。
在推荐过程中,我使用简单的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]范围内,以便按降序排列列表并适当地构建前n个推荐。
那么这段代码有什么问题?我错过了什么或什么不对吗? 或者Mahout框架可能没有提供使用二进制反馈的正确方法?
提前谢谢你,
Alessandro Suglia
答案 0 :(得分: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
可在此处找到广泛的代码示例:
答案 1 :(得分:0)
如果您尝试离线评估推荐人,并且您正在使用内存中项目或基于用户的推荐人,那么Mahout会为此提供评估框架。它会将数据分成训练并自动随机测试。它训练训练集并对测试集进行评估,并给出几个指标。
查看&#34;评估&#34;维基页面底部的部分: https://mahout.apache.org/users/recommender/userbased-5-minutes.html
由于随机保留集,每次运行都会产生略微不同的结果。
我会注意在不同的推荐算法中执行此操作,因为测试仅针对自身进行检查。比较两种算法或实现更复杂。确保使用完全相同的数据,培训和测试拆分,即使这样,在您进行A / B用户测试之前,结果仍然有问题。
<强>更新强> 离线你说你正在使用一个特定的评估系统,不能使用Mahout的 - 无论如何。以下是它的完成方式:
您可以从数据集中删除一些数据。因此删除某些偏好。然后训练并获得有保留一些数据的用户的建议。测试数据尚未用于训练和获取记录,因此您可以比较用户实际偏好的内容与推荐者所做的预测。如果它们都匹配,则您具有100%的精度。请注意,您正在将建议与实际但保持不变的偏好进行比较。
如果你正在使用一些特殊的工具,你可能会这样做来比较算法,这根本不是一个确切的事情,无论Netflix奖项可能让我们相信什么。如果您使用离线测试来调整特定的推荐者,您可能会更好地获得结果。
在一次安装中,我们有实际数据,并按日期将其分为测试和培训。 90%的旧数据用于训练,最近的10%用于测试。这将模仿数据的输入方式。我们将培训数据中的建议与帮助输出数据中的实际偏好进行了比较,并使用MAP @ some-number-of-rec作为分数。这允许您测量RMSE没有的排名。 Map得分使我们得出了一些有关数据依赖的调优的有用结论。
http://en.wikipedia.org/wiki/Information_retrieval#Mean_average_precision