Вопрос: Есть ли способ извлечь значение переменной для каждой отдельной модели CART из объекта randomForest
?
rf_mod$forest
, похоже, не имеет этой информации, и в документации не упоминается.
В пакете 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, чтобы упростить воспроизводимые кумулятивные графики важности переменных, подобные этому, и показанному ниже показано для mtcars
. Минимальный пример здесь.
Я знаю, что важность одной переменной дерева не является статистически значимой, и я не намерен интерпретировать деревья изолированно. Я хочу, чтобы они были визуализированы и доведены до сведения, что по мере того, как в лесу растут деревья, переменные меры важности начинают прыгать до стабилизации.