我想创建一个用于对数据建模的循环,获取变量的重要性,分配负值/重要性列,并从数据中进行过滤,然后再次对其进行建模,直到没有负值为止。在下面,您可以看到用于创建模型和获得变量重要性的示例代码:
library(party)
library(caret)
model_cforest <- cforest(drat~.,data=mtcars,controls=cforest_unbiased())
cforest_var <- varImp(model_cforest,conditional=TRUE)
我们可以看到 cforest_var 给出了此表:
Overall
mpg 0.009778909
cyl 0.033507134
disp 0.056359569
hp 0.000000000
wt 0.044186730
qsec 0.000000000
vs -0.000309504
am 0.050791540
gear 0.060967894
carb 0.000000000
在此表的基础上,我想删除列 vs (具有负值)并再次运行cforest
模型(如果再次存在负值,则删除并运行模型,直到没有负值)。
最终结果应该是包含最重要变量的表。
据我所知:
removeNeg <- function(data){
model_cforest <- cforest(drat~., mtcars,controls=cforest_unbiased())
cforest_var <- varImp(model_cforest,conditional=TRUE)
varImp_neg <- row.names(cforest_var)[apply(cforest_var, 1, function(u) any(u < 0))]
}
但是我感觉方向不对,只能停留在一个地方。谢谢帮助!
答案 0 :(得分:2)
使用loop
时使用的解决方案
对给定数据运行cforest
模型的功能:
getForest <- function(data) {
library(caret)
library(party)
model_cforest <- cforest(drat ~ ., data, controls = cforest_unbiased())
varImp(model_cforest, conditional = TRUE)
}
如果有任何负while
结果,则运行varImp
循环的函数。
getForestRemove <- function(data = mtcars) {
resultModel <- getForest(data)
resultSign <- sign(resultModel$Overall)
while(any(resultSign == -1)) {
resultModel <- getForest(data[c("drat", rownames(resultModel)[resultSign != -1])])
resultSign <- sign(resultModel$Overall)
}
return(resultModel)
}
getForestRemove()
# No negative results
# Overall
# mpg 0.006325008
# cyl 0.019562726
# disp 0.050269930
# wt 0.065210330
# qsec 0.000000000
# am 0.041387607
# gear 0.085664931
# carb 0.000000000
答案 1 :(得分:1)
您可以使用recursion
来调用自身内部的函数以再次执行操作
removeNeg <- function(dat){
model_cforest <- cforest(drat~., data=dat,controls=cforest_unbiased())
cforest_var <- varImp(model_cforest,conditional=TRUE)
varImp_neg <- rownames(cforest_var)[cforest_var$Overall<0];varImp_neg
if(length(varImp_neg)) removeNeg(dat[setdiff(names(dat),varImp_neg)])
else cforest_var
}
removeNeg(mtcars)
Overall
mpg 0.008729557
cyl 0.017711035
disp 0.052728670
hp 0.000000000
wt 0.069339311
qsec 0.000000000
am 0.038151787
gear 0.073904189
carb 0.000000000