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

31

Me gustaría determinar la importancia relativa de los conjuntos de variables para un randomForestmodelo de clasificación en R. La importancefunción proporciona la MeanDecreaseGinimétrica para cada predictor individual: ¿es tan simple como sumar esto en cada predictor de 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?
Max Ghenis
fuente

Respuestas:

46

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(1pi)
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: Impureza de Gini para 2 clases

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=GparentGsplit1Gsplit2

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 randomForestobjeto y una lista de vectores con nombres de variables. Utiliza var.sharecomo 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
mientras
fuente
¡Gracias por la respuesta clara y rigurosa! Si no le importa agregar una función para las importancias grupales, sería genial.
Max Ghenis
Gracias por esa respuesta! Dos preguntas, si tiene 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 en el bosque que involucran el predictor en cuestión : ¿Puedo reemplazar esto por todos los nodos que involucren una división en esa característica en particular ? Para estar seguro, entiendo completamente;)
Remi Mélisson
1
Tu comentario me hizo pensar un poco más en las definiciones, así que busqué el código randomForest utilizado en R para responderlo correctamente. He estado un poco apagado para ser honesto. El promedio se realiza sobre todos los árboles y no todos los nodos. Actualizaré la respuesta tan pronto como tenga tiempo. Aquí están las respuestas a su pregunta por ahora: (1) sí. Así es como se define a nivel de árbol. La suma de las disminuciones se promedia sobre todos los árboles. (2) Sí, eso era lo que quería decir, pero en realidad no se cumple.
mientras que el
4

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

Sowmya Iyer
fuente