Рекомендация Mahout в ситуации неявной обратной связи

Я работаю со структурой Mahout, чтобы получить рекомендации в контексте неявной обратной связи, используя хорошо известный набор данных movielens (ml-100k), который я преобразовал в двоичную форму, считая 1 все оценки равны четырем или пяти, ноль все остальные. В этом наборе данных есть пять разделений, каждый из которых разделен на набор тестов и набор тренировок, как обычно.

В процессе рекомендации я обучаю рекомендателя с использованием простого GenericBooleanPrefUserBasedRecommender и TanimotoCoefficientSimility, как описано в следующих строках кода:

    DataModel trainModel = new FileDataModel(new File(String.valueOf(Main.class.getResource("/binarized/u1.base").getFile())));
    DataModel testModel = new FileDataModel(new File(String.valueOf(Main.class.getResource("/binarized/u1.test").getFile())));
    UserSimilarity similarity = new TanimotoCoefficientSimilarity(trainModel);
    UserNeighborhood neighborhood = new NearestNUserNeighborhood(35, similarity, trainModel);

    GenericBooleanPrefUserBasedRecommender userBased = new GenericBooleanPrefUserBasedRecommender(trainModel, neighborhood, similarity);

    long firstUser = testModel.getUserIDs().nextLong(); // get the first user

    // try to recommender items for the first user
    for(LongPrimitiveIterator iterItem = testModel.getItemIDsFromUser(firstUser).iterator(); iterItem.hasNext(); ) {
        long currItem = iterItem.nextLong();
        // estimates preference for the current item for the first user
        System.out.println("Estimated preference for item " + currItem + " is " + userBased.estimatePreference(firstUser, currItem));

    }

Когда я выполняю этот код, в результате получается список 0.0 или 1.0, которые бесполезны в контексте рекомендации top-n в контексте неявной обратной связи. Просто потому, что я должен получить для каждого элемента предполагаемую скорость, которая остается в диапазоне [0, 1], чтобы ранжировать список в порядке убывания и построить рекомендацию top-n соответствующим образом.

Так в чем же проблема с этим кодом? Я что-то пропустил или что-то было не так? Или, может быть, среда Mahout не обеспечивает правильный способ использования двоичной обратной связи?

Заранее спасибо,

Алессандро Сулья

2 ответа

Если вы пытаетесь оценить рекомендатель в автономном режиме и используете элемент в памяти или рекомендатель, основанный на пользователях, у Mahout для этого есть среда оценки. Он будет разбивать данные на обучение и тестировать автоматически и случайным образом. Он тренируется на тренировочном наборе и проводит оценку на тестовом наборе, возвращая несколько показателей.

Проверьте раздел "Оценка" в нижней части вики-страницы здесь: https://mahout.apache.org/users/recommender/userbased-5-minutes.html

Каждый прогон этого даст немного разные результаты из-за случайного набора задержки.

Я хотел бы предостеречь об этом в разных рекомендательных алгоритмах, поскольку тест проверяет только один алгоритм против самого себя. Сравнить два алгоритма или реализации сложнее. Обязательно используйте точно такие же данные, разделение на обучение и тестирование, и даже в этом случае результаты сомнительны, пока вы не выполните пользовательское тестирование A/B.

Обновление: в автономном режиме вы сказали, что используете определенную систему оценки и не можете использовать Mahout - не важно. Вот как это делается:

Вы можете удалить некоторые данные из набора данных. Так что удалите определенные предпочтения. Затем обучите и получите рекомендации для пользователя, у которого некоторые данные были скрыты. Тестовые данные не использовались для обучения и получения записей, поэтому вы сравниваете то, что на самом деле предпочитают пользователи, с прогнозами, сделанными рекомендателем. Если все они совпадают, у вас есть 100% точность. Обратите внимание, что вы сравниваете рекомендации с реальными, но сдержанными предпочтениями.

Если вы используете какие-то специальные инструменты, вы можете делать это для сравнения алгоритмов, что не совсем точно, независимо от того, какой приз Netflix мог заставить нас поверить. Если вы используете автономные тесты для настройки конкретного рекомендателя, вам может повезти с результатами.

В одной установке у нас были реальные данные и мы разбили их на тестирование и обучение по дате. 90% более старых данных использовалось для обучения, последние 10% использовались для тестирования. Это имитирует способ поступления данных. Мы сравнили рекомендации из данных обучения с фактическими предпочтениями в данных помощи и использовали MAP@some-number-of-recs в качестве оценки. Это позволяет измерять рейтинг, а RMSE - нет. Оценка на карте привела нас к нескольким полезным выводам о настройке, которые зависели от данных.

http://en.wikipedia.org/wiki/Information_retrieval

Если вам нужны рекомендации, вы вызываете не ту функцию. Вы должны позвонить рекомендовать

List<RecommendedItem> items = userBased.recommend(firstUser, 10);
for(RecommendedItem item : items) {
    System.out.println(item.getItemID()+" Estimated preference: "+item.getValue());
}

Дополнительную информацию можно найти по адресу javadocs: https://builds.apache.org/job/mahout-quality/javadoc/org/apache/mahout/cf/taste/recommender/Recommender.html

Обширный пример кода можно найти здесь:

https://github.com/ManuelB/facebook-recommender-demo/blob/master/src/main/java/de/apaxo/bedcon/FacebookRecommender.java

Другие вопросы по тегам