Тестируйте и тренируйтесь с разными наборами данных с помощью MAHOUT

Извините, если это нубский вопрос, но я новичок в 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());
  }

Любая помощь будет высоко ценится


person Vitor    schedule 27.01.2014    source источник


Ответы (1)


GenericRecommenderIRStatsEvaluator (по умолчанию) не поддерживает разные наборы данных для тестирования и обучения. Но если мы действительно этого хотим, мы можем написать собственный Evaluator. Для этого нам нужно понять внутреннее устройство IRStatsEvaluator.

Для каждого пользователя оценщик пытается выбрать наиболее релевантные элементы, т. е. первые в (скажем, 10) элементов. Затем он создаст и запустит рекомендательную программу для этого пользователя и получит лучшие рекомендации at.

A = набор наиболее релевантных элементов = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

B = набор рекомендуемых элементов = {1,2, 11, 12, 13}

Теперь точность – это доля релевантных рекомендуемых элементов. (Сколько пунктов в рекомендациях релевантны), т. е. точность = A пересечение B / количество (B) = 2 из 5, т. е. 0,4

Отзыв — это доля релевантных элементов, включенных в рекомендуемые элементы. т. е. отзыв = A пересечение B / count (A) = 2 из 10, т. е. 0,2

Итак, логика здесь состоит в том, чтобы получить два набора элементов (наиболее актуальные и наиболее рекомендуемые). Реализация IRStatsEvaluator по умолчанию найдет эти два набора на основе одной модели данных. И нам нужно настроить это следующим образом:

  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);
    .......

}

Кроме этих изменений, оставьте все как есть. Это будет работать!!!

person Rajkumar    schedule 16.10.2014
comment
К сожалению, для такой информации не будет руководства. Я скачал весь исходный код mahout и отладил его построчно. На мой взгляд, это лучший способ понять внутренности любого фреймворка. Я уверен, что мы можем узнать ответы на поставленные выше вопросы также путем отладки. - person Rajkumar; 23.10.2014
comment
Просто, например, я взял это как 10, 10 - это количество релевантных элементов, т.е. результат метода getRelevantItemIds(), который извлекает все соответствующие элементы на основе модели данных. И 5 - рекомендации, данные рекомендателем. Мы укажем только максимальное количество рекомендаций, которые должен получить рекомендатель. Более того, Evaluator не используется в продакшене. Его цель — сравнить различных рекомендателей и выбрать лучший, который подходит для нашей области. Как только мы выберем подходящего рекомендателя, мы будем использовать его в нашем приложении. - person Rajkumar; 23.10.2014