Como medir / classificar “importância variável” ao usar o CART? (especificamente usando {rpart} de R)

27

Ao construir um modelo CART (especificamente árvore de classificação) usando rpart (em R), geralmente é interessante saber qual é a importância das várias variáveis ​​introduzidas no modelo.

Assim, minha pergunta é: Que medidas comuns existem para classificar / medir a importância das variáveis ​​participantes de um modelo CART? E como isso pode ser calculado usando R (por exemplo, ao usar o pacote rpart)

Por exemplo, aqui está um código fictício, criado para que você possa mostrar suas soluções. Este exemplo está estruturado para que fique claro que as variáveis ​​x1 e x2 são "importantes", enquanto (em certo sentido) x1 é mais importante que x2 (já que x1 deve se aplicar a mais casos, portanto, influi mais na estrutura dos dados, então x2).

set.seed(31431)
n <- 400
x1 <- rnorm(n)
x2 <- rnorm(n)
x3 <- rnorm(n)
x4 <- rnorm(n)
x5 <- rnorm(n)

X <- data.frame(x1,x2,x3,x4,x5)

y <- sample(letters[1:4], n, T)
y <- ifelse(X[,2] < -1 , "b", y)
y <- ifelse(X[,1] < 0 , "a", y)

require(rpart)
fit <- rpart(y~., X)
plot(fit); text(fit)

info.gain.rpart(fit) # your function - telling us on each variable how important it is

(as referências são sempre bem-vindas)

Tal Galili
fonte
como esta pergunta difere de stats.stackexchange.com/questions/5443/… ?
Steffen
Essa pergunta se refere ao conhecimento de qual preditor foi relevante para um valor categórico específico da variável dependente. Essa questão é mais ampla (importância / classificação variável sem detectar a qual valor nominal ela afeta). Desde essa pergunta não foi respondida eu pensei que vale a pena expressá-lo de uma forma mais geral, na esperança de que alguém pode ser capaz de ajudar ...
Tal Galili

Respostas:

42

A importância variável geralmente pode ser calculada com base na redução correspondente da precisão preditiva quando o preditor de interesse é removido (com uma técnica de permutação, como na Floresta Aleatória) ou em alguma medida de diminuição da impureza do nó, mas consulte (1) para uma visão geral de métodos disponíveis. Uma alternativa óbvia ao CART é o RF, é claro ( randomForest , mas veja também party ). Com a RF, o índice de importância de Gini é definido como a diminuição média de Gini nas impurezas do nó em todas as árvores da floresta (decorre do fato de que o índice de impureza de Gini para um determinado nó pai é maior que o valor dessa medida para seus dois nós filhas, veja, por exemplo, (2)).

Eu sei que Carolin Strobl e coll. contribuíram com muitos estudos experimentais e de simulação sobre importância variável (condicional) em RFs e CARTs (por exemplo, (3-4), mas existem muitos outros, ou sua tese, Questões estatísticas em aprendizado de máquina - rumo à seleção dividida confiável e Medidas de Importância Variável ).

Que eu saiba, o pacote de acento circunflexo (5) considera apenas uma função de perda para o caso de regressão (isto é, erro quadrático médio). Talvez ele seja adicionado em um futuro próximo (de qualquer maneira, um exemplo com um caso de classificação por k-NN está disponível na ajuda on-line para dotPlot).

No entanto, Noel M O'Boyle parece ter algum código R para importância variável no CART .

Referências

  1. Sandri e Zuccolotto. Um algoritmo de correção de viés para a medida de importância variável de Gini em árvores de classificação . 2008
  2. Izenman. Técnicas estatísticas multivariadas modernas . Springer 2008
  3. Strobl, Hothorn e Zeilis. Party on! . R Journal 2009 1/2
  4. Strobl, Boulesteix, Kneib, Augustin e Zeilis. Importância variável condicional para florestas aleatórias . BMC Bioinformatics 2008, 9: 307
  5. Kuhn. Criando modelos preditivos em R Usando o pacote de interpolação . JSS 2008 28 (5)
chl
fonte
1
Realmente - merece muito mais votos do que tem.
Matt Parker
+1 para a ótima resposta. E a atualização para quem chega atrasado (como eu) importance()no randomForest tem importância variável individual, com decréscimo médio na precisão e diminuição média do gini.
Zhubarb 28/09/2015
3

A função a seguir (do pacote Caret) pode ser usada para avaliar a importância variável nas árvores rpart. Corrigi um bug na função Caret quando esse único nó raiz na árvore.

varImp <- function(object, surrogates = FALSE, competes = TRUE, ...)
  {
tmp <- rownames(object$splits)

 allVars <- colnames(attributes(object$terms)$factors)
if(is.null(tmp))
  {
  out<-NULL
    zeros <- data.frame(x = rep(0, length(allVars)),
                        Variable = allVars)
    out <- rbind(out, zeros)
  }

else {

rownames(object$splits) <- 1:nrow(object$splits)
splits <- data.frame(object$splits)
    splits$var <- tmp
splits$type <- ""

frame <- as.data.frame(object$frame)
    index <- 0
    for(i in 1:nrow(frame))
      {
        if(frame$var[i] != "<leaf>")
          {
            index <- index + 1
            splits$type[index] <- "primary"
            if(frame$ncompete[i] > 0)
              {
                for(j in 1:frame$ncompete[i])
                  {
                    index <- index + 1
                    splits$type[index] <- "competing"
                  }
              }
            if(frame$nsurrogate[i] > 0)
              {
                for(j in 1:frame$nsurrogate[i])
                  {
                    index <- index + 1
                    splits$type[index] <- "surrogate"
                  }
              }
          }
      }
    splits$var <- factor(as.character(splits$var))
    if(!surrogates) splits <- subset(splits, type != "surrogate")
    if(!competes) splits <- subset(splits, type != "competing")
    out <- aggregate(splits$improve,
                 list(Variable = splits$var),
                 sum,
                 na.rm = TRUE)

allVars <- colnames(attributes(object$terms)$factors)
if(!all(allVars %in% out$Variable))
      {
        missingVars <- allVars[!(allVars %in% out$Variable)]
        zeros <- data.frame(x = rep(0, length(missingVars)),
                            Variable = missingVars)
        out <- rbind(out, zeros)
      }
    }
    out2 <- data.frame(Overall = out$x)
rownames(out2) <- out$Variable
out2

}

O código r a seguir produzirá pontuações de importância para um "ajuste" da árvore rpart

 varImp(fit)
inundação
fonte
Obrigado. Você reportou o bug para Max? (o mantenedor do pacote de sinal de intercalação)
Tal Galili 14/10
1

Eu acho que chl praticamente respondeu a primeira parte:

Que medidas comuns existem para classificar / medir a importância das variáveis ​​participantes de um modelo CART?

Com relação à segunda parte da sua pergunta:

E como isso pode ser calculado usando R (por exemplo, ao usar o pacote rpart)

Você pode encontrar a importância da variável usando rpart usando o resumo (ajuste). Isso gera a importância variável entre várias outras coisas. Você pode ler mais sobre isso aqui: https://cran.r-project.org/web/packages/rpart/rpart.pdf . Consulte a página 25.

Jash Shah
fonte
0

names(result) mostra variable.importance

result$variable.importance deve ajudar?

shubh
fonte
3
Acredito que a questão tenha mais a ver com as vantagens ou popularidade de algumas medidas de importância variável do que como imprimir as disponíveis em R para um método específico.
chl 26/03/13