使用caret进行火车模型的并行执行失败,显示找不到函数。

8

昨天我更新了我的R软件包,自此以后,使用train函数进行并行执行失败。

似乎一些在工作进程内被调用的函数不可用。 至少这些函数是flatTable和probFunction。

我在生产环境的计算机上遇到了这个问题,并且能够在干净的Windows 7 x64 VM上重现它。

我在下面添加了一个最小化的工作示例。亲爱的stackoverflow用户:任何帮助都将不胜感激!

# R 3.0.2 x64, RStudio Version 0.98.490, Windows 7 x64

data(iris)
library(caret) # 6.0-21
library(doParallel) # 1.0.6

model <- "rf"

# Fail
?probFunction
?flatTable

fitControl <- trainControl(
  method = "repeatedcv"
  , number = 5  ## 5-fold CV
  , repeats = 1   ## repeated one times
  , verboseIter =TRUE
)

#### Sequential Version ####

# Runs
train(Species ~ ., data = iris, method = model, trControl = fitControl)

#### Parallelized version ####

# Fails with 
# Error in e$fun(obj, substitute(ex), parent.frame(), e$data) : 
#  worker initialization failed: Error in eval(expr, envir, enclos): could not find function "flatTable"
cl <- makeCluster(3)
registerDoParallel(cl)

train(Species ~ ., data = iris, method = model, trControl = fitControl)

stopCluster(cl)

# Fails with 
# Error in { : task 1 failed - "could not find function "probFunction""
fitControl <- trainControl(
  method = "repeatedcv"
  , number = 5  ## 5-fold CV
  , repeats = 1   ## repeated one times
  , verboseIter =TRUE
  , classProbs = TRUE
)

cl <- makeCluster(3)
registerDoParallel(cl)

train(Species ~ ., data = iris, method = model, trControl = fitControl)

stopCluster(cl)

#### Again sequential version ####

# Fails with
# Error in summary.connection(connection) : invalid connection
train(Species ~ ., data = iris, method = model, trControl = fitControl)

R会话信息

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] foreach_1.4.1      caret_6.0-21       ggplot2_0.9.3.1    lattice_0.20-23  

loaded via a namespace (and not attached):
[1] car_2.0-19         codetools_0.2-8    colorspace_1.2-4   compiler_3.0.2     dichromat_2.0-0  
 [6] digest_0.6.4       grid_3.0.2         gtable_0.1.2       labeling_0.2       MASS_7.3-29      
[11] munsell_0.4.2      nnet_7.3-7         plyr_1.8           proto_0.3-10       RColorBrewer_1.0-5
[16] reshape2_1.2.2     scales_0.2.3       stringr_0.6.2      tools_3.0.2      
2个回答

7
你遇到的错误是由caret 6.0-21在使用doParallel、doSNOW和doMPI时出现了一个bug引起的。该问题已在R-forge的版本6.0-22中修复,但尚未发布到CRAN。如果你不想等待新版本发布,可以采取以下措施:
  1. 降级到caret 5.x
  2. 从R-forge安装caret 6.0-22
  3. 安装并使用来自R-forge的doSNOW 1.0.10而非doParallel
该问题是由CRAN政策变更引起的,禁止使用:::运算符,即使在从同一包中引用未导出函数时也是如此。
更新:
Caret 6.0-22于2014-01-18发布到CRAN。这应该解决使用caret与doSNOW和类似的并行后端报告的问题。

非常感谢。我选择了选项1,即降级。 - Ahue
@Ahue 一旦修复版本上线CRAN,我会更新答案。 - Steve Weston
2
一年多后,我在当前版本的“caret”中遇到了这个问题... `> packageVersion("caret")[1] ‘6.0.41’` - Hack-R
@Hack-R,我刚刚使用caret 6.0.41成功地运行了这个示例。你是否无法运行此示例,或者你在运行稍微不同的示例时遇到了类似的错误? - Steve Weston

1

第一个错误(找不到函数 ...)在较新的版本中消失,如@Steve Weston所建议的那样,但第二个错误(Error in summary.connection(connection) : invalid connection)仍然存在。

使用caret 6.0.84版本,我可以通过将allowParallel = F添加到最后一个顺序运行的trainControl参数来解决它。

问题中代码的最后一部分更改为:

#### Again sequential version (new) ####

fitControl_new <- trainControl(
  method = "repeatedcv"
  , number = 5  
  , repeats = 1   
  , verboseIter =TRUE
  , classProbs = TRUE
  , allowParallel = F     ## add this argument to overwrite the default TRUE
)

train(Species ~ ., data = iris, method = model, trControl = fitControl_new)


谢谢 - 我也遇到了同样的问题,你的解决方案立刻帮了我 :) - salix_august

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接