1
병렬 처리를 위해 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)'을 시도하면 오류없이 작동 할 것입니다. 제 추측으로는 정확히 병렬화하는 것을 오해하고 있다는 것입니다. – CPak
응답 해 주셔서 감사합니다. 4 코어가 있으므로 각각 ntree = 400을 갖는 3 개의 (detectCores() - 1) 임의의 포리스트 모델이 생성됩니다. ".combine = combine"는 목록을 "random.Forest"의 클래스로 결합하면 안됩니까? –
아니요.'rf_parallel'을 입력하여'str (rf_parallel)'을 입력하십시오. (btw, 심지어 가능한 경우 모델을 병합하는 방법을 잘 모르겠습니다. 당신은 stackoverflow 커뮤니티에 어떤 아이디어가 있는지 볼 수 있습니다.) – CPak