我正在尝试使用 mahout 中给出的 item item Recommender 计算具有布尔首选项的数据集的 n 处的精度和召回率。
我正在使用 GenericBooleanPrefItemBasedRecommender 和
评估(RecommenderBuilder 推荐器构建器,DataModelBuilder 数据模型构建器,DataModel 数据模型,IDRescorer rescorer,int at,双重相关阈值,双重评估百分比)抛出 TasteException;`
由于存在布尔偏好,因此用户的“相关”或“好”电影的集合都是评分为 1 的电影。
如果我多次运行相同的代码,它总是给出相同的精度和召回值,并且它们总是彼此相等。为什么?我没有使用 RandomUtils.useTestSeed() 它如何将数据拆分为训练集和测试集?
可能性:
a)在开始时将总数据集随机划分为测试和训练,或者对于每个用户,它随机将固定百分比的相关电影放入测试集::由于没有地方供用户输入,它如何决定这个百分比this 作为参数。为什么每次运行代码时都得到相同的 P 和 R 值,为什么 n 处的 P 和 n 处的 R 的值相同?
b)对于每个用户,它将所有相关的电影放入训练集中:然后用户没有任何信息可以做出任何推荐,因此这是不可能的。
由于我在 n 处得到 P 和 R 的值相等,这是否意味着对于每个用户,每次将相关电影的数量移动到测试集 = 推荐数 ien 如果 n 相关电影放入测试set 是随机的,那么为什么每次运行代码时我都会得到相同的 P 和 R 值。
我能想到的唯一解释结果的解释是推荐器在 n 处计算 P 和 R 如下:一个接一个,对于每个用户,它随机将“n”个相关电影放入测试集中。该过程必须是随机的,因为它无法区分所有相关电影,但该过程是固定的,并且每次运行代码时,它都会为每个用户选择相同的 n 个相关电影。然后它提出 n 个建议并计算 n 处的 P 和 R。
虽然这解释了结果,但我认为这不是一个好的过程,因为:
1)训练和测试集的概念没有定义为百分比,因此与通常的定义不一致。
2) P 和 R 总是相等的,所以我们只得到一个度量而不是两个。
3)每次随机挑选'n'部电影的过程都是相同的。
编辑:我正在添加我的完整代码以帮助回答我的问题:
公共静态 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());
}