Оценка случайной модели леса, созданной в результате параллельной обработки

Я пытаюсь запустить случайный лес, используя пакет foreach для параллельной обработки. Вот код, который я запускаю.

library(doParallel)
library(doMC)
library(foreach)
library(randomForest)

Train <- read.csv("Train_Parallel.csv")
Test <- read.csv("Test_Parallel.csv")
Scoring <- read.csv("Scoring_Parallel.csv")


cores = detectCores()-1
cl = makeCluster(cores)
registerDoParallel(cl)

startparallel <- Sys.time()
rf_parallel <- foreach(ntree=rep(400, cores), .combine=combine, .multicombine=TRUE,
              .packages='randomForest') %dopar% {
                randomForest(target ~ .,
                             data=Train,
                             importance=TRUE,
                             ntree=ntree,
                             mtry = 25)
              }
endparallel <- Sys.time()
stopCluster(cl)
endparallel - startparallel

Код параллельного выполнения работает должным образом. Однако, когда я запускаю функцию прогнозирования для своего набора данных для обучения и тестирования, я получаю следующую ошибку. Что я делаю неправильно?

> Train$Predicted <- predict(rf_parallel, Train)
Error in UseMethod("predict") : 
  no applicable method for 'predict' applied to an object of class "list"
> Test$Predicted <- predict(rf_parallel, Test)
Error in UseMethod("predict") : 
  no applicable method for 'predict' applied to an object of class "list" 

person Balaji Kesavan    schedule 30.09.2017    source источник
comment
foreach вернет одну случайную модель леса для каждого ядра. Каждая случайная модель леса из каждого ядра возвращается в rf_parallel как элемент списка. Это означает, что rf_parallel - это список (с длиной (num_cores)), где каждый элемент списка является моделью случайного леса. С predict(model, data) ожидается модель, а не список моделей. Например, попробуйте predict(rf_parallel[[1]], Train), и я предполагаю, что это сработает без ошибок. Я предполагаю, что вы неправильно понимаете, что именно вы распараллеливаете.   -  person CPak    schedule 01.10.2017
comment
Спасибо за ответ. Поскольку у меня 4 ядра, строятся 3 (detectCores () - 1) случайные модели леса, каждая из которых имеет ntree = 400. Не следует ли .combine = объединить объединить список в класс random.Forest?   -  person Balaji Kesavan    schedule 01.10.2017
comment
Нет. Посмотрите, что такое rf_parallel, набрав str(rf_parallel). (кстати, я не уверен, как объединять модели, если это вообще возможно. Вы могли бы увидеть, есть ли у сообщества stackoverflow какое-либо представление.)   -  person CPak    schedule 01.10.2017
comment
но тогда в чем смысл параллельной обработки, если я не могу использовать ее для оценки моего набора данных?   -  person Balaji Kesavan    schedule 01.10.2017
comment
это отличный вопрос ...   -  person CPak    schedule 01.10.2017


Ответы (1)


убедитесь, что randomForest :: comb не замаскирован dplyr :: comb или чем-то еще

person Yakov Shchukin    schedule 13.12.2017