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(1−pi)
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:
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=Gparent−Gsplit1−Gsplit2
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 randomForest
objet et une liste de vecteurs avec des noms de variables. Il utilise var.share
comme 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