Relative Bedeutung einer Reihe von Prädiktoren in einer zufälligen Waldklassifikation in R

31

Ich möchte die relative Bedeutung von Variablensätzen für ein randomForestKlassifizierungsmodell in R bestimmen . Die importanceFunktion liefert die MeanDecreaseGiniMetrik für jeden einzelnen Prädiktor. Ist es so einfach, diese über jeden Prädiktor in einem Satz zu summieren?

Beispielsweise:

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

Antworten:

46

Zunächst möchte ich klären, welche Bedeutung die Metrik tatsächlich misst.

MeanDecreaseGini ist ein Maß für die variable Bedeutung, das auf dem Gini-Verunreinigungsindex basiert, der für die Berechnung der Aufteilungen während des Trainings verwendet wird. Ein weit verbreitetes Missverständnis ist, dass sich die Variable-Wichtigkeit-Metrik auf die Gini bezieht, die zur Behauptung der Modellleistung verwendet wird, die in engem Zusammenhang mit der AUC steht. Dies ist jedoch falsch. Hier ist die Erklärung aus dem randomForest-Paket von Breiman und Cutler:

Gini-Wichtigkeit
Jedes Mal, wenn eine Aufteilung eines Knotens auf die Variable m vorgenommen wird, ist das Gini-Verunreinigungskriterium für die beiden untergeordneten Knoten kleiner als der übergeordnete Knoten. Addiert man die Gini-Abnahmen für jede einzelne Variable über alle Bäume im Wald, ergibt sich eine schnelle Variablenbedeutung, die häufig sehr gut mit dem Permutationsbedeutungsmaß übereinstimmt.

Der Gini-Verunreinigungsindex ist definiert als Wobei die Anzahl der Klassen in der Zielvariablen ist und das Verhältnis dieser Klasse ist.

G=ich=1ncpich(1-pich)
ncpich

Für ein Zweiklassenproblem ergibt sich die folgende Kurve, die für die 50-50-Stichprobe maximiert und für die homogenen Sätze minimiert wird: Gini Verunreinigung für 2 Klasse

Die Wichtigkeit wird dann berechnet als gemittelt über alle Splits in der denen der fragliche Prädiktor beteiligt ist. Da dies ein Durchschnitt ist, kann er leicht erweitert werden, um über alle Aufteilungen von Variablen in einer Gruppe gemittelt zu werden.

ich=Gpeinrent-Gsplicht1-Gsplicht2

Wenn wir genauer hinschauen, wissen wir, dass jede Variablenbedeutung eine Durchschnittsbedingung für die verwendete Variable ist, und der Mittelwert von MeanDecreaseGini der Gruppe wäre nur der Mittelwert dieser Wichtigkeit, gewichtet auf den Anteil, den diese Variable im Gesamtwald im Vergleich zu den anderen Variablen in derselben Gruppe verwendet. Dies gilt, weil die Tower-Eigenschaft

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

Um Ihre Frage direkt zu beantworten, ist es nicht so einfach, alle Wichtigkeiten in jeder Gruppe zu summieren, um den kombinierten MeanDecreaseGini zu erhalten. Durch Berechnen des gewichteten Durchschnitts erhalten Sie jedoch die Antwort, nach der Sie suchen. Wir müssen nur die variablen Frequenzen innerhalb jeder Gruppe finden.

Hier ist ein einfaches Skript, um diese von einem zufälligen Gesamtstrukturobjekt in R abzurufen:

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)
}

Übergeben Sie einfach die Namen der Variablen in der Gruppe als member-Parameter.

Ich hoffe das beantwortet deine Frage. Ich kann eine Funktion schreiben, um die Gruppenbedeutungen direkt zu erhalten, wenn es von Interesse ist.

BEARBEITEN:
Hier ist eine Funktion, die der Gruppe die Wichtigkeit eines randomForestObjekts und einer Liste von Vektoren mit Variablennamen gibt. Es wird var.sharewie zuvor definiert verwendet. Ich habe keine Eingabeüberprüfung durchgeführt, daher müssen Sie sicherstellen, dass Sie die richtigen Variablennamen verwenden.

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)
}

Anwendungsbeispiel:

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

Es funktioniert auch für überlappende Gruppen:

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
während
quelle
Vielen Dank für die klare und strenge Antwort! Wenn es Ihnen nichts ausmacht, eine Funktion für Gruppenbedeutungen hinzuzufügen, wäre das großartig.
Max Ghenis
Danke für diese Antwort! Zwei Fragen, wenn Sie eine Minute Zeit haben: (1) Die Wichtigkeit wird dann wie folgt berechnet : In Bezug auf die Breiman-Definition ist ich dort die "Gini-Abnahme", und die Wichtigkeit wäre die Summe der Abnahmen, richtig ? (2) Gemittelt über alle Teilungen in der Gesamtstruktur, an denen der betreffende Prädiktor beteiligt ist : Kann ich dies durch alle Knoten ersetzen, an denen eine Teilung für dieses bestimmte Feature beteiligt ist ? Um sicher zu sein, ich verstehe voll und ganz;)
Remi Mélisson
1
Ihr Kommentar brachte mich dazu, ein bisschen mehr über die Definitionen nachzudenken, also habe ich den in R verwendeten randomForest-Code durchgesehen, um die Frage richtig zu beantworten. Ich war ehrlich gesagt ein bisschen abgeneigt. Der Durchschnitt wird über alle Bäume und nicht über alle Knoten gebildet. Ich werde die Antwort aktualisieren, sobald ich Zeit dafür habe. Hier sind die Antworten auf Ihre Frage: (1) Ja. So wird es auf Baumebene definiert. Die Summe der Abnahmen wird dann über alle Bäume gemittelt. (2) Ja, das wollte ich sagen, aber es hält nicht wirklich.
während
4

Die oben als G = Summe über Klassen [pi (1 - pi)] definierte Funktion ist tatsächlich die Entropie, die eine andere Methode zur Bewertung einer Teilung darstellt. Der Unterschied zwischen der Entropie in untergeordneten Knoten und dem übergeordneten Knoten ist der Informationsgewinn. Die GINI-Verunreinigungsfunktion ist G = 1-Summe über Klassen [pi ^ 2].

Sowmya Iyer
quelle