Come misurare / classificare "importanza variabile" quando si utilizza CART? (in particolare usando {rpart} da R)


27

Quando si costruisce un modello CART (in particolare l'albero di classificazione) utilizzando rpart (in R), è spesso interessante sapere qual è l'importanza delle varie variabili introdotte nel modello.

Pertanto, la mia domanda è: quali misure comuni esistono per classificare / misurare l'importanza delle variabili partecipanti in un modello CART? E come può essere calcolato usando R (ad esempio, quando si usa il pacchetto rpart)

Ad esempio, ecco un codice fittizio, creato in modo da poter mostrare le tue soluzioni su di esso. Questo esempio è strutturato in modo tale che sia chiaro che le variabili x1 e x2 sono "importanti" mentre (in un certo senso) x1 è più importante di x2 (poiché x1 dovrebbe applicarsi a più casi, quindi influenzare maggiormente la struttura dei dati, quindi 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

(i riferimenti sono sempre ben accetti)


in che modo questa domanda differisce da stats.stackexchange.com/questions/5443/… ?
Steffen,

Tale domanda si riferisce alla conoscenza del predittore rilevante per un particolare valore categoriale della variabile dipendente. Questa domanda è più ampia (importanza / classifica variabile senza rilevare a quale valore nominale influisce). Poiché a quella domanda non è stata data risposta, ho pensato che valesse la pena di esprimerla in modo più generale, nella speranza che qualcuno potesse essere in grado di aiutare ...
Tal Galili,

Risposte:


43

L'importanza variabile potrebbe generalmente essere calcolata in base alla corrispondente riduzione dell'accuratezza predittiva quando il predittore di interesse viene rimosso (con una tecnica di permutazione, come nella foresta casuale) o una misura della diminuzione dell'impurità del nodo, ma vedere (1) per una panoramica di metodi disponibili. Un'ovvia alternativa al CART è naturalmente la RF ( randomForest , ma vedi anche party ). Con RF, l'indice di importanza di Gini è definito come la diminuzione media di Gini delle impurità del nodo su tutti gli alberi della foresta (deriva dal fatto che l'indice di impurità di Gini per un dato nodo genitore è maggiore del valore di quella misura per i suoi due nodi figlia, vedere ad es. (2)).

So che Carolin Strobl e coll. hanno contribuito a molti studi di simulazione e sperimentali sull'importanza variabile (condizionale) di RF e CART (ad es. (3-4), ma ce ne sono molti altri, o la sua tesi, Problemi statistici nell'apprendimento automatico - Verso una selezione affidabile delle divisioni e Misure di importanza variabile ).

Per quanto ne sappia , il pacchetto caret (5) considera solo una funzione di perdita per il caso di regressione (ovvero, errore quadratico medio). Forse verrà aggiunto nel prossimo futuro (comunque, un esempio con un caso di classificazione di k-NN è disponibile nella guida in linea per dotPlot).

Tuttavia, Noel M O'Boyle sembra avere un codice R per importanza variabile in CART .

Riferimenti

  1. Sandri e Zuccolotto. Un algoritmo di correzione del bias per la misura di importanza variabile Gini negli alberi di classificazione . 2008
  2. Izenman. Tecniche statistiche multivariate moderne . Springer 2008
  3. Strobl, Hothorn e Zeilis. Fai festa! . R Journal 2009 1/2
  4. Strobl, Boulesteix, Kneib, Augustin e Zeilis. Importanza variabile condizionale per foreste casuali . BMC Bioinformatics 2008, 9: 307
  5. Kuhn. Creazione di modelli predittivi in ​​R utilizzando il pacchetto di inserimento . JSS 2008 28 (5)

1
Davvero - merita molti più voti di quanti ne abbia.
Matt Parker,

+1 per l'ottima risposta. E l'aggiornamento per i ritardatari (come me) importance()in randomForest ha un'importanza variabile individuale con una diminuzione media dell'accuratezza e una riduzione del gini medio.
Zhubarb,

3

La seguente funzione (dal pacchetto Caret) può essere utilizzata per valutare l'importanza variabile negli alberi rpart. Ho corretto un bug nella funzione Caret quando questo solo nodo radice nella struttura.

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

}

Il seguente codice r produrrà punteggi di importanza per un "adattamento" dell'albero delle parti

 varImp(fit)

1
Grazie. Hai segnalato il bug a Max? (il manutentore del pacchetto di cura)
Tal Galili,

1

Penso che chl abbia praticamente risposto alla prima parte:

Quali misure comuni esistono per classificare / misurare l'importanza delle variabili partecipanti in un modello CART?

Rispetto alla seconda parte della tua domanda:

E come può essere calcolato usando R (ad esempio, quando si usa il pacchetto rpart)

Puoi trovare l'importanza della variabile usando rpart usando il sommario (adattamento). Ciò genera l'importanza variabile tra molte altre cose. Puoi leggere di più qui: https://cran.r-project.org/web/packages/rpart/rpart.pdf . Fare riferimento a pagina 25.


0

names(result) Spettacoli variable.importance

result$variable.importance dovrebbe aiutare?


3
Credo che la domanda abbia più a che fare con i vantaggi o la popolarità di alcune misure di importanza variabile rispetto a come stampare quelle disponibili in R per un particolare metodo.
chl
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.