2016-02-02 4 views
2

Я пытаюсь объединить несколько случайных лесов в R, используя функцию randomroom «comb», но не могу сделать этого с помощью вывода randomforest из оболочки пакета «caret».R: randomForest error при объединении леса, созданного с использованием Caret

Возвращаемый объект имеет класс «поезд», а не «randomForest» - любые идеи, пожалуйста?

Непонятно, как восстановить объекты randomForest после выполнения функции «train» каретки, которая, как я полагаю, должна содержать их.

Причина в том, что я выполняю анализ на большом наборе данных, слишком большой для запуска randomForest с моим оборудованием.

Чтобы управлять набором данных с доступной памятью, я сначала создал много меньших лесов, а затем объединил их, используя функцию «комбинирование» rf. Результаты хорошие, и я хочу сделать то же самое с выходами из каретки.

Наброски проблемного кода (я предпочел бы использовать функцию применить, чем цикл, но я также не ясно о применении к этому примеру)

trainData.Slices <- list() #My data is 'sliced' into manageable pieces, each one being run through randomForest individually before being recombined 
trainData.Slices[[1]] <-data.frame("y.val" = runif(1000, 0, 1), pred1 = runif(1000, 1, 5), pred1 = runif(1000, 10, 20)) 
trainData.Slices[[2]] <- data.frame("y.val" = runif(1000, 0, 1), pred1 = runif(1000, 1, 5), pred1 = runif(1000, 10, 20)) 
trainData.Slices[[3]] <- data.frame("y.val" = runif(1000, 0, 1), pred1 = runif(1000, 1, 5), pred1 = runif(1000, 10, 20)) 


slicesRun <- length(trainData.Slices) #Specify how many slices to cut the data into for individual processing 
forestList <- list() #The list into which each small forest will be added 
nVar <- length(trainData.Slices[[1]]) 


for (i in 1:slicesRun) { 
trainData <- trainData.Slices[[i]] 

#The standard randomForest code works perfectly 
forestList[[i]] <- randomForest(x=trainData[,-1], y=trainData[,1],ntree=200, importance=TRUE, proximity=TRUE) 
print(class(forestList[[i]])) 

#caret is returning 'train' objects rather than randomForest objects 
forestList_caret[[i]] <- train(y=trainData[,1], x=trainData[,-1], method="rf", trControl=trainControl(method="cv", number=5), prox=TRUE, allowParallel=TRUE) 
print(class(forestList_caret[[i]])) 
#How can the rf objects be returned instead, or train objects combined? 

} 


rf.all <- do.call("combine",forestList) #Combine the forests into one 
rf.all_caret <- do.call("combine",forestList) #Combine the forests into one  
+2

Добро пожаловать на Stack Overflow - см [этот FAQ] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) для советов по предоставлению воспроизводимого примера. – nrussell

+0

Спасибо nrussel. Редактирование сейчас. – Jernau

ответ

1

Я также имел эту проблему и нашел следующее от этого поста: Error when using predict() on a randomForest object trained with caret's train() using formula

Объект randomForest находится в $finalModel, поэтому forestList_caret[[i]]$finalModel в вашем примере. Ваш код работает со следующими изменениями:

линии 8 до forestList <- forestList_caret <- list()

линия 28 для rf.all_caret <- do.call("combine",forestList_caret)

Вставить после строки 22:

forestList_caret[[i]] <- forestList_caret[[i]]$finalModel print(class(forestList_caret[[i]]))

, хранящую $finalModel объект позволяет вам могут комбинировать их в конце, а результатом является объект с классом randomForest. Проверьте с:

print(class(rf.all_caret))

Смежные вопросы