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 = ∑i = 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:
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= Gp a r e n t- Gs p l i t 1- Gs p l i t 2
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 randomForest
Objekts und einer Liste von Vektoren mit Variablennamen gibt. Es wird var.share
wie 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