Повышение скорости прогнозирования новых данных с использованием модели случайного леса
Я создаю модели распространения видов, используя Случайный Лес. Эти модели пытаются предсказать вероятность появления вида, обусловленного различными экологическими характеристиками. Для большинства видов наш начальный набор потенциальных предикторов находится где-то между 10 и 25, и каждый предиктор представлен растровым файлом ГИС с 460000000 ячеек. Из-за характера обучающих данных, которые я не буду здесь вдаваться, я на самом деле строю несколько РЧ моделей (приблизительно от 10 до 100+) на основе подмножеств данных, а затем объединяюсь, чтобы создать общую модель для каждого вида., На самом деле построение модели занимает относительно мало времени (обычно несколько минут или меньше), но использование функции прогнозирования для создания растрового слоя прогнозируемой вероятности на основе этой модели может занять более 20 часов. Я подозреваю, что большая часть этого длительного процесса связана с чтением / записью больших растровых файлов и что узким местом может быть скорость чтения / записи жесткого диска.
Чтобы предоставить немного больше деталей... Как только у меня есть обученная модель, я создаю растровый стек слоев, представляющих слои предикторов, через растровый пакет, а затем прогнозирую этот стек, используя функцию предиката () в растровый пакет. У меня достаточно мощный рабочий стол (Core i7, 3,5 ГГц, с 32 ГБ ОЗУ), а входные и выходные растровые файлы находятся на локальном жестком диске и не перемещаются по сети. Я видел ответ mbq здесь с полезными предложениями по ускорению генерации модели с помощью randomForest, и я ищу аналогичные предложения по ускорению прогнозируемой операции. Я могу придумать несколько вещей, которые могут помочь (например, вырастить меньшее количество деревьев, использовать одну из библиотек для параллельной обработки), и я планирую протестировать их, если позволит время, но мне неясно, есть ли какие-либо из них. окажет значительное влияние, если проблема в основном заключается в узком месте чтения-записи. Буду благодарен за любые предложения.
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]]
будет вашей первой обученной моделью RF.