Повышение скорости прогнозирования новых данных с помощью модели случайного леса

Я создаю модели распространения видов с помощью Random Forest. Эти модели пытаются предсказать вероятность появления вида в зависимости от различных экологических атрибутов. Для большинства видов наш начальный набор потенциальных предикторов составляет от 10 до 25, и каждый предиктор представлен растровым файлом ГИС с 460 000 000 ячеек. Из-за характера обучающих данных, которые я здесь не буду вдаваться, я фактически строю несколько моделей RF (примерно от 10 до 100+) на основе подмножеств данных, а затем объединяю их, чтобы создать свою общую модель для каждого вида. . На самом деле построение модели занимает относительно мало времени (несколько минут или меньше, как правило), но использование функции прогнозирования для создания растрового слоя с прогнозируемой вероятностью на основе этой модели может занять более 20 часов. Я подозреваю, что большая часть этого длительного процесса связана с чтением / записью больших растровых файлов, и что узким местом может быть скорость чтения / записи жесткого диска.

Чтобы предоставить немного больше деталей ... После того, как у меня есть моя обученная модель, я создаю растровый стек слоев, представляющих уровни предикторов, с помощью пакета растров, а затем выполняю прогноз на этот стек, используя функцию predic () в растровый пакет. У меня достаточно мощный настольный компьютер (Core i7, 3,5 ГГц, 32 ГБ ОЗУ), а входные и выходные растровые файлы находятся на локальном жестком диске, а не передаются по сети. Я видел ответ mbq здесь с полезными предложениями по ускорению создания моделей с помощью randomForest, и я ищу аналогичные предложения по ускорению операции прогнозирования. Я могу придумать ряд вещей, которые могли бы помочь (например, выращивание меньшего количества деревьев с использованием одной из библиотек для параллельной обработки), и я планирую протестировать их, если позволит время, но это Мне неясно, окажет ли какое-либо из них значительное влияние, если проблема в основном связана с узким местом чтения-записи. Буду признателен за любые предложения.


person user13706    schedule 06.06.2014    source источник
comment
Я просто расскажу анекдот о том, что выполнение математических расчетов на растрах таким способом ОЧЕНЬ медленно, так что это действительно может быть вашей проблемой.   -  person blindjesse    schedule 07.06.2014
comment
как насчет: blog.mckuhn.de/2013/09/   -  person EDi    schedule 07.06.2014
comment
Я наткнулся на сообщение о parallelRandomForest. Это только кажется, что поддерживает регрессию, а не классификацию. Кроме того, неясно, действительно ли это ускорит процесс прогнозирования, поскольку упор делается на обучение. По-прежнему может быть узкое место со скоростью чтения / записи.   -  person user13706    schedule 09.06.2014


Ответы (1)


Вы можете посмотреть функция mctune здесь. Для нахождения оптимальных параметров используется пакет e1071. Однако вы можете настроить его в соответствии со своими потребностями.

  source( './mctune.R')
  rf_ranges = list(ntree=c(seq(1,1000,100),seq(1000,8000,500)),
  mtry=seq(5,15,2))

  set.seed(10)
  tuned.rf = mctune(method = randomForest, train.x = formula1, 
  data = dataframe, tunecontrol = tune.control(sampling = "cross",cross = 5),   
  ranges=rf_ranges,mc.control=list(mc.cores=16, mc.preschedule=T),confusionmatrizes=T )
  save(tuned.rf, file = paste('./tuned_rf.RData',sep='') )

  tuned.rf$best.model
  plot(tuned.rf)

Другой вариант - использовать foreach из пакета doparallel (см. Здесь). Вы можете назначить каждое подмножество данных (для новой модели RF) каждому ядру:

RF_outputs = foreach(i=1:length(yourdatasubsets), .inorder=F, .package=c(randomForest)) %dopar% {
    set.seed(10)
    rf <- randomForest(formula, data=na.omit(yourdatasubsets[i]), ntree=2000, proximity=T)
    return(rf)
 }

Каждая обученная модель RF будет возвращена вам как часть списка в RF_outputs. Итак, RF_outputs[[1]] будет вашей 1-й обученной моделью RF.

person mmann1123    schedule 05.01.2017