Cистема рекомендаций в облаке с помощью Hadoop и Apache Mahout
Apache Mahout™ — это библиотека машинного обучения, созданная для использования в масштабируемых приложениях машинного обучения. Системы рекомендаций — это наиболее узнаваемые приложения машинного обучения, используемые в настоящее время. При выполнении заданий этого руководства мы будем использовать интернет-архив Million Song Dataset, чтобы создать рекомендации по выбору песен для пользователей с учетом их музыкальных предпочтений.
О чем пойдет речь в данном руководстве:
- Как использовать систему рекомендаций
Данное руководство состоит из следующих разделов.
- Изучение и форматирование данных
- Выполнение задания 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, требуется выполнить две задачи.
- Преобразовать идентификаторы песен и пользователей в целые значения.
- Сохранить новые значения с их рейтингами в файл, разделенный запятыми.
Запустите 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
Автор статьи: Владимир Юнев.