Ошибка параллельной обработки doRedis/foreach GBM в R

Я запускаю модель gbm с использованием пакета caret и пытаюсь заставить ее работать, используя параллельную обработку с пакетом doredis. Я могу заставить всех работающих бэкэндов работать, но у меня возникают проблемы, когда они рекомбинируют в окончательную модель. Я получаю эту ошибку:

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

Я впервые пытаюсь запустить цикл foreach (не говоря уже о сложной проблеме, такой как gbm), и у меня возникают проблемы, пытающиеся понять и реализовать это. Я сделал много поисков в Google и ничего не нашел по реализации foreach с gbm. Любая помощь в понимании 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] и та же ошибка произошла.

1 ответ

Решение

Я нашел ответ на это! Я связался с создателем Redis, который, в свою очередь, связался с создателем Caret. Кажется, карет автоматически обрабатывает задачи, поэтому цикл foreach не нужен. Просто полностью удалите эту строку, и она будет отлично работать.

С другой стороны, он велел мне попросить других пойти на gitihub, чтобы загрузить новейший пакет doRedis, так как он лучше текущего пакета doredis, но не готов для CRAN.

Используйте этот код для установки нового пакета doRedis (обратите внимание, что перед запуском кода убедитесь, что у вас также установлен Rtools)

install.packages("devtools")
devtools::install_github("bwlewis/doRedis")
Другие вопросы по тегам