En primer lugar, me gustaría aclarar qué mide realmente la métrica de la importancia.
MediaDisminuciónGini es una medida de la importancia de las variables basada en el índice de impureza de Gini utilizado para el cálculo de las divisiones durante el entrenamiento. Un error común es pensar que la métrica de importancia de la variable se refiere al Gini utilizado para afirmar el rendimiento del modelo, que está estrechamente relacionado con el AUC, pero esto es erróneo. 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 padre. Sumando las disminuciones de gini para cada variable individual sobre todos los árboles del bosque se obtiene una importancia rápida de la variable que suele ser muy coherente con la medida de importancia de la permutación.
El Índice de impureza Gini se define como $$ G = \sum_{i=1}^{n_c} p_i(1-p_i) $$ Dónde $n_c$ es el número de clases en la variable de destino y $p_i$ es la proporción de esta clase.
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 entonces como $$ I = G_{parent} - G_{split1} - G_{split2} $$ promediado sobre todas las divisiones del bosque que incluyen el predictor en cuestión. Como se trata de una media, podría ampliarse fácilmente para promediar todas las divisiones de las variables contenidas en un grupo.
Mirando más de cerca sabemos que la importancia de cada variable es una media condicionada a la variable utilizada y la mediaDecreaseGini del grupo sería simplemente la media de estas importancias ponderada en la parte que esta variable se utiliza en el bosque en comparación con las otras variables del mismo grupo. Esto es así porque la propiedad de la torre $$ \mathbb{E}[\mathbb{E}[X|Y]] = \mathbb{E}[X] $$
Ahora, para responder directamente a su pregunta es no tan sencillo como sumar todas las importancias de cada grupo para obtener el Gini medio combinado, pero calculando la media ponderada obtendremos la respuesta que buscamos. Sólo tenemos que encontrar las frecuencias de las variables dentro de cada grupo.
Aquí hay un simple script para obtener estos 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)
}
Basta con pasar los nombres de las variables del grupo como parámetro de los miembros.
Espero que esto responda a su pregunta. Puedo escribir una función para obtener las importaciones del grupo directamente si es de interés.
EDITAR:
Aquí hay una función que da la importancia del grupo dada una randomForest
y una lista de vectores con nombres de variables. Utiliza var.share
como se ha definido anteriormente. No he realizado ninguna comprobación de entrada, por lo que debes asegurarte de que utilizas los nombres correctos de las variables.
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