2015-12-09 47 views
1

我想使用rfcv函數做多變量隨機森林功能選擇。我設法得到正常的RF命令使用(構建隨機森林)模型的並行處理的工作如下:並行rfcv從R的randomForest包

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 :: combine函數會將4個rf.objects減少爲一個對象。因此,在第一個代碼示例中,您只訓練4個森林模型與隨機種子的差異。使用combine = combine(隱式組合= randomForest :: combine),您可以指定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