company_banner

Cистема рекомендаций в облаке с помощью Hadoop и Apache Mahout

http://www.windowsazure.com/en-us/develop/net/tutorials/hadoop-recommendation-engine/
  • Перевод
  • Tutorial
image

Apache Mahout — это библиотека машинного обучения, созданная для использования в масштабируемых приложениях машинного обучения. Системы рекомендаций — это наиболее узнаваемые приложения машинного обучения, используемые в настоящее время. При выполнении заданий этого руководства мы будем использовать интернет-архив Million Song Dataset, чтобы создать рекомендации по выбору песен для пользователей с учетом их музыкальных предпочтений.



О чем пойдет речь в данном руководстве:



  • Как использовать систему рекомендаций

Данное руководство состоит из следующих разделов.


  1. Изучение и форматирование данных
  2. Выполнение задания Mahout

Установка и настройка


При выполнении заданий этого руководства вам потребуется учетная запись для доступа к службам на основе Apache Hadoop для Windows Azure. Кроме того, необходимо будет создать кластер. Чтобы получить учетную запись и создать кластер Hadoop, следуйте инструкциям раздела «Начало работы с Microsoft Hadoop на платформе Windows Azure» статьи «Вводные сведения о Hadoop на платформе Windows Azure».



Изучение и форматирование данных


Apache Mahout предлагает встроенную реализацию совместной фильтрации на основе элементов. Совместная фильтрация на основе элементов чаще всего используется для анализа данных при создании рекомендаций.



В приведенном примере пользователи выполняют действия с элементами (песнями). Эти пользователи имеют предпочтения относительно этих элементов, выражаемые количеством повторных прослушиваний песен. Образец данных приведен на веб-странице Echo Nest Taste Profile Subset.



clip_image002
Рис.1. Образец данных из архива Milion Song Dataset



Чтобы использовать набор данных с Mahout, требуется выполнить две задачи.



  1. Преобразовать идентификаторы песен и пользователей в целые значения.
  2. Сохранить новые значения с их рейтингами в файл, разделенный запятыми.

Запустите Visual Studio 2010. В окне программы последовательно выберите File -> New Project. В области Installed Templates в узле Visual C# укажите категорию Window, а затем выберите из списка вариант Console Application. Присвойте проекту имя ConvertToMahoutInput.



clip_image004
Рис.2. Создание консольного приложения



После создания приложения откройте файл Program.cs и добавьте следующие статические члены в класс Program.



const char tab = '\u0009';
static Dictionary<string, int> usersMapping = new Dictionary<string, int>();
static Dictionary<string, int> songMapping = new Dictionary<string, int>();

Затем добавьте в метод Main следующий код.



var inputStream = File.Open(args[0], FileMode.Open);
var reader = new StreamReader(inputStream);

var outStream = File.Open("mInput.txt", FileMode.OpenOrCreate);
var writer = new StreamWriter(outStream);

var i = 1;

var line = reader.ReadLine();
while (!string.IsNullOrWhiteSpace(line))
{
    i++;
    if (i > 5000)
    break;
    var outLine = line.Split(tab);

    int user = GetUser(outLine[0]);
    int song = GetSong(outLine[1]);

    writer.Write(user);
    writer.Write(',');
    writer.Write(song);
    writer.Write(',');
    writer.WriteLine(outLine[2]);

    line = reader.ReadLine();
}

Console.WriteLine("saved {0} lines to {1}", i, args[1]);

reader.Close();
writer.Close();

SaveMapping(usersMapping, "usersMap.csv");
SaveMapping(songMapping, "songMapping.csv");

Console.WriteLine("Mapping saved");
Console.ReadKey();

Теперь создайте функции GetUser и GetSong для преобразования идентификаторов в целые числа.



static int GetUser(string user)
{
    if (!usersMapping.ContainsKey(user))
        usersMapping.Add(user, usersMapping.Count + 1);

    return usersMapping[user];
}

static int GetSong(string song)
{
    if (!songMapping.ContainsKey(song))
        songMapping.Add(song, songMapping.Count + 1);

    return songMapping[song];
}

И напоследок создайте служебную программу для внедрения метода SaveMapping, который сохраняет словари сопоставлений программ-роботов в CSV-файлы.



static void SaveMapping(Dictionary<string, int> mapping, string fileName)
{
    var stream = File.Open(fileName, FileMode.Create);
    var writer = new StreamWriter(stream);

    foreach (var key in mapping.Keys)
    {
        writer.Write(key);
        writer.Write(',');
        writer.WriteLine(mapping[key]);
    }

    writer.Close();
}

Теперь загрузите образец данных, расположенный по этой ссылке. После загрузки откройте архив train_triplets.txt.zip и извлеките файл train_triplets.txt.



При выполнении служебной программы добавьте аргумент командной строки с расположением файла train_triplets.txt. Для этого правой кнопкой мыши щелкните узел проекта ConvertToMahoutInput в Solution Explorer и в контекстном меню выберите пункт Properties. На странице свойств проекта добавьте путь к файлу train_triplets.txt в текстовое поле Command line arguments.



clip_image006
Рис.3. Задание аргумента командной строки



Чтобы запустить программу, нажмите клавишу F5. После ее завершения откройте папку bin\Debug из расположения, где был сохранен проект, и просмотрите результат выполнения служебной программы.



clip_image008
Рис.4. Результат выполнения служебной программы ConvertToMahoutInput

Выполнение задания Mahout


Откройте портал кластера Hadoop на веб-сайте https://www.hadooponazure.com и щелкните значок Remote Desktop.



clip_image010
Рис.4. Значок удаленного рабочего стола



Упакуйте в архив Zip файл mInput.txt из папки bin\Debug и скопируйте его в корневую папку c:\ на удаленном кластере. После копирования извлеките файл из архива.



Теперь создайте файл с идентификатором пользователя, для которого будут создаваться рекомендации. Для этого в корневой папке c:\создайте текстовый файл с именем users.txt и запишите в него идентификатор одного пользователя.



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



Затем загрузите файлы mInput.txt и users.txt в HDFS. Для этого откройте Hadoop Command Shell и выполните следующие команды.



hadoop fs -copyFromLocal c:\mInput.txt input\mInput.txt
hadoop fs -copyFromLocal c:\users.txt input\users.txt



Теперь можно выполнить задание с помощью команды:



hadoop jar c:\Apps\dist\mahout\mahout-core-0.5-job.jar org.apache.mahout.cf.taste.hadoop.item.RecommenderJob --input=input/mInput.txt --output=output --usersFile=input/users.txt



Задание Mahout выполняется несколько минут, после чего создается выходной файл. Выполните следующую команду для получения локальной копии выходного файла.



hadoop fs -copyToLocal output/part-r-00000 c:\output.txt



Откройте файл output.txt из корневой папки c:\ и изучите его содержимое. Файл имеет следующую структуру.



user [song:rating,song:rating, ...]



Выводы


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



Вы можете использовать обработку данных и преимущества облачного масштабирования Hadoop и Apache Mahout на платформе Windows Azure. Попробуйте сегодня windowsazure.com/ru-ru и www.hadooponazure.com

  • +17
  • 7,5k
  • 2
Microsoft
387,00
Microsoft — мировой лидер в области ПО и ИТ-услуг
Поделиться публикацией

Комментарии 2

    +2
    И сколько этот алгоритм набирает по MAP@500
    www.kaggle.com/c/msdchallenge/leaderboard
      0
      Цитата со страницы Mahout:
      «Our core algorithms for clustering, classification and batch based collaborative filtering are implemented on top of Apache Hadoop using the map/reduce paradigm.»

      Очень интересно, учитывая что разработчики GraphLab утверждают что многие алгоритмы машинного обучения не достаточно эффективно «map-reducable».
      Хотелось бы увидеть сравнение этих двух фреймворков например для задачи collaborative filtering.

      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

      Самое читаемое