【发布时间】: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