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

в 10:34, , рубрики: Apache, apache mahout, Hadoop, machine learning, open source, windows azure, Блог компании Microsoft, Облачные вычисления, облачные сервисы

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. После ее завершения откройте папку binDebug из расположения, где был сохранен проект, и просмотрите результат выполнения служебной программы.

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

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

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

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

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js