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 = 1ncpio( 1 - pio)
ncpio
Per un problema di due classi, questo porta alla seguente curva che è massimizzata per il campione 50-50 e minimizzata per i set omogenei:
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.
io= Gp a r e n t- Gs p l i t 1- Gs p l i t 2
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 randomForest
oggetto e un elenco di vettori con nomi di variabili. Utilizza var.share
come 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