使用MAHOUT测试和训练不同的数据集

时间:2014-01-27 13:29:34

标签: java mahout mahout-recommender

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

我发现关于评估的例子他们只是将数据搞砸了,但我想用u1base来训练和测试u1测试。

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());
  }

任何帮助将不胜感激

1 个答案:

答案 0 :(得分:1)

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

对于每个用户,评估者都会尝试获取最相关的项目,例如 (例如10个)项目。然后它将构建&为这个用户运行推荐器&获得 建议的最高

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

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

现在精度是相关推荐商品的比例。 (建议中有多少项是相关的) 即,精度=交点B /计数(B)= 2 ouf为5,即0.4

召回是推荐项目中包含的相关项目的比例。 即召回=交叉点B /计数(A)= 10中的2,即0.2

因此,这里的逻辑是获得两组项目(最相关和最推荐)。 IRStatsEvaluator的默认实现将基于单数据模型找到这两组。我们需要以下列方式对其进行自定义:

  1. 相关项应根据测试数据集计算
  2. 推荐项目应根据列车数据集进行计算。
  3. 以下是计算relatedItems的位置。因此,而不是数据模型将测试数据模型传递给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);
        .......
    
    }
    

    除了这些变化之外,请保留其他所有内容。它会工作!!!