插入符号上的 parRF 不能用于多个核心

Posted

技术标签:

【中文标题】插入符号上的 parRF 不能用于多个核心【英文标题】:parRF on caret not working for more than one core 【发布时间】:2014-09-07 07:04:22 【问题描述】: 插入符号 R 包中的

parRF 不适用于我使用多个内核,这很讽刺,因为 parRF 中的 par 代表并行。我在 Windows 机器上,如果这是相关的信息。我检查了我使用的是关于插入符号和 doParallel 的最新版本。

我做了一个最小的例子,并给出了下面的结果。有什么想法吗?

源代码

library(caret)
library(doParallel)

trCtrl <- trainControl(
  method = "repeatedcv"
  , number = 2
  , repeats = 5
  , allowParallel = TRUE
)

# WORKS
registerDoParallel(1)
train(form = Species~., data=iris, trControl = trCtrl, method="parRF")
closeAllConnections()

# FAILS
registerDoParallel(2)
train(form = Species~., data=iris, trControl = trCtrl, method="parRF")
closeAllConnections()

输出

> library(caret)
> library(doParallel)
> 
> trCtrl <- trainControl(
+   method = "repeatedcv"
+   , number = 2
+   , repeats = 5
+   , allowParallel = TRUE
+ )
> 
> 
> # WORKS
> registerDoParallel(1)
> train(form = Species~., data=iris, trControl = trCtrl, method="parRF")
Parallel Random Forest 

150 samples
  4 predictors
  3 classes: 'setosa', 'versicolor', 'virginica' 

... some more model output, works fine!
> closeAllConnections()
> 
> # FAILS
> registerDoParallel(2)
> train(form = Species~., data=iris, trControl = trCtrl, method="parRF")
Error in train.default(x, y, weights = w, ...) : 
  final tuning parameters could not be determined
In addition: Warning messages:
1: In nominalTrainWorkflow(x = x, y = y, wts = weights, info = trainInfo,  :
  There were missing values in resampled performance measures.
2: In train.default(x, y, weights = w, ...) :
  missing values found in aggregated results
> closeAllConnections()

会话信息

> sessionInfo()
R version 3.1.0 (2014-04-10)
Platform: x86_64-w64-mingw32/x64 (64-bit)

locale:
[1] LC_COLLATE=German_Germany.1252  LC_CTYPE=German_Germany.1252    LC_MONETARY=German_Germany.1252 LC_NUMERIC=C                   
[5] LC_TIME=German_Germany.1252    

attached base packages:
[1] parallel  stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] doParallel_1.0.8   iterators_1.0.7    foreach_1.4.2      e1071_1.6-3        randomForest_4.6-7 caret_6.0-30       ggplot2_1.0.0     
[8] lattice_0.20-29   

loaded via a namespace (and not attached):
 [1] BradleyTerry2_1.0-4 brglm_0.5-9         car_2.0-20          class_7.3-10        codetools_0.2-8     colorspace_1.2-4   
 [7] compiler_3.1.0      digest_0.6.4        gnm_1.0-7           grid_3.1.0          gtable_0.1.2        gtools_3.4.1       
[13] lme4_1.1-6          MASS_7.3-31         Matrix_1.1-3        minqa_1.2.3         munsell_0.4.2       nlme_3.1-117       
[19] nnet_7.3-8          plyr_1.8.1          proto_0.3-10        qvcalc_0.8-8        Rcpp_0.11.2         RcppEigen_0.3.2.1.2
[25] relimp_1.0-3        reshape2_1.4        scales_0.2.4        splines_3.1.0       stringr_0.6.2       tcltk_3.1.0        
[31] tools_3.1.0   

更新

用 3.1.1(相同的包版本)尝试过,结果相同。 用 3.0.2 和一些旧版本的 caret a doParallel 进行了尝试,它工作正常(请参阅会话信息)

会话信息 2:

R version 3.0.2 (2013-09-25)
Platform: x86_64-w64-mingw32/x64 (64-bit)

locale:
[1] LC_COLLATE=German_Germany.1252  LC_CTYPE=German_Germany.1252    LC_MONETARY=German_Germany.1252
[4] LC_NUMERIC=C                    LC_TIME=German_Germany.1252    

attached base packages:
[1] parallel  stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] e1071_1.6-1        class_7.3-9        randomForest_4.6-7 doParallel_1.0.6   iterators_1.0.6   
 [6] caret_5.17-7       reshape2_1.2.2     plyr_1.8           lattice_0.20-24    foreach_1.4.1     
[11] cluster_1.14.4    

loaded via a namespace (and not attached):
[1] codetools_0.2-8 compiler_3.0.2  grid_3.0.2      stringr_0.6.2   tools_3.0.2    

【问题讨论】:

【参考方案1】:

这显然是插入符号 6.0-30 中的一个错误,它是在版本 5.17-7 之后的某个时间引入的。这也是另一个更有可能影响 Windows 用户的问题,因为 doParallel“mclapply 模式”有效,而“clusterApplyLB 模式”失败。

我已经运行了一些测试,看来问题是由于集群工作人员没有正确初始化以执行嵌套并行计算,因此您可以通过在集群工作人员中加载 foreach 包来解决该错误叫“火车”。为此,您需要显式创建集群对象,而不是让“registerDoParallel”函数为您创建它(它在 Windows 上执行)。例如:

cl <- makePSOCKcluster(2)
clusterEvalQ(cl, library(foreach))
registerDoParallel(cl)

我会联系 caret 的作者讨论问题的解决方案。

【讨论】:

以上是关于插入符号上的 parRF 不能用于多个核心的主要内容,如果未能解决你的问题,请参考以下文章

插入符号上的 R xgboost 尝试执行分类而不是回归

React Native Text Input Android 光标/插入符号和文本光标颜色

eplan中元件不能自动连接了怎么办?

如何从 textAngular 工具栏上的自定义按钮插入文本/符号

sh bash插入用于编写脚本的哈希符号

用于树的 train() 函数插入符号中的缺失值错误