Я пытаюсь запустить случайный лес, используя пакет 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"
foreach
вернет одну случайную модель леса для каждого ядра. Каждая случайная модель леса из каждого ядра возвращается вrf_parallel
как элемент списка. Это означает, чтоrf_parallel
- это список (с длиной (num_cores)), где каждый элемент списка является моделью случайного леса. Сpredict(model, data)
ожидается модель, а не список моделей. Например, попробуйтеpredict(rf_parallel[[1]], Train)
, и я предполагаю, что это сработает без ошибок. Я предполагаю, что вы неправильно понимаете, что именно вы распараллеливаете. - person CPak   schedule 01.10.2017rf_parallel
, набравstr(rf_parallel)
. (кстати, я не уверен, как объединять модели, если это вообще возможно. Вы могли бы увидеть, есть ли у сообщества stackoverflow какое-либо представление.) - person CPak   schedule 01.10.2017