Вступление
Наш последний пост был о совместной работе 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:
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
Опять же для тех, кто интересуется теорией и научными работами, я предлагаю прочитать следующую веб-страницу.