Статьи

Использование рекомендаций Mahout в Grails

Apache Mahout — это масштабируемая среда машинного обучения, которую можно использовать для создания интеллектуальных приложений. В этой статье мы увидим, как Mahout можно использовать для создания персонализированных рекомендаций в приложении Grails.

Эта статья первоначально появилась в февральском выпуске GroovyMag .

О себе

Mahout начинался как суб-проект Apache Lucene, и название — это слово на хинди, относящееся к водителю слонов; части Mahout построены на вершине Hadoop, который был назван в честь мягкого игрушечного слона, принадлежащего сыну Дуга Каттинга, который начал этот проект.

Hadoop был извлечен из подпроекта Lucene искателя Nutch и предоставляет масштабируемую среду обработки данных с использованием Map-Reduce поверх распределенной файловой системы (HDFS). Использование Hadoop выходит за рамки этой вводной статьи.

Mahout имеет три основных области функциональности машинного обучения: классификация, кластеризация и рекомендации.

Классификация может использоваться для определения того, насколько похож элемент на ранее встречавшиеся элементы или образцы и относится ли он к той же категории.

Например, Mahout поддерживает наивную байесовскую классификацию с помощью примера «Привет, мир», обучая классификатор, а затем классифицируя посты из 20 групп новостей (общий набор справочных данных для исследования машинного обучения).

Кластеризация группирует элементы по их сходству — например, это можно наблюдать в результатах поиска Google.

Мы сосредоточимся на рекомендациях , которые иногда называют совместной фильтрацией. Амазонка является хорошо известным примером предоставления предлагаемых продуктов «другие люди также купили».

Для получения дополнительной информации о Mahout и кластеризации или классификации я предлагаю вам прочитать Mahout в действии (посмотрите, что я там делал?).

рекомендации

Рекомендации предоставляют механизм обнаружения, чтобы познакомить пользователей с новыми элементами, которые могут представлять для них интерес; это обычно связано с кросс-продажной тактикой (например, «Также куплено») на розничных сайтах электронной торговли.

Mahout предоставляет набор компонентов, позволяющих создавать специализированные рекомендательные механизмы.

Во-первых, есть Рекомендатор, который будет выдавать рекомендации на основе DataModel.

Рекомендующий на основе пользователя будет искать похожие предпочтения или шаблоны поведения между пользователями (UserShoityity), а затем группировать их в окрестности (UserNeighborhood), например, ближайшие 10 пользователей к указанному пользователю. Выбранный алгоритм затем выберет рекомендации новых предметов изнутри района.

Рекомендатор, основанный на элементах, работает над сходством между элементами (ItemS Similarity).

DataModel имеет очень простое представление данных предпочтений для работы: длинный идентификатор пользователя, длинный идентификатор элемента и значение предпочтения с плавающей запятой. Это ограничено кортежем для уменьшения потребления памяти и, следовательно, увеличения масштабируемости. Реализации DataModel доступны для файлов, MySQL, универсальных JDBC и Postgres.

https://cwiki.apache.org/MAHOUT/recommender-documentation.html содержит много полезной информации и дополнительных ссылок.

Рекомендации Grails

Лим Чи Кин усердно работал и недавно выпустил плагин Grails Mahout-Recommender в декабре 2011 года. Плагин предназначен для того, чтобы вы могли оценивать различные рекомендации без необходимости написания кода; После того, как вы выбрали рекомендацию, ее можно включить с помощью конфигурации.

Мы начнем с изучения примера упакованного приложения libimseti, основанного на коде из главы 5 Mahout in Action, который использует 17+ миллионов оценок профиля с чешского сайта знакомств, чтобы рекомендовать совместимые профили пользователей.

Libimseti

Начало настройки

Я создал чистое приложение Grails 2.0.0 и установил плагин (версия 0.5.1 на момент написания), используя
команды в листинге 1. Плагин добавляет несколько новых скриптов, включая возможность установки примера приложения, которое мы можем запустить, используя команда grails install-libimseti-sample-app.

grails create-app GroovyMagMahout
cd GroovyMagMahout
grails install-plugin mahout-recommender

Листинг 1: создание приложения и установка плагина

Образец данных

Libimseti выборка данных не распространяемый, так что вам необходимо скачать почтовый индекс от http://www.occamslab.com/petricek/data/libimseti-complete.zip , а затем извлечь файлы .dat в Grails-приложение / конф

конфигурация

Перед запуском приложения Grails нам нужно сделать еще две вещи: во-первых, нам нужно настроить конфигурацию плагина в Config.groovy, чтобы добавить настройки из листинга 2, и нам также нужно дать Grails больше памяти для голодного алгоритма. чтобы предотвратить «OutOfMemoryError: превышен лимит накладных расходов GC», который достигается в листинге 3.

mahout.recommender.hasPreference = false
mahout.recommender.data.file = 'ratings.dat'

 

Листинг 2: Дополнительная конфигурация плагина

export GRAILS_OPTS = «- XX: MaxPermSize = 256m -Xmx1024M -server»
Листинг 3: Увеличение памяти, выделенной для Grails

Пример использования Либимсети

Когда мы запустим grails run-app и перейдем по адресу http: // localhost: 8080 / GroovyMagMahout, мы увидим, что согласно рисунку 1 у нас есть один рекомендательный контроллер.

Рисунок 1: Домашняя страница приложения

Выбор контроллера приведет нас к форме настроек, показанной на рисунке 2.

Рисунок 2: Настройки рекомендателя

Введите идентификатор пользователя «133», отправьте форму и через некоторое время (алгоритм настроен для лучшего соответствия, а не производительности) вы увидите рекомендации, показанные на рисунке 3, где более высокий балл означает лучшее соответствие.

Рисунок 3: Рекомендации

Что дальше?

Libimseti пример приложение хорошо , чтобы доказать , что теория работает на разумные размерах набора данных, но не многие из нас собираются хотеть викарий наших данных для сопоставления входного файла. На самом деле у нас будет приложение, которое связывает пользователей с предметами или позволяет пользователям оценивать предметы.

Мы создадим простую реализацию Grails — исходный код доступен на GitHub по адресу https://github.com/rbramley/GroovyMagMahout

Модель данных

В качестве упрощения этого упражнения мы будем использовать одну таблицу предпочтений , которая будет представлять таблицу связи (соединение многие-ко-многим) между пользователем и элементом, как показано в обозначении ERD на рисунке 4.

Рисунок 4: Пример ERD

Эта таблица будет иметь составной первичный ключ, состоящий из идентификаторов пользователя и элементов, а затем значение, определяющее степень предпочтения. Для предпочтения мы будем использовать диапазон от 1 до 5, поскольку он может быть представлен виджетом рейтинга (например, предоставленным плагином Grails Rich UI).

Мы создадим класс домена (используя grails create-domain-class com.rbramley.mahout.Preference) и укажем его в соответствии с листингом 4. Обратите внимание, что мы использовали составной ключ для удовлетворения потребностей Mahout, но это открывает представление незначительные проблемы Grails с сгенерированным контроллером по умолчанию и представлениями (grails generate-all com.rbramley.mahout.Preference), не поддерживающими составной ключ (это не должно влиять на вас, если вы не хотите редактировать / удалять записи предпочтений).

package com.rbramley.mahout
 
import org.apache.commons.lang.builder.HashCodeBuilder
 
class Preference implements Serializable {
    long userId
    long itemId
    float prefValue
 
    static constraints = {
        userId()
        itemId()
        prefValue range: 0.0f..5.0f
    }
 
    boolean equals(other) {
        if(!(other instanceof Preference)) {
           return false
        }
 
        other.userId == userId && other.itemId == itemId
    }
 
    int hashCode() {
        def builder = new HashCodeBuilder()
        builder.append userId
        builder.append itemId
        builder.toHashCode()
    }
 
    static mapping = {
        id composite: ['userId', 'itemId']
       version false
    }
}

 

Листинг 4: Класс домена

Мы будем использовать MySQL для базы данных, поскольку реализация поставщика Mahout DataModel поддерживается плагином Grails (Mahout также имеет Postgres и общие реализации JDBC).

Во-первых, нам нужно создать целевую схему в MySQL (листинг 5).

mysql -u root -p
mysql> create database recommender;
mysql> grant all on recommender.* to recommender@localhost identified by 'mahoutdemo';

Листинг 5: Команды MySQL

После этого мы можем раскомментировать зависимость mysql-connector-java среды выполнения в BuildConfig.groovy и затем соответствующим образом настроить DataSource.groovy (листинг 6).

    development {
        dataSource {
            driverClassName = "com.mysql.jdbc.Driver"
            dbCreate = "create-drop" // one of 'create', 'create-drop', 'update', 'validate'
            url = "jdbc:mysql://localhost:3306/recommender"
            username = "recommender"
            password = "mahoutdemo"
        }
    }

 

Листинг 6: Конфигурация источника данных разработки

Переконфигурирование плагина

Теперь нам нужно перенастроить Config.groovy, чтобы указать плагину, какие алгоритмы рекомендования и сходства использовать и где получать данные, это достигается с помощью настроек в листинге 7.

mahout.recommender.mode = 'config'  // 'input', 'config' or 'class'
mahout.recommender.hasPreference = true
mahout.recommender.selected = 1 // user-based
mahout.recommender.similarity = 'PearsonCorrelation'
mahout.recommender.withWeighting = false
mahout.recommender.neighborhood = 2
mahout.recommender.data.model = 'mysql'
mahout.recommender.preference.table = 'preference'
mahout.recommender.preference.valueColumn = 'pref_value'

 

Листинг 7: Конфигурация плагина

Предоставление данных

Теперь мы можем запустить приложение, выбрать новый com.rbramley.mahout.PreferenceController и ввести некоторые значения для наших данных.

Если вы введете набор данных, показанный на рисунке 5, то, когда вы используете контроллер рекомендаций для получения рекомендаций для идентификатора пользователя 1, вы должны получить рекомендации 104 и 106, как показано на рисунке 6.

Рисунок 5: Пример значений данных

Рисунок 6: Рекомендации для идентификатора пользователя 1

В качестве альтернативы, в проекте на GitHub есть сценарий SQL, который можно запустить, чтобы заполнить таблицу предпочтений аналогичными данными (на основе листинга 2.1 из Mahout в действии).

Оценка рекомендаций

Плагин Grails имеет встроенный оценщик рекомендателя, основанный на средней разнице, в нашем случае мы можем получить к нему доступ по адресу http: // localhost: 8080 / GroovyMagMahout / Recommender /valuator и щелкнуть ссылку «Run Evaluator», на которой показан пример выходных данных. на рисунке 7.

Чем меньше разница, тем лучше — поэтому вы можете поэкспериментировать с изменением свойства mahout.recommender.simility, которое мы установили в листинге 7, допустимыми значениями являются «PearsonCorrelation», «EuclideanDistance», «LogLikelihood» или «TanimotoCoefficient».

Рисунок 7: Рекомендация оценки

Точно так же вы можете захотеть изменить другие свойства, такие как применение взвешивания или настройка размера окрестности — в любом случае, пожалуйста, обратитесь к разделу конфигурации руководства по плагину по адресу http://limcheekin.github.com/mahout-recommender/docs/ руководство / руководство / configuration.html

Резюме

В этой статье была представлена ​​Apache Mahout, масштабируемая среда машинного обучения с открытым исходным кодом, и показано, как ее можно использовать для предоставления личных рекомендаций в приложении Grails. Мы видели пользовательские рекомендации для примеров файлов данных libimseti и рекомендации, основанные на сходстве пользователей поверх класса домена Grails. На практике эти рекомендации рекомендуется в идеале вызывать асинхронно, особенно для больших наборов данных, это может быть достигнуто с использованием методов AJAX.

Получайте удовольствие от интеграции стилизованных рекомендаций в ваше приложение, но помните, что это хорошо, если вы позволите пользователям высказать свое мнение об актуальности рекомендаций!

Рекомендации / дальнейшее чтение

Следующее обеспечивает ценные источники информации: