【发布时间】:2019-09-22 21:56:47
【问题描述】:
问题:有没有办法从randomForest 对象中提取每个单独的 CART 模型的变量重要性?
rf_mod$forest 似乎没有这个信息,the docs 也没有提及。
在 R 的 randomForest 包中,整个 CART 模型森林的平均变量重要性由 importance(rf_mod) 给出。
library(randomForest)
df <- mtcars
set.seed(1)
rf_mod = randomForest(mpg ~ .,
data = df,
importance = TRUE,
ntree = 200)
importance(rf_mod)
%IncMSE IncNodePurity
cyl 6.0927875 111.65028
disp 8.7730959 261.06991
hp 7.8329831 212.74916
drat 2.9529334 79.01387
wt 7.9015687 246.32633
qsec 0.7741212 26.30662
vs 1.6908975 31.95701
am 2.5298261 13.33669
gear 1.5512788 17.77610
carb 3.2346351 35.69909
我们还可以使用getTree 提取单个树结构。这是第一棵树。
head(getTree(rf_mod, k = 1, labelVar = TRUE))
left daughter right daughter split var split point status prediction
1 2 3 wt 2.15 -3 18.91875
2 0 0 <NA> 0.00 -1 31.56667
3 4 5 wt 3.16 -3 17.61034
4 6 7 drat 3.66 -3 21.26667
5 8 9 carb 3.50 -3 15.96500
6 0 0 <NA> 0.00 -1 19.70000
一种解决方法是增长许多 CART(即 - ntree = 1),获取每棵树的变量重要性,然后平均得到的 %IncMSE:
# number of trees to grow
nn <- 200
# function to run nn CART models
run_rf <- function(rand_seed){
set.seed(rand_seed)
one_tr = randomForest(mpg ~ .,
data = df,
importance = TRUE,
ntree = 1)
return(one_tr)
}
# list to store output of each model
l <- vector("list", length = nn)
l <- lapply(1:nn, run_rf)
提取、平均和比较步骤。
# extract importance of each CART model
library(dplyr); library(purrr)
map(l, importance) %>%
map(as.data.frame) %>%
map( ~ { .$var = rownames(.); rownames(.) <- NULL; return(.) } ) %>%
bind_rows() %>%
group_by(var) %>%
summarise(`%IncMSE` = mean(`%IncMSE`)) %>%
arrange(-`%IncMSE`)
# A tibble: 10 x 2
var `%IncMSE`
<chr> <dbl>
1 wt 8.52
2 cyl 7.75
3 disp 7.74
4 hp 5.53
5 drat 1.65
6 carb 1.52
7 vs 0.938
8 qsec 0.824
9 gear 0.495
10 am 0.355
# compare to the RF model above
importance(rf_mod)
%IncMSE IncNodePurity
cyl 6.0927875 111.65028
disp 8.7730959 261.06991
hp 7.8329831 212.74916
drat 2.9529334 79.01387
wt 7.9015687 246.32633
qsec 0.7741212 26.30662
vs 1.6908975 31.95701
am 2.5298261 13.33669
gear 1.5512788 17.77610
carb 3.2346351 35.69909
我希望能够直接从randomForest 对象中提取每棵树的变量重要性,没有这种涉及完全重新运行的迂回方法RF 以便于重现cumulative variable importance plots like this one,下面显示的是mtcars。 Minimal example here。
我知道一棵树的变量重要性在统计上没有意义,我也无意孤立地解释树。我希望它们用于可视化和传达随着森林中树木的增加,可变重要性度量在稳定之前会跳来跳去。
【问题讨论】:
-
您可以检查
tree或rpart是否会接受randomForest构建的树,如果是,请使用这些包中的变量重要性函数。
标签: r machine-learning random-forest