如何在caret包的randomForest输出上使用forestFloor()?

时间:2017-01-12 04:01:12

标签: r random-forest r-caret

我一直在使用forestFloor包来可视化随机森林模型结构。在我尝试对forestFloor()包中的随机林输出使用caret之前,一切都很顺利。我需要使用caret代替randomForest作为我的数据集,因为我有严重不平衡的类,所以使用SMOTE采样策略。我修了几件事,将keep.inbag=TRUEkeep.forest=TRUE传递到caret::train,然后找到隐藏在randomForest类对象中的train对象,{{1} }。

我仍然收到错误: $finalModel

请参阅以下最小工作示例,摘自Error in eval(substitute(expr), envir, enclos) : index out of bounds中的Pima Indians糖尿病数据集。提前谢谢!

mlbench

1 个答案:

答案 0 :(得分:0)

在Soren的帮助下解决了这个问题:https://github.com/sorhawell/forestFloor/issues/22

解释Soren:问题在于caret版本的SMOTE重新采样训练数据并将其保存在其他地方(?)。要估算要素贡献,您需要将与训练时使用的相同数据集(X)传递给forestFloor。使用forestFloor的特征贡献计算依赖于袋外采样和inbag矩阵以匹配提供的训练集。

修复:可以使用SMOTE包中的DMwR功能,而不是在caret包中使用SMOTE。 DMwR::SMOTE会返回重新抽样的培训数据,然后您可以将其放入randomForest然后forestFloor

library(randomForest)
library(DMwR)
library(forestFloor)
# covar = names of covariate/feature column names (character vector)
# target = response column names (character)
X <- cbind(dat[,covar], factor(dat[,target]))
names(X) <- c(covar, target)
bin.formula <- formula(paste0(target," ~ ",paste0(covar,collapse=" + ")))
X.SMOTE <- SMOTE(bin.formula, data=X, k=5)
rf.SMOTE <- randomForest(x=X.SMOTE[,covar], y=X.SMOTE[,target], keep.inbag=T, ...)
ff.bin = forestFloor(rf.fit = rf.SMOTE, X = X.SMOTE[,covar])