Сначала я хотел бы уточнить, что на самом деле измеряет показатель важности.
MeanDecreaseGini - это показатель переменной важности, основанный на индексе примесей Джини, который используется для расчета расщеплений во время тренировки. Распространенным заблуждением является то, что метрика переменной важности относится к Джини, используемому для подтверждения производительности модели, которая тесно связана с AUC, но это неверно. Вот объяснение из пакета randomForest, написанное Брейманом и Катлером:
Важность Джини
Каждый раз, когда деление узла выполняется по переменной m, критерий примеси Джини для двух дочерних узлов меньше, чем родительский узел. Сложение уменьшений джини для каждой отдельной переменной по всем деревьям в лесу дает важность быстрой переменной, которая часто очень согласуется с мерой важности перестановки.
Индекс примеси Джини определяется как
,
где п с является число классов в целевой переменной и р я есть отношение этого класса.
G=∑i=1ncpi(1−pi)
ncpi
Для задачи двух классов это приводит к следующей кривой, которая максимизируется для образца 50-50 и минимизируется для однородных множеств:
Значение вычисляется как
,
усредненное по всем расколов в лесу , связанных с предсказателем в вопросе. Поскольку это среднее значение, оно может быть легко расширено для усреднения по всем расщеплениям по переменным, содержащимся в группе.
I=Gparent−Gsplit1−Gsplit2
Если присмотреться, мы узнаем, что важность каждой переменной - это среднее условие для используемой переменной, а meanDecreaseGini группы будет просто средним значением этих значений, взвешенных для доли, которую эта переменная использует в лесу, по сравнению с другими переменными в той же группе. Это верно, потому что свойство башни
E[E[X|Y]]=E[X]
Теперь, чтобы ответить на ваш вопрос напрямую, это не так просто, как просто суммировать все значения в каждой группе, чтобы получить комбинированный MeanDecreaseGini, но вычисление средневзвешенного значения даст вам ответ, который вы ищете. Нам просто нужно найти переменные частоты в каждой группе.
Вот простой скрипт для получения их из объекта случайного леса в R:
var.share <- function(rf.obj, members) {
count <- table(rf.obj$forest$bestvar)[-1]
names(count) <- names(rf.obj$forest$ncat)
share <- count[members] / sum(count[members])
return(share)
}
Просто передайте имена переменных в группе в качестве параметра members.
Надеюсь, это ответит на ваш вопрос. Я могу написать функцию, чтобы получить значения группы напрямую, если это представляет интерес.
РЕДАКТИРОВАТЬ:
Вот функция, которая дает важность группы для данного randomForest
объекта и список векторов с именами переменных. Он использует var.share
как определено ранее. Я не делал никакой проверки ввода, поэтому вам нужно убедиться, что вы используете правильные имена переменных.
group.importance <- function(rf.obj, groups) {
var.imp <- as.matrix(sapply(groups, function(g) {
sum(importance(rf.obj, 2)[g, ]*var.share(rf.obj, g))
}))
colnames(var.imp) <- "MeanDecreaseGini"
return(var.imp)
}
Пример использования:
library(randomForest)
data(iris)
rf.obj <- randomForest(Species ~ ., data=iris)
groups <- list(Sepal=c("Sepal.Width", "Sepal.Length"),
Petal=c("Petal.Width", "Petal.Length"))
group.importance(rf.obj, groups)
>
MeanDecreaseGini
Sepal 6.187198
Petal 43.913020
Это также работает для перекрывающихся групп:
overlapping.groups <- list(Sepal=c("Sepal.Width", "Sepal.Length"),
Petal=c("Petal.Width", "Petal.Length"),
Width=c("Sepal.Width", "Petal.Width"),
Length=c("Sepal.Length", "Petal.Length"))
group.importance(rf.obj, overlapping.groups)
>
MeanDecreaseGini
Sepal 6.187198
Petal 43.913020
Width 30.513776
Length 30.386706