CART kullanırken “değişken önemi” nasıl ölçülür / derecelendirilir? (özellikle R'den {rpart} kullanarak)


27

Rpart (R) kullanarak bir CART modeli (özellikle sınıflandırma ağacı) oluştururken, modele tanıtılan çeşitli değişkenlerin önemini bilmek genellikle ilginçtir.

Dolayısıyla benim sorum şu: Bir CART modelinde katılımcı değişkenlerin değişken önem derecesini sıralamak / ölçmek için hangi ortak önlemler var? Ve bu nasıl R kullanılarak hesaplanabilir (örneğin, rpart paketini kullanırken)

Mesela, işte bazı kukla kod, yaratılmış, böylece çözümlerinizi gösterebilirsiniz. Bu örnek, x1 ve x2 değişkeninin "önemli" olduğu açıkken, (bazı anlamda) x1'in x2'den daha önemli olduğu açıktır (x1, daha fazla durumda geçerli olmalıdır, bu nedenle verilerin yapısı üzerinde daha fazla etki yapmalıdır. sonra 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

(referanslar her zaman memnuniyetle karşılanır)


Bu soru stats.stackexchange.com/questions/5443/… ' den ne kadar farklı ?
steffen

Bu soru, bağımlı değişkenlerin belirli bir kategorik değeri için hangi öngörücünün anlamlı olduğunu bilmeyi ifade eder. Bu soru daha geniştir (hangi nominal değere etki ettiğini tespit etmeden değişken önem / sıralama). Bu soruya yanıt verilmezse beri birileri ... yardım edebileceğini umuduyla daha genel bir şekilde bunu ifade o kadar değer düşündük
Tal Galili

Yanıtlar:


42

Değişken önem genellikle, ilgilenen belirleyici kaldırıldığı zaman (rastgele ormandaki gibi bir permütasyon tekniği ile) öngörülen doğruluk oranının düşürülmesine veya düğüm kirliliğinin azalmasının bir ölçüsüne dayanarak hesaplanabilir, ancak genel bakış için bakınız (1). mevcut yöntemler CART'a açık bir alternatif elbette ki RF'dir ( randomForest , ama ayrıca partiye bakınız ). RF ile Gini önem endeksi, ormandaki tüm ağaçlar üzerinde düğüm kirliliklerinde ortalama Gini düşüşü olarak tanımlanır (belirli bir ana düğüm için Gini kirlilik endeksinin, bu ölçünün değerinden daha büyük olması yardımcı düğümler, bakınız örneğin (2)).

Carolin Strobl'ı topladığını biliyorum. RF'lerde ve CART'larda (koşullu) değişken önem üzerine birçok simülasyon ve deneysel çalışmalara katkıda bulundular (örneğin, (3-4), ancak tezi, Makine Öğreniminde İstatistiksel Konular - Güvenilir Bölünmüş Seçime Doğru ve Değişken Önlem Ölçüleri ).

Bildiğim kadarıyla , şapka paketi (5) sadece regresyon durumu için bir kayıp fonksiyonunu dikkate almaktadır (yani, ortalama kare hatası). Belki yakın gelecekte eklenecektir (yine de, k-NN tarafından sınıflandırma örneği olan bir örnek için çevrimiçi yardımda mevcuttur dotPlot).

Ancak, Noel M O'Boyle, CART'taki Değişken önemi için bazı R kodlarına sahip görünüyor .

Referanslar

  1. Sandri ve Zuccolotto. Sınıflandırma ağaçlarında Gini değişkeni önem ölçüsü için yanlılık düzeltme algoritması . 2008
  2. Izenman. Modern Çok Değişkenli İstatistiksel Teknikler . İlkbahar 2008
  3. Strobl, Hothorn ve Zeilis. Parti düzenlemek! . R Journal 2009 1/2
  4. Strobl, Boulesteix, Kneib, Augustin ve Zeilis. Rastgele ormanlar için koşullu değişken önemi . BMC Biyoinformatik 2008, 9: 307
  5. Kuhn. Harç Paketi Kullanarak R Tahmini Model Oluşturma . JSS 2008 28 (5)

1
Gerçekten - sahip olduğundan çok daha fazla oy hak ediyor.
Matt Parker

Büyük cevap için +1. Ve (benim gibi) geç gelenler için güncelleme importance()içinde randomForest acccuracy içinde ortalama deacrease ve ortalama gini azalma ile bireysel değişken önem yapar.
Zhubarb 28:15

3

Aşağıdaki işlev (Caret paketinden), rpart ağaçlarındaki değişken önemi değerlendirmek için kullanılabilir. Ağaçtaki tek kök düğümü, Caret işlevindeki bir hatayı düzelttim.

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

}

Aşağıdaki r kodu "uygun" bir rpart ağacı için önemli puanlar üretecektir

 varImp(fit)

Teşekkürler. Hatayı Max'e rapor ettin mi? (şapka paketinin
sağlayıcısı

1

Sanırım chl ilk kısmı hemen hemen cevapladı:

Bir CART modelinde katılımcı değişkenlerin değişken önem derecesini sıralamak / ölçmek için hangi ortak önlemler vardır?

Sorunuzun ikinci kısmı ile ilgili olarak:

Ve bu nasıl R kullanılarak hesaplanabilir (örneğin, rpart paketini kullanırken)

Değişken önemini rpart kullanarak özeti (uygun) kullanarak bulabilirsiniz. Bu, diğer birçok şey arasında değişken önemini ortaya koymaktadır. Buradan daha fazla bilgi edinebilirsiniz: https://cran.r-project.org/web/packages/rpart/rpart.pdf . Sayfa 25'e bakınız.


0

names(result) gösterileri variable.importance

result$variable.importance yardım etmelisin?


3
Sorunun, R'de bulunanların belirli bir yöntem için nasıl basılacağına ilişkin olarak, değişken öneme sahip bazı önlemlerin avantajları veya popülerliği ile ilgisi olduğuna inanıyorum.
chl
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.