doRedis/foreach R 中的 GBM 并行处理错误

doRedis/foreach GBM parallel processing error in R

我正在 运行使用 caret 包创建一个 gbm 模型,并尝试使用 doredis 包的并行处理使其工作。我可以让后端工作人员全部启动 运行ning,但是当他们重新组合成最终模型时我遇到了问题。我收到此错误:

    Error in foreach(j = 1:12, .combine = sum, .multicombine = TRUE) %dopar%  : 
      target of assignment expands to non-language object

这是我第一次尝试 运行 foreach 循环(更不用说像 gbm 这样的复杂问题了)并且在尝试理解和实现它时遇到了问题。我进行了很多 Google 搜索,但没有找到关于使用 gbm 实现 foreach 的任何内容,如果您能帮助我理解 foreach,我们将不胜感激。这是我的代码:

    set.seed(825)
    library(caret)
    require(foreign)

    data <- read.spss("C:\Users\cc\Documents\mydata.sav",use.value.labels=TRUE, to.data.frame = TRUE)
    getOption("max.print")
    options(max.print = 99999999)
    set.seed(825)
    start.time <- Sys.time()
    x <- data[, -162]
    y <- data[, 162]
    fitControl = trainControl(method = "cv", number = 8,  allowParallel=TRUE)
     gbmGrid <-  expand.grid(interaction.depth = c(49), n.trees = (1:2), shrinkage = c(0.03), n.minobsinnode = 50)


    require(doRedis)
    registerDoRedis('jobs')
    options('redis:num'=TRUE)
    foreach(j=1:12,.combine=sum,.multicombine=TRUE) %dopar%

    gbmFit <- train(x=x,y=y,"gbm", tuneGrid = gbmGrid, trControl=fitControl)
    gbmFit
    summary(gbmFit)

    end.time <- Sys.time()
    time.taken <- end.time - start.time
    time.taken

更新 根据关于使用某种数据集进行复制的建议,我将 mydata 切换为 Iris 数据集 data <- iris 并将 X 和 Y 更改为 x <- data[, -5] y <- data[, 5] 并且发生了同样的错误。

我找到了答案!我与redis的创建者取得了联系,而redis的创建者又与caret的创建者取得了联系。似乎插入符号会自动处理拆分作业,因此不需要 foreach 循环。只需完全删除该行,它就会完美运行。

附带一提,他指示我告诉其他人去 gitihub 下载最新的 doRedis 包,因为它比当前的 doredis 包更好,但不要为 CRAN 退出做好准备。

使用此代码安装新的 doRedis 包(请注意确保您在 运行 代码之前也安装了 Rtools

install.packages("devtools")
devtools::install_github("bwlewis/doRedis")