【问题标题】:Precision and Recall in Item based Recommender with boolean preferences in MahoutMahout 中具有布尔偏好的基于项目的推荐器中的精度和召回率
【发布时间】:2014-05-21 11:02:20
【问题描述】:

我正在尝试使用 mahout 中给出的 item item Recommender 计算具有布尔首选项的数据集的 n 处的精度和召回率。

我正在使用 GenericBooleanPrefItemBasedRecommender 和

evaluate(RecommenderBuilderRecommenderBuilder,DataModelBuilderdataModelBuilder,DataModeldataModel,IDRescorer rescorer,int at,double correlationThreshold,double evaluationPercentage) throws TasteException; `

由于存在布尔偏好,因此用户的“相关”或“好”电影的集合都是评分为 1 的电影。

如果我多次运行相同的代码,它总是给出相同的精度和召回值,并且它们总是彼此相等。为什么?我没有使用 RandomUtils.useTestSeed() 它如何将数据分成训练集和测试集?

可能性:
a)在开始时将总数据集随机划分为测试和训练,或者对于每个用户,它随机将固定百分比的相关电影放入测试集::它如何决定这个百分比,因为用户没有地方输入这个一个参数。为什么每次运行代码都得到相同的 P 和 R 值,为什么 n 处的 P 和 n 处的 R 的值相同?
b) 对于每个用户,它将所有相关的电影放入训练集中: 那么用户就没有任何信息可以提出任何建议,因此这是不可能的。

由于我在 n 处得到 P 和 R 的值相等,这是否意味着对于每个用户,每次将相关电影的数量移动到测试集 = 推荐数量,即 n。如果放入测试集中的 n 部相关电影是随机的,那么为什么我每次运行代码时都会得到相同的 P 和 R 值。

我能想到的解释结果的唯一解释是推荐器在 n 处计算 P 和 R 如下: 一个接一个,对于每个用户,它随机将“n”个相关电影放入测试集中。该过程必须是随机的,因为它无法区分所有相关电影,但该过程是固定的,每次运行代码时,它都会为每个用户选择相同的 n 个相关电影。然后它提出 n 个建议并计算 n 处的 P 和 R。

虽然这解释了结果,但我认为这不是一个好的过程,因为:
1)训练和测试集的概念没有定义为百分比,因此与通常的定义不一致。
2) P 和 R 将始终彼此相等,因此我们只能得到一个指标,而不是两个。
3)每次随机挑选'n'部电影的过程都是相同的。

编辑:我正在添加我的完整代码以帮助回答我的问题:

public static void main (String[] args) 抛出异常 {

FileDataModel model = new FileDataModel(new File("data/test.csv"));
RecommenderIRStatsEvaluator evaluator = new GenericRecommenderIRStatsEvaluator();
RecommenderBuilder recommenderBuilder = new RecommenderBuilder() {
@Override
public Recommender buildRecommender(DataModel model) {
ItemSimilarity similarity = new LogLikelihoodSimilarity(model);
return new GenericBooleanPrefItemBasedRecommender(model, similarity);
}
};

IRStatistics stats = evaluator.evaluate(
recommenderBuilder, null, model, null, 5,
GenericRecommenderIRStatsEvaluator.CHOOSE_THRESHOLD,1.0);

System.out.println(stats.getPrecision());
System.out.println(stats.getRecall());
}

【问题讨论】:

  • 欢迎来到 Stackoverflow。请查看formatting help 并尝试例如代码格式简单列表。您的帖子的另一个问题是,它似乎过于宽泛,包含多个问题和/或主要问题不清楚。请更具体。

标签: boolean precision mahout recommendation-engine training-data


【解决方案1】:

不确定,但是如果您每次使用随机数生成器时都使用相同的值,那么它返回的数字序列将是相同的。检查是否有办法用系统时间之类的东西为 rng 播种。只是猜测。

【讨论】:

    【解决方案2】:

    查看我对相关问题的回答: How mahout's recommendation evaluator works

    我认为这将帮助您了解评估的工作原理、如何选择相关项目以及如何计算 Precision 和 Recall。

    【讨论】:

    • 在发布我的问题之前,我确实看到了您的回答。用实际的用户评分来解释案例非常有帮助。我的问题是关于布尔首选项的情况,其中每个条目都很简单(userId,ItemId),这意味着 useId 喜欢 itemId。因此对于任何阈值(
    • 来自 Mahout in Action 书第 23 页,第 2.4.2 章说:The issue is further complicated when the preferences are Boolean and contain no preference value. There isn’t even a notion of relative preference on which to select a subset of good items. The best the test can do is randomly select some preferred items as the good ones.
    • 如果过程是随机的,那么每次运行代码时选择的相关电影集不应该发生变化,因此每次运行代码时都会得到不同的 P 值。然后我编写代码多次运行它并对这些值进行平均,以便得到一个可靠的数字。由于用户没有输入任何百分比,它如何决定随机选择多少首选项目?除非它与 n(推荐数)相同,否则为什么 P=R?
    • 在 Mahout in Action 一书的第 38 页第 3.3.3 章中,您有用于评估布尔数据的精度和召回率的简单代码。从您的代码中,我可以看到您并没有告诉 mahout 您的数据模型包含布尔数据。您必须像这样将 FileDataModel 包装到 GenericBooleanPrefDataModel 中:DataModel model = GenericBooleanPrefDataModel( GenericBooleanPrefDataModel.toDataMap(fileDataModel)); Mahout in action 这本书是您的 Mahout 圣经。你会在那里找到大部分东西:manning.com/owen
    • 至于你的问题,你使用的是GenericRecommenderIRStatsEvaluator.CHOOSE_THRESHOLD,这意味着相关阈值是NaN,然后​​下面的计算阈值的函数称为computeThreshold()。在内部,它计算平均值和标准差。它返回两者的总和。因为对于布尔数据,没有首选项值,所以 Mahout 总是返回 1.0f。 avg 和 stdDev 为 1 和 0,相关性阈值始终为 1。这意味着所有项目都是相关的。您可以尝试将自己的号码放在那里,例如0.7看P&R有没有变化。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-23
    • 2017-01-04
    • 1970-01-01
    • 2015-06-07
    • 2018-02-18
    • 2018-08-16
    • 2011-08-18
    相关资源
    最近更新 更多