R:组合使用Caret生成的林时的randomForest错误

时间:2016-02-02 13:29:27

标签: r random-forest r-caret

我正在尝试使用randomForest'combow'函数组合R中的多个随机林,但不能使用'caret'包裹包装中的randomForest输出。

返回的对象有“火车”类,而不是“randomForest” - 有什么想法吗?

我不清楚如何在运行插入符号的'train'函数后检索randomForest对象,我相信它应该包含它们。

原因是我在大型数据集上运行分析,太大而无法使用我的硬件运行randomForest。

要管理具有可用内存的数据集,我首先会生成许多较小的森林,然后使用rf“combine”函数将它们组合在一起。结果很好,我想对插入符号的输出做同样的事情。

问题代码的概述(我宁愿使用apply函数而不是循环,但我也不清楚这个例子的应用程序)

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    

1 个答案:

答案 0 :(得分: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))