4

抱歉,如果这是一个菜鸟问题,但我是 MAHOUT 的新手,我必须对 MovieLens 数据集进行一些测试。我想知道是否可以用 u1base.csv 训练推荐器,并用 u1test.csv 测试推荐器以确定准确率和召回率?

我发现的关于评估的例子他们只漏掉了数据,但我想用 u1base 来训练和 u1test 来测试。

u1base.csv 和 u1test.csv 具有相同的格式“UserId,Item,Rating”。

我有的java代码:

     File userPreferencesFile = new File("u1base.csv");
      File userTeste = new File("u1test.csv");
      RandomUtils.useTestSeed();

      DataModel dataModel = new FileDataModel(userPreferencesFile);
      DataModel testModel = new FileDataModel(userTeste);


      RecommenderIRStatsEvaluator recommenderEvaluator = new GenericRecommenderIRStatsEvaluator();

      RecommenderBuilder recommenderBuilder = new RecommenderBuilder() {
          @Override
          public Recommender buildRecommender(DataModel dataModel) throws TasteException {
              UserSimilarity userSimilarity = new PearsonCorrelationSimilarity(dataModel);
              UserNeighborhood userNeighborhood = new NearestNUserNeighborhood(10, userSimilarity, dataModel);

              return new GenericUserBasedRecommender(dataModel, userNeighborhood, userSimilarity);
          }
      };

      IRStatistics statistics = 
              recommenderEvaluator.evaluate(
                      recommenderBuilder, null, dataModel, null, 2, GenericRecommenderIRStatsEvaluator.CHOOSE_THRESHOLD, 1.0);
      System.out.format("The recommender precision is %f%n", statistics.getPrecision());
      System.out.format("The recommender recall is %f%n", statistics.getRecall());
  }

任何帮助都感激不尽

4

1 回答 1

1

GenericRecommenderIRStatsEvaluator(默认)不支持不同的测试和训练数据集。但是如果我们真的想要这个,我们可以编写我们的自定义 Evaluator。为此,我们需要了解 IRStatsEvaluator 的内部结构。

对于每个用户,Evaluator 都会尝试获取最相关的项目,即顶部比如 10 个)项目。然后它将为该用户构建并运行推荐器并获得推荐

A = 一组最相关的项目 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

B = 推荐项目集 = {1,2, 11, 12, 13}

现在精确度是相关推荐项目的比例。(推荐中有多少项是相关的)即精度 = A 交集 B / count(B) = 2 of 5 即 0.4

召回率是推荐项目中包含的相关项目的比例。即召回 = A 交点 B / count(A) = 2 out of 10 即 0.2

所以这里的逻辑是获得两组项目(最相关和最推荐)。IRStatsEvaluator 的默认实现将基于单个datamodel 找到这两个集合。我们需要通过以下方式自定义它:

  1. 相关项目应根据测试数据集计算
  2. 推荐项目应根据训练数据集计算。

下面是计算相关项的地方。因此,不是数据模型,而是将测试数据模型传递给 dataSplitter.getRelevantItemsIDs()。

//GenericRecommenderIRStatsEvaluator
public IRStatistics evaluate(RecommenderBuilder recommenderBuilder,
                               DataModelBuilder dataModelBuilder,
                               DataModel dataModel,
                               IDRescorer rescorer,
                               int at,
                               double relevanceThreshold,
                               double evaluationPercentage) throws TasteException {
    .......
    FastIDSet relevantItemIDs = dataSplitter.getRelevantItemsIDs(userID, at, theRelevanceThreshold, dataModel);
    .......

}

//CustomizedRecommenderIRStatsEvaluator    
public IRStatistics evaluate(RecommenderBuilder recommenderBuilder,
                               DataModelBuilder dataModelBuilder,
                               DataModel trainDataModel,
                               DataModel testDataModel,
                               IDRescorer rescorer,
                               int at,
                               double relevanceThreshold,
                               double evaluationPercentage) throws TasteException {
    .......
    FastIDSet relevantItemIDs = dataSplitter.getRelevantItemsIDs(userID, at, theRelevanceThreshold, testDataModel);
    .......

}

除了这些更改,其他一切都保持原样。它会工作的!

于 2014-10-16T09:14:40.117 回答