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 = ∑i = 1nchalsaya( 1 - halsaya)
nchalsaya
Untuk masalah dua kelas, ini menghasilkan kurva berikut yang dimaksimalkan untuk sampel 50-50 dan diminimalkan untuk set homogen:
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= Gp a r e n t- Gs p l i t 1- Gs p l i t 2
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 randomForest
objek dan daftar vektor dengan nama variabel. Ini digunakan var.share
seperti 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