【问题标题】:Test and training with different dataset with MAHOUT使用 MAHOUT 使用不同的数据集进行测试和训练
【发布时间】:2014-02-18 08:50:24
【问题描述】:

对不起,如果这是一个菜鸟问题,但我是 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());
  }

任何帮助将不胜感激

【问题讨论】:

    标签: java mahout mahout-recommender


    【解决方案1】:

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

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

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

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

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

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

    所以这里的逻辑是获取两组项目(最相关和最推荐)。 IRStatsEvaluator 的默认实现将根据单个数据模型找到这两个集合。我们需要通过以下方式对其进行自定义:

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

    下面是计算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);
        .......
    
    }
    

    除这些更改外,请保持其他所有内容不变。它会工作的!!!

    【讨论】:

    • 很抱歉,不会有此类信息的指南。我逐行下载了mahout的所有源代码并进行了调试。在我看来,这是了解任何框架内部结构的最佳方式。相信我们也可以通过调试知道以上问题的答案。
    • 例如我把它当作 10,10 是相关项的数量,即 getRelevantItemIds() 方法的输出,它根据数据模型获取所有相关项。 5是推荐人给出的推荐。我们只会指定推荐者获取的推荐的最大数量。此外,Evaluator 不用于生产。其目的是比较不同的不同推荐者并选择最适合我们领域的推荐者。一旦我们确定了合适的推荐器,我们将在我们的应用程序中使用它。
    猜你喜欢
    • 2017-04-06
    • 2020-02-11
    • 2017-07-01
    • 2015-06-09
    • 2016-02-27
    • 2016-10-19
    • 2011-12-16
    • 2021-02-19
    • 2019-03-15
    相关资源
    最近更新 更多