在 Windows 上使用 Caret 并行进行递归特征消除

sma*_*rld 3 parallel-processing r machine-learning random-forest r-caret

我正在尝试在包含 27 个预测变量的数据帧上为随机森林运行递归特征消除,每个预测变量有 3653 个值。因此,预测器数据框中总共有 98631 个值。我正在使用包caret 中rfe函数。

require(caret)
require(randomForest)

subsets <- c(1:5, 10, 15, 20, 25)

set.seed(10)

ctrl <- rfeControl(functions = rfFuncs,
                   method = "repeatedcv",
                   repeats = 5,
                   verbose = FALSE,
                   allowParallel=TRUE)

rfProfile <- rfe(predictors, 
                 y,
                 sizes = subsets,
                 rfeControl = ctrl)
Run Code Online (Sandbox Code Playgroud)

我使用allowParallel = TRUErfeControl,希望它会在我的Windows机器上运行的并行处理。但我不确定它是否这样做,因为在设置allowParallel=TRUE后我没有看到运行时间有任何减少。这个过程需要很长时间,每次1-2小时后我不得不中断内核。

我如何知道caret是否正在并行运行 RFE?我是否需要为插入符号安装任何其他并行化包以并行运行此过程?

任何帮助/建议将不胜感激!我是机器学习领域的新手,所以我需要一段时间才能弄清楚。

Whi*_*ard 5

doParallel在运行之前尝试安装和注册软件包rfe。这似乎适用于我的 Windows 机器。

这是从caret文档中提取的冗长示例,其中包含使用前后的时间doParallel

subsetSizes <- c(2, 4, 6, 8)
set.seed(123)
seeds <- vector(mode = "list", length = 51)
for(i in 1:50) seeds[[i]] <- sample.int(1000, length(subsetSizes) + 1)
seeds[[51]] <- sample.int(1000, 1)

data(BloodBrain)
Run Code Online (Sandbox Code Playgroud)

无需并行处理即可运行

set.seed(1)
system.time(rfMod <- rfe(bbbDescr, logBBB,
         sizes = subsetSizes,
         rfeControl = rfeControl(functions = rfFuncs, 
                                 seeds = seeds,
                                 number = 50)))

   user  system elapsed 
 113.32    0.44  114.43 
Run Code Online (Sandbox Code Playgroud)

寄存器并行

library(doParallel) 
cl <- makeCluster(detectCores(), type='PSOCK')
registerDoParallel(cl)
Run Code Online (Sandbox Code Playgroud)

并行处理运行

set.seed(1)
system.time(rfMod <- rfe(bbbDescr, logBBB,
         sizes = subsetSizes,
         rfeControl = rfeControl(functions = rfFuncs, 
                                 seeds = seeds,
                                 number = 50)))

   user  system elapsed 
   1.57    0.01   56.27 
Run Code Online (Sandbox Code Playgroud)