Kepentingan relatif dari seperangkat alat prediksi dalam klasifikasi hutan acak dalam R


31

Saya ingin menentukan kepentingan relatif dari set variabel terhadap randomForestmodel klasifikasi dalam R. importanceFungsi ini menyediakan MeanDecreaseGinimetrik untuk setiap prediktor individu - apakah sesederhana menjumlahkan ini di setiap prediktor dalam set?

Sebagai contoh:

# Assumes df has variables a1, a2, b1, b2, and outcome
rf <- randomForest(outcome ~ ., data=df)
importance(rf)
# To determine whether the "a" predictors are more important than the "b"s,
# can I sum the MeanDecreaseGini for a1 and a2 and compare to that of b1+b2?

Jawaban:


46

Pertama, saya ingin mengklarifikasi apa sebenarnya ukuran pentingnya metrik.

MeanDecreaseGini adalah ukuran variabel penting berdasarkan indeks pengotor Gini yang digunakan untuk perhitungan pemisahan selama pelatihan. Kesalahpahaman yang umum adalah bahwa metrik kepentingan variabel mengacu pada Gini yang digunakan untuk menyatakan kinerja model yang terkait erat dengan AUC, tetapi ini salah. Berikut ini penjelasan dari paket randomForest yang ditulis oleh Breiman dan Cutler:

Pentingnya gini
Setiap kali pemisahan simpul dilakukan pada variabel m kriteria pengotor gini untuk dua simpul turunan lebih kecil dari simpul induk. Menjumlahkan penurunan gini untuk setiap variabel individu atas semua pohon di hutan memberikan variabel cepat yang penting yang seringkali sangat konsisten dengan ukuran kepentingan permutasi.

The Indeks pengotor Gini didefinisikan sebagai Dimana adalah jumlah kelas dalam variabel target dan adalah rasio kelas ini.n c p i

G=saya=1nchalsaya(1-halsaya)
nchalsaya

Untuk masalah dua kelas, ini menghasilkan kurva berikut yang dimaksimalkan untuk sampel 50-50 dan diminimalkan untuk set homogen: Pengotor Gini untuk 2 kelas

Pentingnya kemudian dihitung sebagai rata-rata atas semua belahan di hutan yang melibatkan prediktor yang dimaksud. Karena ini adalah rata-rata, maka dapat dengan mudah diperluas untuk dirata-rata pada semua pemisahan pada variabel yang terdapat dalam suatu kelompok.

saya=GhalSebuahrent-Gshallsayat1-Gshallsayat2

Melihat lebih dekat kita tahu masing-masing variabel penting adalah persyaratan rata-rata pada variabel yang digunakan dan meanDecreaseGini dari kelompok hanya akan menjadi rata-rata dari nilai-nilai ini yang dibebani pada bagian variabel ini digunakan di hutan dibandingkan dengan variabel lain dalam kelompok yang sama. Ini berlaku karena properti menara

E[E[X|Y]]=E[X]

Sekarang, untuk menjawab pertanyaan Anda secara langsung, tidak sesederhana hanya meringkas semua kepentingan di setiap grup untuk mendapatkan MeanDecreaseGini gabungan, tetapi menghitung rata-rata tertimbang akan memberi Anda jawaban yang Anda cari. Kami hanya perlu menemukan frekuensi variabel dalam setiap kelompok.

Berikut ini adalah skrip sederhana untuk mendapatkan ini dari objek hutan acak di R:

var.share <- function(rf.obj, members) {
  count <- table(rf.obj$forest$bestvar)[-1]
  names(count) <- names(rf.obj$forest$ncat)
  share <- count[members] / sum(count[members])
  return(share)
}

Cukup berikan nama variabel dalam grup sebagai parameter anggota.

Saya harap ini menjawab pertanyaan Anda. Saya bisa menulis fungsi untuk mendapatkan kepentingan grup secara langsung jika itu menarik.

EDIT:
Berikut adalah fungsi yang memberikan kelompok pentingnya diberi randomForestobjek dan daftar vektor dengan nama variabel. Ini digunakan var.shareseperti yang didefinisikan sebelumnya. Saya belum melakukan pengecekan input sehingga Anda perlu memastikan Anda menggunakan nama variabel yang tepat.

group.importance <- function(rf.obj, groups) {
  var.imp <- as.matrix(sapply(groups, function(g) {
    sum(importance(rf.obj, 2)[g, ]*var.share(rf.obj, g))
  }))
  colnames(var.imp) <- "MeanDecreaseGini"
  return(var.imp)
}

Contoh penggunaan:

library(randomForest)                                                          
data(iris)

rf.obj <- randomForest(Species ~ ., data=iris)

groups <- list(Sepal=c("Sepal.Width", "Sepal.Length"), 
               Petal=c("Petal.Width", "Petal.Length"))

group.importance(rf.obj, groups)

>

      MeanDecreaseGini
Sepal         6.187198
Petal        43.913020

Ini juga berfungsi untuk kelompok yang tumpang tindih:

overlapping.groups <- list(Sepal=c("Sepal.Width", "Sepal.Length"), 
                           Petal=c("Petal.Width", "Petal.Length"),
                           Width=c("Sepal.Width", "Petal.Width"), 
                           Length=c("Sepal.Length", "Petal.Length"))

group.importance(rf.obj, overlapping.groups)

>

       MeanDecreaseGini
Sepal          6.187198
Petal         43.913020
Width          30.513776
Length        30.386706

Terima kasih atas jawaban yang jelas dan keras! Jika Anda tidak keberatan menambahkan fungsi untuk kepentingan grup, itu akan bagus.
Max Ghenis

Terima kasih atas jawaban itu! Dua pertanyaan, jika Anda punya waktu sebentar: (1) Pentingnya kemudian dihitung sebagai ... : sehubungan dengan definisi Breiman, saya adalah "penurunan gini" di sana, dan pentingnya adalah jumlah dari penurunan, benar ? (2) rata-rata atas semua belahan di hutan yang melibatkan prediktor yang dimaksud : Dapatkah saya mengganti ini dengan semua simpul yang melibatkan pemisahan pada fitur tertentu ? Yang pasti saya mengerti sepenuhnya;)
Remi Mélisson

1
Anda komentar membuat saya berpikir lebih banyak tentang definisi jadi saya menggali melalui kode randomForest yang digunakan dalam R untuk menjawabnya dengan benar. Saya sedikit tidak jujur. Rata-rata dibuat di semua pohon dan tidak semua node. Saya akan memperbarui jawabannya segera setelah saya punya waktu untuk itu. Inilah jawaban atas pertanyaan Anda untuk saat ini: (1) ya. Ini adalah bagaimana ia didefinisikan pada level pohon. Jumlah penurunan kemudian dirata-rata untuk semua pohon. (2) Ya, itulah yang ingin saya katakan, tetapi itu tidak benar-benar berlaku.
sementara

4

Fungsi yang didefinisikan di atas sebagai G = jumlah lebih dari kelas [pi (1 − pi)] sebenarnya adalah entropi, yang merupakan cara lain untuk mengevaluasi perpecahan. Perbedaan antara entropi pada simpul anak-anak dan simpul induk adalah Gain Informasi. Fungsi pengotor GINI adalah G = 1- jumlah dari kelas [pi ^ 2].

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.