Jak mierzyć / oceniać „zmienne znaczenie” podczas korzystania z CART? (konkretnie używając {rpart} z R)

27

Podczas budowania modelu CART (w szczególności drzewa klasyfikacji) przy użyciu rpart (w R) często interesujące jest wiedzieć, jakie znaczenie mają różne zmienne wprowadzone do modelu.

Tak więc moje pytanie brzmi: jakie wspólne miary istnieją dla uszeregowania / pomiaru znaczenia zmiennych uczestniczących zmiennych w modelu CART? I jak można to obliczyć za pomocą R (na przykład przy użyciu pakietu rpart)

Na przykład, oto sztuczny kod stworzony, abyś mógł pokazać na nim swoje rozwiązania. Ten przykład ma taką strukturę, że jest jasne, że zmienne x1 i x2 są „ważne”, podczas gdy (w pewnym sensie) x1 jest ważniejsze niż x2 (ponieważ x1 powinno mieć zastosowanie do większej liczby przypadków, a zatem mieć większy wpływ na strukturę danych, następnie 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

(referencje są zawsze mile widziane)

Tal Galili
źródło
czym różni się to pytanie od stats.stackexchange.com/questions/5443/... ?
steffen
Pytanie to dotyczy wiedzy, który predyktor był istotny dla konkretnej wartości kategorycznej zmiennej zależnej. To pytanie jest szersze (zmienne znaczenie / ranking bez wykrycia, na jaką wartość nominalną ma wpływ). Ponieważ na to pytanie nie ma odpowiedzi, pomyślałem, że warto je sformułować w bardziej ogólny sposób, mając nadzieję, że ktoś może pomóc ...
Tal Galili

Odpowiedzi:

42

Zmienne znaczenie można ogólnie obliczyć na podstawie odpowiedniego zmniejszenia dokładności predykcyjnej, gdy predyktor będący przedmiotem zainteresowania zostanie usunięty (techniką permutacji, jak w Losowym lesie) lub pewną miarą zmniejszenia zanieczyszczenia węzła, ale przegląd (1) zawiera przegląd dostępne metody. Oczywistą alternatywą dla CART jest oczywiście RF ( randomForest , ale patrz także party ). W przypadku RF wskaźnik ważności Gini jest definiowany jako uśredniony spadek Gini zanieczyszczeń w węzłach we wszystkich drzewach w lesie (wynika z faktu, że wskaźnik zanieczyszczenia Gini dla danego węzła macierzystego jest większy niż wartość tej miary dla jego dwóch węzły potomne, patrz np. (2)).

Wiem, że Carolin Strobl i kol. wnieśli wiele badań symulacyjnych i eksperymentalnych dotyczących (warunkowego) zmiennego znaczenia w RF i CART (np. (3-4), ale istnieje wiele innych, lub jej teza, Zagadnienia statystyczne w uczeniu maszynowym - w kierunku niezawodnego wyboru podziału i Zmienne miary ważności ).

Według mojej wiedzy pakiet karetki (5) uwzględnia tylko funkcję straty dla przypadku regresji (tj. Średni błąd kwadratu). Być może zostanie dodany w najbliższej przyszłości (tak czy inaczej, przykład z przypadkiem klasyfikacji przez k-NN jest dostępny w pomocy online dla dotPlot).

Jednak wydaje się, że Noel M. O'Boyle ma jakiś kod R dla zmiennej zmienności w CART .

Referencje

  1. Sandri i Zuccolotto. Algorytm korekcji odchylenia dla miary ważności zmiennej Gini w drzewach klasyfikacyjnych . 2008
  2. Izenman. Nowoczesne wielowymiarowe techniki statystyczne . Springer 2008
  3. Strobl, Hothorn i Zeilis. Bawić się! . R Journal 2009 1/2
  4. Strobl, Boulesteix, Kneib, Augustin i Zeilis. Warunkowe zmienne znaczenie dla losowych lasów . BMC Bioinformatics 2008, 9: 307
  5. Kuhn. Budowanie modeli predykcyjnych w R przy użyciu pakietu karetki . JSS 2008 28 (5)
chl
źródło
1
Naprawdę - zasługuje na znacznie więcej głosów niż ma.
Matt Parker,
+1 za świetną odpowiedź. A aktualizacja dla osób spóźniających się (jak ja) importance()w randomForest ma indywidualne zmienne znaczenie ze średnim zmniejszeniem dokładności i średnim spadkiem gini.
Zhubarb
3

Poniższej funkcji (z pakietu Caret) można użyć do oceny zmiennego znaczenia drzew rpart. Poprawiłem błąd w funkcji Caret, gdy jest to jedyny węzeł główny w drzewie.

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

}

Poniższy kod r wygeneruje wyniki istotności dla „dopasowanego” drzewa rpart

 varImp(fit)
zalanie
źródło
Dzięki. Czy zgłosiłeś błąd Maxowi? (opiekun pakietu opieki)
Tal Galili
1

Myślę, że chl właściwie odpowiedziała na pierwszą część:

Jakie są wspólne miary dla rankingu / pomiaru znaczenia zmiennych uczestniczących w modelu CART?

W odniesieniu do drugiej części pytania:

I jak można to obliczyć za pomocą R (na przykład przy użyciu pakietu rpart)

Możesz znaleźć zmienną ważność za pomocą rpart, używając podsumowania (dopasowania). Daje to zmienne znaczenie wśród kilku innych rzeczy. Możesz przeczytać więcej na ten temat tutaj: https://cran.r-project.org/web/packages/rpart/rpart.pdf . Patrz strona 25.

Jash Shah
źródło
0

names(result) przedstawia variable.importance

result$variable.importance powinno pomóc?

szub
źródło
3
Uważam, że pytanie ma więcej wspólnego z zaletami lub popularnością niektórych miar o różnym znaczeniu, niż ze sposobem drukowania tych dostępnych w języku R dla konkretnej metody.
chl