我正在尝试使用mahout中给出的项目项目Recommender计算精度并使用布尔首选项在数据集的n处调用。
我正在使用GenericBooleanPrefItemBasedRecommender和
评估(RecommenderBuilder的RecommenderBuilder,DataModelBuilder的dataModelBuilder,DataModel的dataModel,IDRescore的rescorer,int at,double relevantThreshold,double evaluationPercentage)抛出TasteException; `
由于存在布尔首选项,因此"相关"或"好"用户的电影都是评为1的电影。
如果我多次运行相同的代码,它总是给出相同的精度和召回值,它们总是彼此相等。为什么?我没有使用RandomUtils.useTestSeed() 它如何将数据分成训练和测试集?
的可能性:
a)在开始时将总数据集随机分成测试和训练,或者为每个用户随机将固定百分比的相关电影放入测试集中:它如何决定这个百分比,因为没有地方让用户输入一个参数。为什么每次运行代码时都得到相同的P和R值,为什么P的值在n和R在n相同?
b)对于每个用户,它将所有相关电影放入训练集:
然后,没有任何信息留给用户提出任何建议,因此不可能。
由于我得到P的值和n在n处是相等的,这是否意味着对于每个用户,每次相关电影的数量被移动到测试集=推荐数量,即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());
}
答案 0 :(得分:0)
不确定但是如果每次使用它时为一个随机数生成器播放相同的值,它返回的数字序列将是相同的。检查是否有办法用类似系统时间的方式播种rng。只是一个猜测。
答案 1 :(得分:0)
查看我对相关问题的回答: How mahout's recommendation evaluator works
我认为这有助于您了解评估的工作原理,如何选择相关项目以及如何计算精确度和召回率。