2015-12-09 2 views
1

Я пытаюсь использовать функцию rfcv для выполнения многомерного случайного выбора функции леса. Мне удалось получить нормальную команду радиочастотной (построение случайного леса) модели для работы с параллельной обработкой, используя следующую:Parallelise rfcv из пакета randomForest в R

library(randomForest) 
library(doMC) 
nCores <- detectCores(); 
registerDoMC(nCores) #number of cores on the machine 
rf.model <- foreach(ntree=rep(round(510/nCores),nCores), .combine=combine, .multicombine=TRUE, .packages="randomForest") %dopar% { 
    rf <- randomForest(y = outcome, x = predictor, ntree=ntree, mtry=4,  norm.votes=FALSE, importance=TRUE) 
    } 

Перед использованием одного я хочу использовать rfcv для моего выбора функции. Я пытался делать это, как описаны выше со следующим:

rf.model <- foreach(1:nCores, .packages="randomForest") %dopar% { 
    rf.rfcv <- rfcv(ytrain = outcome, xtrain = predictor, scale=4) 
    } 

Однако исход этой функции тем же реплицируется в течение времени, так что я просто получить rf.rfcv как список из 4 одинаковых результатов.

Любая помощь будет очень признательна! Благодаря!

ответ

1

randomForest может быть запущен параллельно, потому что функция randomForest :: comb уменьшит 4 rf.объекта до одного объекта. Итак, в первом примере кода вы тренируете 4 модели леса только со случайным семенем в разнице. With, comb = comb (implicit comb = randomForest :: comb), вы указываете, что выходной список из 4 моделей должен быть уменьшен с помощью специализированной функции комбинирования из пакета randomForest.

rfcv не имеет функции совмещения, и не имеет смысла просто комбинировать четыре выхода. В вашем коде foreach просто запускает функцию 4 раза и возвращает выходы в списке. Если вам нравится запускать rfcv параллельно, исправление будет выглядеть примерно так:

my.rfcv = randomForest::rfcv #copy function from package to .Global.env 
fix(my.rfcv) #inspect function and perhaps copy entire function to your source functions script 

#rewrite for-loop at line 35-57 into a foreach-loop 
#write a reducer to combine test results of each fold 
+0

Удивительно, спасибо большое! Это сработало :) – SimonKragh