Пару месяцев назад я написал сообщение в блоге, в котором описывается использование случайных лесов Mahout для задачи распознавания цифр Kaggle, и после того, как я увидел, сколько времени понадобилось для создания лесов с более чем 500 деревьями, я захотел узнать, можно ли это ускорить, распараллеливая обработать.
Смотря на DecisionTree, казалось, что можно создать множество небольших лесов, а затем объединить их вместе.
После безуспешных попыток достичь этого путем прямого использования DecisionForest я решил просто скопировать весь код из этого класса в свою собственную версию, что позволило мне добиться этого.
Код для построения леса в конечном итоге выглядит следующим образом:
List<Node> trees = new ArrayList<Node>(); MultiDecisionForest forest = MultiDecisionForest.load(new Configuration(), new Path("/path/to/mahout-tree")); trees.addAll(forest.getTrees()); MultiDecisionForest forest = new MultiDecisionForest(trees);
Затем мы можем использовать лес для классификации значений в тестовом наборе данных, и, похоже, он работает достаточно хорошо
Я хотел , чтобы попытаться избежать ввода кода многопоточности в так что я использовал GNU параллельно , которая доступна на Mac OS X с варевом установить параллельно и на Ubuntu путем добавления следующего репозиторий в /etc/apt/sources.list …
deb http://ppa.launchpad.net/ieltonf/ppa/ubuntu oneiric main deb-src http://ppa.launchpad.net/ieltonf/ppa/ubuntu oneiric main
… с последующим обновлением APT-GET и APT-получить установку параллельно .
Затем я написал скрипт для распараллеливания создания лесов:
#!/bin/bash start=`date` startTime=`date '+%s'` numberOfRuns=$1 seq 1 ${numberOfRuns} | parallel -P 8 "./build-forest.sh" end=`date` endTime=`date '+%s'` echo "Started: ${start}" echo "Finished: ${end}" echo "Took: " $(expr $endTime - $startTime)
#!/bin/bash java -Xmx1024m -cp target/machinenursery-1.0.0-SNAPSHOT-standalone.jar main.java.MahoutPlaybox
Этого можно добиться, используя параметр параллелизма в xargs, но, к сожалению, я не смог добиться того же успеха с этой командой.
До сегодняшнего дня я не сталкивался с командой seq, но здесь она работает достаточно хорошо, позволяя нам указать, сколько раз мы хотим вызвать скрипт.
Вероятно, мне удалось добиться увеличения скорости примерно на 30% при запуске этого на моем Air. В экземпляре с высокой загрузкой процессора AWS наблюдалось большее увеличение, хотя по некоторым причинам некоторые задания, казалось, были убиты, и я не мог понять, почему.
К сожалению, даже с новым классификатором с огромным количеством деревьев я не увидел улучшения по сравнению со случайным лесом Weka с использованием AdaBoost, который я написал около месяца назад. У нас была точность 96,282% по сравнению с 96,529% с версией Weka.