Importance relative d'un ensemble de prédicteurs dans une classification aléatoire des forêts dans R


31

Je voudrais déterminer l'importance relative des ensembles de variables par rapport à un randomForestmodèle de classification dans R. La importancefonction fournit la MeanDecreaseGinimétrique pour chaque prédicteur individuel - est-ce aussi simple que de les additionner à travers chaque prédicteur d'un ensemble?

Par exemple:

# 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?

Réponses:


46

Je voudrais d'abord clarifier quelle mesure métrique d'importance mesure réellement.

MeanDecreaseGini est une mesure d'importance variable basée sur l'indice d'impureté de Gini utilisé pour le calcul des écarts pendant l'entraînement. Une idée fausse commune est que la métrique d'importance variable fait référence au Gini utilisé pour affirmer les performances du modèle qui est étroitement liée à l'AUC, mais c'est faux. Voici l'explication du package randomForest écrit par Breiman et Cutler:

Importance de Gini
Chaque fois qu'un fractionnement d'un nœud est effectué sur la variable m, le critère d'impureté de Gini pour les deux nœuds descendants est inférieur au nœud parent. L'addition des diminutions de Gini pour chaque variable individuelle sur tous les arbres de la forêt donne une importance variable rapide qui est souvent très cohérente avec la mesure de l'importance de la permutation.

L' indice d'impureté de Gini est défini comme où est le nombre de classes dans la variable cible et est le rapport de cette classe.n c p i

G=i=1ncpi(1pi)
ncpi

Pour un problème à deux classes, il en résulte la courbe suivante qui est maximisée pour l'échantillon 50-50 et minimisée pour les ensembles homogènes: Impureté Gini pour classe 2

L'importance est alors calculée comme moyenne sur toutes les divisions dans la forêt impliquant le prédicteur en question. Comme il s'agit d'une moyenne, elle pourrait facilement être étendue pour être calculée en moyenne sur toutes les répartitions des variables contenues dans un groupe.

I=GparentGsplit1Gsplit2

En y regardant de plus près, nous savons que l'importance de chaque variable est une moyenne conditionnelle à la variable utilisée et la moyenne de la baisse de Gini du groupe ne serait que la moyenne de ces importances pondérées sur la part que cette variable est utilisée dans la forêt par rapport aux autres variables du même groupe. Cela est valable car la propriété tower

E[E[X|Y]]=E[X]

Maintenant, pour répondre directement à votre question, il n'est pas aussi simple que de résumer toutes les importations dans chaque groupe pour obtenir le MeanDecreaseGini combiné, mais le calcul de la moyenne pondérée vous donnera la réponse que vous recherchez. Nous avons juste besoin de trouver les fréquences variables dans chaque groupe.

Voici un script simple pour les obtenir à partir d'un objet de forêt aléatoire dans 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)
}

Saisissez simplement les noms des variables du groupe comme paramètre membres.

J'espère que cela répond à votre question. Je peux écrire une fonction pour obtenir directement les importances du groupe si cela vous intéresse.

EDIT:
Voici une fonction qui donne au groupe l'importance donnée à un randomForestobjet et une liste de vecteurs avec des noms de variables. Il utilise var.sharecomme précédemment défini. Je n'ai effectué aucune vérification d'entrée, vous devez donc vous assurer d'utiliser les bons noms de 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)
}

Exemple d'utilisation:

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

Cela fonctionne également pour les groupes qui se chevauchent:

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

Merci pour la réponse claire et rigoureuse! Si cela ne vous dérange pas d'ajouter une fonction pour les importances de groupe, ce serait bien.
Max Ghenis

Merci pour cette réponse! Deux questions, si vous avez une minute: (1) L'importance est alors calculée comme ... : par rapport à la définition de Breiman, je suis la "diminution de gini" là, et l'importance serait la somme des diminutions, correct ? (2) moyenné sur toutes les divisions dans la forêt impliquant le prédicteur en question : puis-je le remplacer par tous les nœuds impliquant une division sur cette caractéristique particulière ? Pour être sûr de bien comprendre;)
Remi Mélisson

1
Votre commentaire m'a fait réfléchir un peu plus sur les définitions, j'ai donc fouillé le code randomForest utilisé dans R pour y répondre correctement. Pour être honnête, je suis un peu en retrait. La moyenne est faite sur tous les arbres et non sur tous les nœuds. Je mettrai à jour la réponse dès que j'en aurai le temps. Voici les réponses à votre question pour l'instant: (1) oui. C'est ainsi qu'il est défini au niveau de l'arborescence. La somme des diminutions est ensuite moyennée sur tous les arbres. (2) Oui, c'est ce que je voulais dire, mais ça ne tient pas vraiment.
tandis que le

4

La fonction définie ci-dessus comme G = somme sur les classes [pi (1 − pi)] est en fait l'entropie, qui est une autre façon d'évaluer une division. La différence entre l'entropie dans les nœuds enfants et le nœud parent est le gain d'informations. La fonction d'impureté GINI est G = 1-somme sur les classes [pi ^ 2].

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.