Bagaimana mengukur / memberi peringkat “variabel penting” saat menggunakan CART? (khusus menggunakan {rpart} dari R)


27

Ketika membangun model CART (khususnya pohon klasifikasi) menggunakan rpart (dalam R), seringkali menarik untuk mengetahui apa pentingnya berbagai variabel yang diperkenalkan pada model.

Dengan demikian, pertanyaan saya adalah: Apa ukuran umum yang ada untuk menentukan peringkat / mengukur variabel kepentingan variabel yang berpartisipasi dalam model CART? Dan bagaimana ini bisa dihitung menggunakan R (misalnya, ketika menggunakan paket rpart)

Misalnya, berikut adalah beberapa kode dummy, dibuat sehingga Anda dapat menunjukkan solusi Anda di atasnya. Contoh ini terstruktur sehingga jelas bahwa variabel x1 dan x2 adalah "penting" sementara (dalam beberapa hal) x1 lebih penting daripada x2 (karena x1 harus diterapkan pada lebih banyak kasus, sehingga membuat lebih banyak pengaruh pada struktur data, lalu 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

(referensi selalu diterima)


bagaimana perbedaan pertanyaan ini dari stats.stackexchange.com/questions/5443/… ?
steffen

Pertanyaan itu mengacu pada mengetahui prediktor mana yang relevan untuk nilai kategori tertentu dari variabel dependen. Pertanyaan ini lebih luas (variabel pentingnya / peringkat tanpa mendeteksi nilai nominal yang mempengaruhi). Karena pertanyaan itu tidak dijawab, saya pikir perlu untuk mengungkapkannya dengan cara yang lebih umum dengan harapan bahwa seseorang mungkin dapat membantu ...
Tal Galili

Jawaban:


42

Variabel kepentingan umumnya dapat dihitung berdasarkan pengurangan yang sesuai dari akurasi prediktif ketika prediktor bunga dihapus (dengan teknik permutasi, seperti di Hutan Acak) atau beberapa ukuran penurunan pengotor simpul, tetapi lihat (1) untuk ikhtisar dari metode yang tersedia. Alternatif yang jelas untuk CART adalah RF tentu saja ( randomForest , tetapi lihat juga pihak ). Dengan RF, indeks pentingnya Gini didefinisikan sebagai penurunan rata-rata Gini dalam ketidakmurnian simpul di semua pohon di hutan (ini mengikuti fakta bahwa indeks pengotor Gini untuk simpul induk yang diberikan lebih besar dari nilai pengukuran untuk dua nya. simpul anak, lihat misalnya (2)).

Saya tahu bahwa Carolin Strobl dan coll. telah berkontribusi banyak simulasi dan studi eksperimental pada variabel penting (kondisional) dalam RF dan CARTs (misalnya, (3-4), tetapi ada banyak yang lain, atau tesisnya, Masalah Statistik dalam Pembelajaran Mesin - Menuju Pemilihan Split yang Andal dan Ukuran Pentingnya Variabel ).

Setahu saya, paket caret (5) hanya mempertimbangkan fungsi kerugian untuk kasus regresi (yaitu, mean squared error). Mungkin itu akan ditambahkan dalam waktu dekat (toh, contoh dengan kasus klasifikasi oleh k-NN tersedia di bantuan online untuk dotPlot).

Namun, Noel M O'Boyle tampaknya memiliki beberapa kode R untuk kepentingan Variable di CART .

Referensi

  1. Sandri dan Zuccolotto. Algoritma koreksi bias untuk ukuran kepentingan variabel Gini dalam pohon klasifikasi . 2008
  2. Izenman. Teknik Statistik Multivariat Modern . Springer 2008
  3. Strobl, Hothorn, dan Zeilis. Pesta di! . R Journal 2009 1/2
  4. Strobl, Boulesteix, Kneib, Augustin, dan Zeilis. Variabel kondisional, penting untuk hutan acak . BMC Bioinformatics 2008, 9: 307
  5. Kuhn. Membangun Model Prediktif dalam R Menggunakan Paket caret . JSS 2008 28 (5)

1
Benar - layak mendapat lebih banyak suara daripada yang dimilikinya.
Matt Parker

+1 untuk jawaban yang bagus. Dan pembaruan untuk pendatang baru (seperti saya) importance()di randomForest melakukan variabel penting individu dengan penurunan rata-rata dalam akurasi dan rata-rata penurunan gini.
Zhubarb

3

Fungsi berikut (dari paket Caret) dapat digunakan untuk mengevaluasi tingkat kepentingan variabel dalam rpart tree. Saya mengoreksi bug dalam fungsi Caret saat ini hanya simpul root di pohon.

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

}

Kode r berikut akan menghasilkan skor penting untuk pohon pas "pas"

 varImp(fit)

Terima kasih. Apakah Anda melaporkan bug ke Max? (pengelola paket caret)
Tal Galili

1

Saya pikir chl telah menjawab bagian pertama:

Apa ukuran umum yang ada untuk menentukan peringkat / mengukur variabel pentingnya variabel yang berpartisipasi dalam model CART?

Sehubungan dengan bagian kedua dari pertanyaan Anda:

Dan bagaimana ini bisa dihitung menggunakan R (misalnya, ketika menggunakan paket rpart)

Anda dapat menemukan pentingnya variabel menggunakan rpart dengan menggunakan ringkasan (fit). Ini menghasilkan variabel penting antara beberapa hal lainnya. Anda dapat membaca lebih lanjut tentang hal ini di sini: https://cran.r-project.org/web/packages/rpart/rpart.pdf . Lihat halaman 25.


0

names(result) menunjukkan variable.importance

result$variable.importance haruskah membantu?


3
Saya percaya pertanyaannya lebih berkaitan dengan keunggulan atau popularitas beberapa ukuran variabel penting daripada bagaimana mencetak yang tersedia di R untuk metode tertentu.
chl
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.