Primero, quisiera aclarar qué mide realmente la métrica de importancia.
MeanDecreaseGini es una medida de importancia variable basada en el índice de impurezas de Gini utilizado para el cálculo de divisiones durante el entrenamiento. Un error común es que la métrica de importancia variable se refiere al Gini utilizado para afirmar el rendimiento del modelo que está estrechamente relacionado con AUC, pero esto es incorrecto. Aquí está la explicación del paquete randomForest escrito por Breiman y Cutler:
Importancia de Gini
Cada vez que se realiza una división de un nodo en la variable m, el criterio de impureza de Gini para los dos nodos descendientes es menor que el nodo principal. Sumar las disminuciones de gini para cada variable individual sobre todos los árboles en el bosque da una importancia variable rápida que a menudo es muy consistente con la medida de importancia de permutación.
El índice de impureza de Gini se define como
Donde es el número de clases en la variable objetivo y es la relación de esta clase.n c
G=∑i=1ncpi(1−pi)
ncpi
Para un problema de dos clases, esto da como resultado la siguiente curva que se maximiza para la muestra 50-50 y se minimiza para los conjuntos homogéneos:
La importancia se calcula como
promediado sobre todas las divisiones en el bosque que involucran el predictor en cuestión. Como este es un promedio, podría extenderse fácilmente para promediar todas las divisiones en variables contenidas en un grupo.
I=Gparent−Gsplit1−Gsplit2
Mirando más de cerca, sabemos que la importancia de cada variable es un promedio condicional de la variable utilizada y la mediaDecreaseGini del grupo solo sería la media de estas importancias ponderadas en la participación que esta variable se utiliza en el bosque en comparación con las otras variables en el mismo grupo. Esto se cumple porque la propiedad de la torre
E[E[X|Y]]=E[X]
Ahora, para responder a su pregunta directamente, es no tan simple como resumiendo todas las importancias en cada grupo para obtener el MeanDecreaseGini combinado, pero el cálculo de la media ponderada te llevará a la respuesta que busca. Solo necesitamos encontrar las frecuencias variables dentro de cada grupo.
Aquí hay un script simple para obtenerlos de un objeto de bosque aleatorio en 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)
}
Simplemente pase los nombres de las variables en el grupo como parámetro de miembros.
Espero que esto responda tu pregunta. Puedo escribir una función para obtener las importancias del grupo directamente si es de interés.
EDITAR:
Aquí hay una función que le da importancia al grupo dado un randomForest
objeto y una lista de vectores con nombres de variables. Utiliza var.share
como se definió previamente. No he realizado ninguna comprobación de entrada, por lo que debe asegurarse de usar los nombres de variable correctos.
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)
}
Ejemplo de uso:
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
También funciona para grupos superpuestos:
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