在Mahout中使用布尔首选项的基于项目的推荐器中的精度和重新调用

时间:2014-05-21 11:02:20

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

我正在尝试使用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());
}

2 个答案:

答案 0 :(得分:0)

不确定但是如果每次使用它时为一个随机数生成器播放相同的值,它返回的数字序列将是相同的。检查是否有办法用类似系统时间的方式播种rng。只是一个猜测。

答案 1 :(得分:0)

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

我认为这有助于您了解评估的工作原理,如何选择相关项目以及如何计算精确度和召回率。