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

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.


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

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

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


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


Рис.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.


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

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


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

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


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


Рис.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

Автор статьи: Владимир Юнев.