我一直在使用forestFloor
包来可视化随机森林模型结构。在我尝试对forestFloor()
包中的随机林输出使用caret
之前,一切都很顺利。我需要使用caret
代替randomForest
作为我的数据集,因为我有严重不平衡的类,所以使用SMOTE采样策略。我修了几件事,将keep.inbag=TRUE
和keep.forest=TRUE
传递到caret::train
,然后找到隐藏在randomForest
类对象中的train
对象,{{1} }。
我仍然收到错误:
$finalModel
请参阅以下最小工作示例,摘自Error in eval(substitute(expr), envir, enclos) : index out of bounds
中的Pima Indians糖尿病数据集。提前谢谢!
mlbench
答案 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])