Wie wird die „variable Wichtigkeit“ bei der Verwendung von CART gemessen / eingestuft? (speziell mit {rpart} von R)

27

Wenn Sie ein CART-Modell (insbesondere einen Klassifizierungsbaum) mit rpart (in R) erstellen, ist es häufig interessant zu wissen, welche Bedeutung die verschiedenen Variablen haben, die in das Modell eingeführt werden.

Meine Frage lautet daher: Welche gängigen Maße gibt es für das Ranking / Messen der Variablenwichtigkeit von beteiligten Variablen in einem CART-Modell? Und wie kann dies mit R berechnet werden (zum Beispiel bei Verwendung des rpart-Pakets)

Hier ist beispielsweise ein Dummy-Code, der erstellt wurde, damit Sie Ihre Lösungen darauf anzeigen können. Dieses Beispiel ist so strukturiert, dass klar ist, dass die Variablen x1 und x2 "wichtig" sind, während x1 (in gewissem Sinne) wichtiger ist als x2 (da x1 für mehr Fälle gelten sollte und somit mehr Einfluss auf die Struktur der Daten hat). dann 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

(Referenzen sind immer willkommen)

Tal Galili
quelle
Wie unterscheidet sich diese Frage von stats.stackexchange.com/questions/5443/… ?
Steffen
Diese Frage bezieht sich auf das Wissen, welcher Prädiktor für einen bestimmten kategorialen Wert der abhängigen Variablen relevant war. Diese Frage ist weiter gefasst (variable Wichtigkeit / Rangfolge, ohne festzustellen, auf welchen Nennwert sie sich auswirkt). Da diese Frage nicht beantwortet wurde, hielt ich es für sinnvoll, sie allgemeiner zu formulieren, in der Hoffnung, dass jemand helfen könnte ...
Tal Galili,

Antworten:

42

Die variable Wichtigkeit kann im Allgemeinen basierend auf der entsprechenden Verringerung der Vorhersagegenauigkeit berechnet werden, wenn der interessierende Prädiktor entfernt wird (mit einer Permutationstechnik wie in Random Forest) oder auf einem Maß für die Abnahme der Knotenverunreinigung, siehe jedoch (1) für einen Überblick über verfügbare Methoden. Eine naheliegende Alternative zu CART ist natürlich RF ( randomForest , siehe auch Party ). Mit RF wird der Gini-Wichtigkeitsindex als die gemittelte Gini-Abnahme der Knotenverunreinigungen über alle Bäume in der Gesamtstruktur definiert (dies ergibt sich aus der Tatsache, dass der Gini-Verunreinigungsindex für einen bestimmten übergeordneten Knoten größer ist als der Wert dieses Maßes für seine beiden Tochterknoten, siehe zB (2)).

Ich weiß, dass Carolin Strobl und Coll. haben eine Menge von Simulationen und experimentellen Studien zur (bedingten) Variablenbedeutung in RFs und CARTs beigetragen (z. B. (3-4), aber es gibt noch viele andere, oder ihre These, Statistische Probleme beim maschinellen Lernen - Hin zu einer zuverlässigen Split-Auswahl und Variable Wichtigkeitsmaße ).

Meines Wissens berücksichtigt das Caret- Paket (5) nur eine Verlustfunktion für den Regressionsfall (dh den mittleren quadratischen Fehler). Möglicherweise wird es in naher Zukunft hinzugefügt (ein Beispiel mit einem Klassifizierungsfall von k-NN finden Sie in der Online-Hilfe für dotPlot).

Noel M O'Boyle scheint jedoch einen R-Code für die Variable Wichtigkeit im WARENKORB zu haben .

Verweise

  1. Sandri und Zuccolotto. Ein Bias-Korrekturalgorithmus für das Gini-Maß für die variable Wichtigkeit in Klassifizierungsbäumen . 2008
  2. Izenman. Moderne multivariate statistische Techniken . Springer 2008
  3. Strobl, Hothorn und Zeilis. Feier weiter! . R Journal 2009 1/2
  4. Strobl, Boulesteix, Kneib, Augustin und Zeilis. Bedingte variable Wichtigkeit für zufällige Wälder . BMC Bioinformatics 2008, 9: 307
  5. Kuhn. Erstellen von Vorhersagemodellen in R mithilfe des Caret-Pakets . JSS 2008 28 (5)
chl
quelle
1
Wirklich - verdient viel mehr Stimmen als es hat.
Matt Parker
+1 für die gute Antwort. Und das Update für Neulinge (wie ich) importance()in RandomForest hat eine variable Bedeutung für den Einzelnen mit einer mittleren Abnahme der Genauigkeit und einer mittleren Abnahme der Gini.
Zhubarb
3

Die folgende Funktion (aus dem Caret-Paket) kann zum Auswerten der variablen Wichtigkeit in Teilbäumen verwendet werden. Ich habe einen Fehler in der Caret-Funktion behoben, als dieser nur Wurzelknoten im Baum war.

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

}

Der folgende r-Code erzeugt Wichtigkeitswerte für einen r-Teilbaum "fit".

 varImp(fit)
Floodking
quelle
Vielen Dank. Hast du Max den Fehler gemeldet? (der Betreuer des Caret-Pakets)
Tal Galili
1

Ich denke, chl hat den ersten Teil so ziemlich beantwortet:

Welche gängigen Maßnahmen zur Rangfolge / Messung der Variablenwichtigkeit beteiligter Variablen in einem CART-Modell gibt es?

In Bezug auf den zweiten Teil Ihrer Frage:

Und wie kann dies mit R berechnet werden (zum Beispiel bei Verwendung des rpart-Pakets)

Sie können die Variablenbedeutung mit rpart ermitteln, indem Sie summary (fit) verwenden. Dies gibt unter anderem die variable Wichtigkeit aus. Hier können Sie mehr darüber lesen: https://cran.r-project.org/web/packages/rpart/rpart.pdf . Siehe Seite 25.

Jash Shah
quelle
0

names(result) zeigt an variable.importance

result$variable.importance sollte helfen?

shubh
quelle
3
Ich glaube, die Frage hat mehr mit den Vorteilen oder der Beliebtheit einiger Kennzahlen von variabler Bedeutung zu tun, als wie die in R verfügbaren Kennzahlen für eine bestimmte Methode gedruckt werden.
Chl