Primeiro, eu gostaria de esclarecer qual a métrica de importância realmente mede.
MeanDecreaseGini é uma medida de importância variável com base no índice de impureza de Gini usado para o cálculo de divisões durante o treinamento. Um equívoco comum é que a métrica de importância variável se refere ao Gini usado para afirmar o desempenho do modelo que está intimamente relacionado à AUC, mas isso está errado. Aqui está a explicação do pacote randomForest escrito por Breiman e Cutler:
Importância de Gini
Toda vez que uma divisão de um nó é feita na variável m, o critério de impureza de gini para os dois nós descendentes é menor que o nó pai. A soma das diminuições de gini para cada variável individual em todas as árvores da floresta fornece uma importância variável rápida que geralmente é muito consistente com a medida de importância da permutação.
O índice de impureza Gini é definido como
Onde é o número de classes na variável de destino e é a razão dessa classe.
G = ∑i = 1ncpEu( 1 - pEu)
ncpEu
Para um problema de duas classes, isso resulta na seguinte curva que é maximizada para a amostra 50-50 e minimizada para os conjuntos homogêneos:
A importância é então calculada como
calculada a média sobre todas as divisões na floresta que envolvem o preditor em questão. Como essa é uma média, ela pode ser facilmente estendida para ser calculada a média de todas as divisões nas variáveis contidas em um grupo.
Eu= Gp a r e n t- Gs p l i t 1- Gs p l i t 2
Olhando mais de perto, sabemos que a importância de cada variável é uma condição condicional à variável usada e a médiaDez decréscimoGini do grupo seria apenas a média dessas importâncias ponderadas no compartilhamento que essa variável é usada na floresta em comparação com as outras variáveis do mesmo grupo. Isso ocorre porque a propriedade da torre
E [ E [X| Y] ] = E [ X]
Agora, para responder sua pergunta diretamente, não é tão simples como resumir todas as importâncias em cada grupo para obter o MeanDecreaseGini combinado, mas calcular a média ponderada fornecerá a resposta que você está procurando. Nós apenas precisamos encontrar as frequências variáveis dentro de cada grupo.
Aqui está um script simples para obtê-los de um objeto de floresta aleatório no 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 passar os nomes das variáveis no grupo como o parâmetro members.
Espero que isso responda à sua pergunta. Posso escrever uma função para obter as importâncias do grupo diretamente, se for de seu interesse.
EDIT:
Aqui está uma função que dá importância ao grupo, dado um randomForest
objeto e uma lista de vetores com nomes de variáveis. Ele usa var.share
como definido anteriormente. Eu não fiz nenhuma verificação de entrada, portanto, você precisa se certificar de usar os nomes de variáveis corretos.
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)
}
Exemplo de uso:
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
Também funciona para grupos sobrepostos:
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