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. После ее завершения откройте папку binDebug из расположения, где был сохранен проект, и просмотрите результат выполнения служебной программы.
Рис.4. Результат выполнения служебной программы ConvertToMahoutInput
Выполнение задания Mahout
Откройте портал кластера Hadoop на веб-сайте https://www.hadooponazure.com и щелкните значок Remote Desktop.
Рис.4. Значок удаленного рабочего стола
Упакуйте в архив Zip файл mInput.txt из папки binDebug и скопируйте его в корневую папку c: на удаленном кластере. После копирования извлеките файл из архива.
Теперь создайте файл с идентификатором пользователя, для которого будут создаваться рекомендации. Для этого в корневой папке c:создайте текстовый файл с именем users.txt и запишите в него идентификатор одного пользователя.
Примечание. Чтобы создать рекомендации для других пользователей, добавьте их идентификаторы в отдельные строки.
Затем загрузите файлы mInput.txt и users.txt в HDFS. Для этого откройте Hadoop Command Shell и выполните следующие команды.
hadoop fs -copyFromLocal c:mInput.txt inputmInput.txt
hadoop fs -copyFromLocal c:users.txt inputusers.txt
Теперь можно выполнить задание с помощью команды:
hadoop jar c:Appsdistmahoutmahout-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
Автор: XaocCPS