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")
我正在 运行使用 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")