36 votos

Importancia relativa de un conjunto de predictores en una clasificación aleatoria de bosques en R

Me gustaría determinar la importancia relativa de los conjuntos de variables hacia una randomForest modelo de clasificación en R. El importance La función proporciona la MeanDecreaseGini para cada predictor individual ¿es tan simple como sumar esto a través de cada predictor en un conjunto?

Por ejemplo:

# Assumes df has variables a1, a2, b1, b2, and outcome
rf <- randomForest(outcome ~ ., data=df)
importance(rf)
# To determine whether the "a" predictors are more important than the "b"s,
# can I sum the MeanDecreaseGini for a1 and a2 and compare to that of b1+b2?

53voto

user17481 Puntos 425

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: Gini impurity for 2 class

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

0 votos

Gracias por la respuesta clara y rigurosa. Si no te importa añadir una función para la importación de grupos, sería genial.

0 votos

Gracias por la respuesta. Dos preguntas, si tienes un minuto : (1) La importancia se calcula entonces como... con respecto a la definición de Breiman, I es la "disminución de gini" allí, y la importancia sería la suma de las disminuciones, ¿correcto? (2) promediado sobre todas las divisiones del bosque que incluyen el predictor en cuestión : ¿Puedo sustituir esto por todos los nodos que implican una división en esa característica particular ? Para estar seguro de que lo entiendo perfectamente ;)

3 votos

Tu comentario me ha hecho pensar un poco más en las definiciones así que he escarbado en el código de randomForest utilizado en R para responder adecuadamente. La verdad es que me he equivocado un poco. La media se hace sobre todos los árboles y no sobre todos los nodos. Actualizaré la respuesta en cuanto tenga tiempo para ello. Aquí están las respuestas a tu pregunta por ahora: (1) Sí. Así es como se define a nivel de árbol. La suma de las disminuciones se promedia luego en todos los árboles. (2) Sí, eso es lo que quería decir, pero en realidad no se sostiene.

4voto

Mark Adler Puntos 129

La función definida anteriormente como G=suma sobre clases[pi(1pi)] es en realidad la entropía, que es otra forma de evaluar una división. La diferencia entre la entropía de los nodos hijos y el nodo padre es la ganancia de información. La función de impureza GINI es G = 1- suma sobre clases[pi^2].

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X