Статьи

Машинное обучение с Windows Azure — Mahout на платформе Microsoft Hadoop

Вступление

В нашем
последнем посте речь шла о совместных усилиях Microsoft и Hortonworks по созданию Hadoop для Microsoft Windows Azure, получившей название HDInsight. Одним из ключевых компонентов Microsoft HDInsight является Mahout, масштабируемая библиотека машинного обучения, которая предоставляет ряд алгоритмов, основанных на платформе Hadoop. Машинное обучение поддерживает широкий спектр вариантов использования: от фильтрации спама в электронной почте до обнаружения мошенничества до рекомендации книг или фильмов, аналогично функциям Amazon.com. Эти алгоритмы можно разделить на три основные категории: рекомендации / совместная фильтрация, категоризация и кластеризация. Более подробно об этих алгоритмах можно прочитать на
вики Apache Mahout.

Рекомендательный движок на Azure

Стандартным примером рекомендателя в машинном обучении является рекомендатель фильма. Удивительно, но этот пример не входит в число представленных примеров HDInsight, поэтому нам нужно реализовать его самостоятельно, используя компоненты mahout-0.5. Рекомендатель фильма — это алгоритм рекомендаций на основе элементов: ключевая концепция заключается в том, что, имея большой набор данных о пользователях, фильмах и значениях, указывающих, насколько пользователю понравился этот конкретный фильм, алгоритм будет рекомендовать фильмы пользователям. Обычно используемый набор данных для рекомендации фильма взят из
GroupLens . Загружаемый файл, который является частью набора данных 100K (u.data), не подходит для Mahout, поскольку его формат имеет вид:

user item value timestamp
196 242 3 881250949
186 302 3 891717742
22 377 1 878887116
....

Mahout требует, чтобы данные были в следующем формате: userid, itemid, value, поэтому содержимое должно быть преобразовано в

196,242,3
186,302,3
22,377,1
....

В Azure нет веб-консоли для запуска Mahout, нам нужно перейти на удаленный рабочий стол, чтобы загрузить конфигурацию RDP, а затем войти в головной узел Azure через RDP. Затем мы должны запустить командную строку Hadoop, чтобы получить приглашение.

c:>c:\apps\dist\hadoop-1.1.0-SNAPSHOT\bin\hadoop jar c:\apps\dist\mahout-0.5\mahout-examples-0.5-job.jar org.apache.mahout.driver.MahoutDriver recommenditembased --input recommend.csv --output recommendout --tempDir recommendtmp --usersFile user-ids.txt --similarityClassname SIMILARITY_EUCLIDEAN_DISTANCE --numRecommendations 5

Стандартный mahout.cmd, похоже, содержит несколько ошибок, если мы запустим mahout.cmd, он выдаст ошибку с жалобой на использование java. Мне пришлось изменить файл, чтобы удалить параметр переменной окружения HADOOP_CLASSPATH, см. Изменения полужирным курсивом:

@rem run it
if not [%MAHOUT_LOCAL%] == [] (
    echo "MAHOUT_LOCAL is set, running locally"
    %JAVA% %JAVA_HEAP_MAX% %MAHOUT_OPTS% -classpath %MAHOUT_CLASSPATH% %CLASS% %*
) else (
    if [%MAHOUT_JOB%] == [] (
        echo "ERROR: Could not find mahout-examples-*.job in %MAHOUT_HOME% or %MAHOUT_HOME%\examples\target"
        goto :eof
    ) else (
@rem  set HADOOP_CLASSPATH=%MAHOUT_CLASSPATH%
        if /I [%1] == [hadoop] (
            echo Running: %HADOOP_HOME%\bin\%*
            call %HADOOP_HOME%\bin\%*
        ) else (
            echo Running: %HADOOP_HOME%\bin\hadoop jar %MAHOUT_JOB% %CLASS% %*
            call %HADOOP_HOME%\bin\hadoop jar %MAHOUT_JOB% %CLASS% %*
        )
    )
)

После этого изменения мы можем запустить mahout, как и ожидалось:

c:\apps\dist\mahout-0.5\bin>mahout.cmd recommenditembased --input recommend.csv --output recommendout --tempDir recommendtmp --usersFile user-ids.txt --similarityClassname SIMILARITY_EUCLIDEAN_DISTANCE --numRecommendations 5

Входной аргумент определяет путь к входному каталогу, выходной аргумент определяет путь к выходному каталогу. NumRecommendations означает количество рекомендаций на пользователя. Файл usersFile определяет пользователей, для которых рекомендуется (в нашем случае он содержит только 3 пользователя: 112, 286, 310:

c:>hadoop fs -cat user-ids.txt
112
286
301

SimilarityClass — это имя распределенного класса сходства, и это могут быть SIMILARITY_EUCLIDEAN_DISTANCE, SIMILARITY_LOGLIKELIHOOD, SIMILARITY_PEARSON_CORRELATION и т. Д. Этот класс определяет алгоритм для вычисления сходства между элементами. За выполнением задач MapReduce можно следить через консоль администратора Hadoop MapReduce: как
только работа завершена, нам нужно использовать команды файловой системы hadoop для отображения выходного файла, созданного RecommenderJob:
Погонщик-рекомендатель-консоль
Погонщик-рекомендатель-console1

c:\apps\dist\hadoop-1.1.0-SNAPSHOT>hadoop fs -ls .
Found 5 items
drwxr-xr-x   - istvan supergroup          0 2012-12-21 11:00 /user/istvan/.Trash
-rw-r--r--   3 istvan supergroup    1079173 2012-12-23 22:40 /user/istvan/recomm
end.csv
drwxr-xr-x   - istvan supergroup          0 2012-12-24 12:24 /user/istvan/recomm
endout
drwxr-xr-x   - istvan supergroup          0 2012-12-24 12:22 /user/istvan/recomm
endtmp
-rw-r--r--   3 istvan supergroup         15 2012-12-23 22:40 /user/istvan/user-i
ds.txt

c:\apps\dist\hadoop-1.1.0-SNAPSHOT>hadoop fs -ls recommendout
Found 3 items
-rw-r--r--   3 istvan supergroup          0 2012-12-24 12:24 /user/istvan/recomm
endout/_SUCCESS
drwxr-xr-x   - istvan supergroup          0 2012-12-24 12:23 /user/istvan/recomm
endout/_logs
-rw-r--r--   3 istvan supergroup        153 2012-12-24 12:24 /user/istvan/recomm
endout/part-r-00000

c:\apps\dist\hadoop-1.1.0-SNAPSHOT>hadoop fs -cat recommendout/part-r*
112     [1228:5.0,1473:5.0,1612:5.0,1624:5.0,1602:5.0]
286     [1620:5.0,1617:5.0,1615:5.0,1612:5.0,1611:5.0]
301     [1620:5.0,1607:5.0,1534:5.0,1514:5.0,1503:5.0]

Таким образом, RecommenderJob рекомендует пользователю 1228, 1473, 1612, 1624 и 1602; позиции 1620, 1617, 1615, 1612 и 1611 для пользователя 286 и 1620, 1607, 1534, 1514 и 1503 для пользователя 301 соответственно. Для тех, кто склонен к теории и научным работам, я предлагаю прочитать статью
Sarwar, Karypis, Konstand и Riedl, в которой описываются алгоритмы рекомендаций, основанные на элементах.

Mahout примеры на Azure

Hadoop в Azure поставляется с двумя предопределенными примерами: один для классификации, другой для кластеризации. Они требуют, чтобы была выполнена командная строка — смирный способ, как описано выше для механизма рекомендаций на основе элементов.
погонщик слоновДемонстрация классификации основана на наивном байесовском классификаторе — сначала вам нужно обучить свой классификатор набором известных данных, а затем вы можете запустить алгоритм на реальном наборе данных. Эта концепция называется контролируемым обучением. Чтобы запустить пример классификации, нам нужно скачать файл 20news-bydate.tar.gz с http://people.csail.mit.edu/jrennie/20Newsgroups/20news-bydate.tar.gz и распаковать его в mahout-0.5 / примеры / bin / рабочий каталог. Набор данных имеет два подмножества: одно для обучения классификатора, а другое — для запуска теста. Затем мы можем запустить команду:

c:\apps\dist\mahout-0.5\examples\bin> build-20news-bayes.cmd

Это запустит задание Hadoop MapReduce и через некоторое время выплюнет матрицу путаницы, основанную на алгоритме Байеса. Матрица путаницы скажет нам, какие категории были правильно определены классификатором, а какие — нет. Например, у него есть категория с именем rec.motorcycles (столбец a), и классификатор правильно определил 381 элемент из 398, принадлежащих к этой категории, в то время как он неправильно определил 9 элементов как принадлежащих rec.autos (столбец f), 2 элемента неправильно как принадлежащий sci.electronics (столбец n), и т. д.

WORK_PATH=c:\apps\dist\mahout-0.5\examples\bin\work\20news-bydate\
Running: c:\apps\dist\hadoop-1.1.0-SNAPSHOT\bin\hadoop jar c:\apps\dist\mahout-0
.5\bin\..\\mahout-examples-0.5-job.jar org.apache.mahout.driver.MahoutDriver tes
tclassifier   -m examples/bin/work/20news-bydate/bayes-model   -d examples/bin/w
ork/20news-bydate/bayes-test-input   -type bayes   -ng 1   -source hdfs   -metho
d "mapreduce"

12/12/24 17:55:58 INFO mapred.JobClient:     Map output records=7532
12/12/24 17:55:59 INFO bayes.BayesClassifierDriver: ============================
===========================
Confusion Matrix
-------------------------------------------------------
a       b       c       d       e       f       g       h       i       j
k       l       m       n       o       p       q       r       s       t
u       <--Classified as
381     0       0       0       0       9       1       0       0       0
1       0       0       2       0       1       0       0       3       0
0        |  398         a     = rec.motorcycles
1       284     0       0       0       0       1       0       6       3
11      0       66      3       0       1       6       0       4       9
0        |  395         b     = comp.windows.x
2       0       339     2       0       3       5       1       0       0
0       0       1       1       12      1       7       0       2       0
0        |  376         c     = talk.politics.mideast
4       0       1       327     0       2       2       0       0       2
1       1       0       5       1       4       12      0       2       0
0        |  364         d     = talk.politics.guns
7       0       4       32      27      7       7       2       0       12
0       0       6       0       100     9       7       31      0       0
0        |  251         e     = talk.religion.misc
10      0       0       0       0       359     2       2       0       1
3       0       1       6       0       1       0       0       11      0
0        |  396         f     = rec.autos
0       0       0       0       0       1       383     9       1       0
0       0       0       0       0       0       0       0       3       0
0        |  397         g     = rec.sport.baseball
1       0       0       0       0       0       9       382     0       0
0       0       1       1       1       0       2       0       2       0
0        |  399         h     = rec.sport.hockey
2       0       0       0       0       4       3       0       330     4
4       0       5       12      0       0       2       0       12      7
0        |  385         i     = comp.sys.mac.hardware
0       3       0       0       0       0       1       0       0       368
0       0       10      4       1       3       2       0       2       0
0        |  394         j     = sci.space
0       0       0       0       0       3       1       0       27      2
291     0       11      25      0       0       1       0       13      18
0        |  392         k     = comp.sys.ibm.pc.hardware
8       0       1       109     0       6       11      4       1       18
0       98      1       3       11      10      27      1       1       0
0        |  310         l     = talk.politics.misc
0       11      0       0       0       3       6       0       10      6
11      0       299     13      0       2       13      0       7       8
0        |  389         m     = comp.graphics
6       0       1       0       0       4       2       0       5       2
12      0       8       321     0       4       14      0       8       6
0        |  393         n     = sci.electronics
2       0       0       0       0       0       4       1       0       3
1       0       3       1       372     6       0       2       1       2
0        |  398         o     = soc.religion.christian
4       0       0       1       0       2       3       3       0       4
2       0       7       12      6       342     1       0       9       0
0        |  396         p     = sci.med
0       1       0       1       0       1       4       0       3       0
1       0       8       4       0       2       369     0       1       1
0        |  396         q     = sci.crypt
10      0       4       10      1       5       6       2       2       6
2       0       2       1       86      15      14      152     0       1
0        |  319         r     = alt.atheism
4       0       0       0       0       9       1       1       8       1
12      0       3       6       0       2       0       0       341     2
0        |  390         s     = misc.forsale
8       5       0       0       0       1       6       0       8       5
50      0       40      2       1       0       9       0       3       256
0        |  394         t     = comp.os.ms-windows.misc
0       0       0       0       0       0       0       0       0       0
0       0       0       0       0       0       0       0       0       0
0        |  0           u     = unknown
Default Category: unknown: 20

12/12/24 17:55:59 INFO driver.MahoutDriver: Program took 129826 ms

c:\apps\dist\mahout-0.5\examples\bin

Опять же для тех, кто интересуется теорией и научными работами, я предлагаю прочитать
следующую веб-страницу.