1

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

    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]并发生相同的错误。

4

1 回答 1

0

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

在旁注中,他指示我告诉其他人去 github 下载最新的 doRedis 包,因为它比当前的 doredis 包更好,但还没有为 CRAN 做好准备。

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

install.packages("devtools")
devtools::install_github("bwlewis/doRedis")
于 2015-10-22T17:12:26.540 回答