Подтвердить что ты не робот

Параллельное выполнение случайного леса в R

Я запускаю случайный лес в R параллельно

library(doMC)
registerDoMC()
x <- matrix(runif(500), 100)
y <- gl(2, 50)

Параллельное выполнение (заняло 73 секунды)

rf <- foreach(ntree=rep(25000, 6), .combine=combine, .packages='randomForest') %dopar%
randomForest(x, y, ntree=ntree) 

Последовательное выполнение (занимает 82 секунды)

rf <- foreach(ntree=rep(25000, 6), .combine=combine) %do%
randomForest(x, y, ntree=ntree) 

При параллельном выполнении генерация дерева довольно быстрая, как 3-7 секунд, но остальное время потребляется при объединении результатов (опция комбинирования). Таким образом, единственное, что стоит выполнить параллельное выполнение, - это количество деревьев, которые действительно высоки. Есть ли способ, который я могу настроить "объединить", чтобы избежать любых вычислений на каждом node, который мне не нужен, и сделать его быстрее

PS. Выше - всего лишь пример данных. В реальности у меня есть около 100 тысяч функций для 100 наблюдений.

4b9b3361

Ответ 1

Установка .multicombine в TRUE может иметь существенное значение:

rf <- foreach(ntree=rep(25000, 6), .combine=randomForest::combine,
              .multicombine=TRUE, .packages='randomForest') %dopar% {
    randomForest(x, y, ntree=ntree)
}

Это приводит к тому, что combine вызывается один раз, а не пять раз. На моем настольном компьютере это выполняется за 8 секунд, а не за 19 секунд.

Ответ 2

Знаете ли вы, что пакет caret может выполнять большую часть ручной работы для параллельных прогонов (а также подготовку данных, сводки,... ) для вас?

В конечном счете, конечно, если в процессе вычисления случайных лесных ресурсов есть некоторые дорогостоящие операции, вы можете мало что сделать, поскольку Энди потратил немало лет на его улучшение. Я бы ожидал, что немногие из них не будут подвешивать плоды, чтобы быть рядом для выбора...

Ответ 3

Пакет H20 ​​можно использовать для решения вашей проблемы.

В соответствии с H20 документация страница H2O - это" открытый источник математический движок для больших данных, который вычисляет параллельное распределение алгоритмы машинного обучения, такие как обобщенные линейные модели, градиентные ускорительные машины, случайные леса и нейронные сети (глубокое обучение) в различных кластерных средах.

Случайная реализация леса с использованием H2O:

https://www.analyticsvidhya.com/blog/2016/05/h2o-data-table-build-models-large-data-sets/

Ответ 4

Интересно, полезен ли вам код parallelRandomForest?

По словам автора, он работал примерно в 6 раз быстрее своего набора данных с потреблением памяти в 16 раз меньше.

SPRINT также имеет параллельную реализацию здесь.

Ответ 5

В зависимости от вашего процессора вы, вероятно, можете получить ускорение на 5% -30%, выбрав количество заданий в соответствии с количеством зарегистрированных ядер, соответствующих количеству системных логических ядер. (иногда более эффективно сопоставлять число физических ядер системы). Если у вас есть общий двухъядерный ноутбук Intel с Hyper Threading (4 логических ядра), то DoMC, вероятно, зарегистрировал кластер из 4 ядер. Таким образом, 2 ядра будут бездействовать, когда итерации 5 и 6 будут вычисляться плюс дополнительное время запуска/остановки двух дополнительных заданий. Было бы более эффективно делать только 2-4 задания большего количества деревьев.