Importanza relativa di una serie di predittori in una classificazione casuale delle foreste in R


31

Vorrei determinare l'importanza relativa degli insiemi di variabili verso un randomForestmodello di classificazione in R. La importancefunzione fornisce la MeanDecreaseGinimetrica per ogni singolo predittore - è semplice come sommare questo attraverso ciascun predittore in un insieme?

Per esempio:

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

Risposte:


46

Innanzi tutto, vorrei chiarire quale sia la misura di importanza effettivamente misurata.

MeanDecreaseGini è una misura di importanza variabile basata sull'indice di impurità di Gini utilizzato per il calcolo delle divisioni durante l'allenamento. Un malinteso comune è che la metrica di importanza variabile si riferisce al Gini utilizzato per affermare le prestazioni del modello che è strettamente correlato all'AUC, ma questo è sbagliato. Ecco la spiegazione del pacchetto randomForest scritto da Breiman e Cutler:

Importanza di Gini
Ogni volta che viene effettuata una divisione di un nodo sulla variabile m il criterio di impurità gini per i due nodi discendenti è inferiore al nodo principale. Sommare i gini diminuisce per ogni singola variabile su tutti gli alberi della foresta dà un'importanza variabile rapida che è spesso molto coerente con la misura dell'importanza della permutazione.

L' indice di impurità di Gini è definito come Dove è il numero di classi nella variabile target e è il rapporto di questa classe.n c p i

G=i=1ncpi(1pi)
ncpi

Per un problema di due classi, questo porta alla seguente curva che è massimizzata per il campione 50-50 e minimizzata per i set omogenei: Impurità di Gini per 2 classi

L'importanza viene quindi calcolata come mediata su tutte le suddivisioni nella foresta che coinvolgono il predittore in questione. Dato che si tratta di una media, potrebbe essere facilmente estesa per essere mediata su tutte le divisioni sulle variabili contenute in un gruppo.

I=GparentGsplit1Gsplit2

Guardando più da vicino sappiamo che ogni importanza di una variabile è una condizione media rispetto alla variabile utilizzata e la media di riduzione del gruppo sarebbe solo la media di queste importanze ponderate sulla condivisione che questa variabile viene utilizzata nella foresta rispetto alle altre variabili dello stesso gruppo. Ciò vale perché la proprietà della torre

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

Ora, per rispondere alla tua domanda direttamente, è non è così semplice come solo riassumendo tutti importanze in ogni gruppo per ottenere la combinazione MeanDecreaseGini ma il calcolo della media ponderata ti porterà la risposta che state cercando. Dobbiamo solo trovare le frequenze variabili all'interno di ciascun gruppo.

Ecco un semplice script per ottenerli da un oggetto foresta casuale in 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 passare i nomi delle variabili nel gruppo come parametro membri.

Spero che questo risponda alla tua domanda. Posso scrivere una funzione per ottenere direttamente le importazioni del gruppo se è di interesse.

EDIT:
ecco una funzione che dà importanza al gruppo dato un randomForestoggetto e un elenco di vettori con nomi di variabili. Utilizza var.sharecome precedentemente definito. Non ho eseguito alcun controllo di input, quindi è necessario assicurarsi di utilizzare i nomi delle variabili corretti.

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

Esempio di utilizzo:

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

Funziona anche con gruppi sovrapposti:

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

Grazie per la risposta chiara e rigorosa! Se non ti dispiacerebbe aggiungere una funzione per le importazioni di gruppo, sarebbe fantastico.
Max Ghenis,

Grazie per la risposta! Due domande, se hai un minuto: (1) L'importanza viene quindi calcolata come ... : rispetto alla definizione di Breiman, I è la "diminuzione del gini" lì, e l'importanza sarebbe la somma delle diminuzioni, corretta ? (2) mediata su tutte le suddivisioni nella foresta che coinvolgono il predittore in questione : posso sostituirlo con tutti i nodi che implicano una suddivisione su quella particolare caratteristica ? A dire il
vero

1
Il tuo commento mi ha fatto riflettere un po 'di più sulle definizioni, quindi ho analizzato il codice randomForest utilizzato in R per rispondere correttamente. Sono stato leggermente fuori per essere sincero. La media viene calcolata su tutti gli alberi e non su tutti i nodi. Aggiornerò la risposta non appena avrò tempo per farlo. Ecco le risposte alla tua domanda per ora: (1) sì. Ecco come viene definito a livello di albero. La somma delle diminuzioni viene quindi mediata su tutti gli alberi. (2) Sì, era quello che volevo dire, ma non è vero.
mentre il

4

La funzione sopra definita come G = somma sulle classi [pi (1 − pi)] è in realtà l'entropia, che è un altro modo di valutare una divisione. La differenza tra l'entropia nei nodi figlio e il nodo padre è il Guadagno delle informazioni. La funzione di impurità GINI è G = 1- somma sulle classi [pi ^ 2].

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.