Öncelikle, metriğin gerçekte neyin ölçtüğünü önemini açıklığa kavuşturmak isterim.
MeanDecreaseGini , eğitim sırasındaki bölmelerin hesaplanmasında kullanılan Gini kirlilik endeksine dayanan değişken öneme sahip bir ölçüdür. Yaygın bir yanılgı, değişken önem metriğinin AUC ile yakından ilgili olan model performansını ortaya koymak için kullanılan Gini'ye atıfta bulunmasıdır, ancak bu yanlış. Breiman ve Cutler tarafından yazılan randomForest paketinin açıklaması:
Gini önemi
Her değişken düğümde bir düğümün bölünmesi her iki inen düğüm için gini safsızlık kriteri ana düğümden daha azdır. Gini ekleme, ormandaki tüm ağaçlar üzerindeki her bir bireysel değişken için azalır, genellikle permütasyon önem ölçüsü ile tutarlı olan hızlı değişken bir önem verir.
Gini katışkı endeksi olarak tanımlanır
nerede hedef değişken ve sınıfları sayısı bu sınıfın oranıdır.n c p i
G = ∑i = 1ncpben( 1 - pben)
ncpben
İki sınıf bir problem için bu, 50-50 örnek için maksimize ve homojen kümeler için minimize edilen aşağıdaki eğri ile sonuçlanır:
Önem daha sonra
, söz konusu öngörücüyü içeren ormandaki tüm bölmelerin ortalaması . Bu bir ortalama olduğundan, bir grupta yer alan değişkenlerdeki tüm bölmelerin ortalaması alınarak kolayca genişletilebilir.
ben= Gp , bir r e n t- Gs p l ı t 1- Gs p l ı t 2
Daha yakından baktığımızda, her değişkenin öneminin kullanılan değişkene bağlı bir ortalama olduğunu ve grubun meanDecreaseGini değerinin sadece bu değişkenin aynı gruptaki diğer değişkenlere kıyasla ormanda kullandığı paylaşıma ağırlık verilen bu ortalamaların ortalaması olacağını söyleyebiliriz. Bu, tower özelliğinin
E [ E [X| Y] ] = E [X]
Şimdi, sorunuzu doğrudan cevaplamak için , her bir gruptaki tüm ithalatları birleştirilmiş MeanDecreaseGini almak için toplamak kadar basit değil , ancak ağırlıklı ortalamayı hesaplamak, aradığınız cevabı alacaktır. Sadece her gruptaki değişken frekansları bulmamız gerekiyor.
Bunları R'de rastgele bir orman nesnesinden almak için basit bir betik:
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)
}
Sadece gruptaki değişkenlerin isimlerini members parametresi olarak girin.
Umarım bu sorunuza cevap verir. Eğer ilgilenirse, grup ithalatlarını doğrudan almak için bir fonksiyon yazabilirim.
EDIT:
İşte bir randomForest
nesneye verilen gruba önem veren bir fonksiyon ve değişken isimli vektörlerin listesi. Daha var.share
önce tanımlandığı gibi kullanır . Herhangi bir giriş kontrolü yapmadım, bu yüzden doğru değişken adlarını kullandığınızdan emin olmalısınız.
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)
}
Kullanım örneği:
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
Ayrıca çakışan gruplar için de çalışır:
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