R'de rastgele bir orman sınıflandırmasında bir dizi yordayıcının göreceli önemi


31

Değişkenlerin kümelerinin randomForestR'deki bir sınıflandırma modeline göre göreceli önemini belirlemek isterim . importanceİşlev, MeanDecreaseGiniher bir yordayıcı için metrik sağlar - bunu bir kümedeki her yordayıcı arasında toplamak kadar basit midir?

Örneğin:

# 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?

Yanıtlar:


46

Ö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=1ncpi(1pi)
ncpi

İ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: 2 sınıf için Gini kirliliği

Ö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.

I=GparentGsplit1Gsplit2

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 randomForestnesneye 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

Açık ve kesin cevap için teşekkür ederiz! Grup ithalatı için bir işlev eklemek istemezseniz, bu harika olurdu.
Max Ghenis

Bu cevap için teşekkürler! İki sorunuz varsa, bir dakikanız varsa: (1) Önem daha sonra ... olarak hesaplanır : Breiman'ın tanımına göre, ben orada "gini azalması" var ve önemi azalışların toplamı olur, doğru ? (2) söz konusu öngörücüyü içeren ormandaki bütün bölmelerin ortalaması : Bu özelliği, bu özellik üzerinde bir bölünmeyi içeren tüm düğümlerle değiştirebilir miyim ? Tamamen anladığımdan emin olmak için;)
Remi Mélisson

1
Yorumların beni biraz daha fazla düşündüğünü söyledin, ben de doğru cevap vermek için R'de kullanılan randomForest kodunu araştırdım. Dürüst olmak gerekirse biraz kapalı kaldım. Ortalama olan tüm düğümlerin değil tüm ağaçların üzerinden yapılır. Zaman ayırır almaz cevabı güncelleyeceğim. İşte şimdilik sorunuzun cevapları: (1) evet. Ağaç düzeyinde bu şekilde tanımlanır. Düşüşlerin toplamı daha sonra tüm ağaçların üzerinden ortalaması alınır. (2) Evet, demek istediğim buydu, ama gerçekten geçerli değil.
ederken

4

Yukarıda G = "pi (1 − pi)] sınıfları toplamı olarak tanımlanan işlev aslında bir bölünmeyi değerlendirmenin başka bir yolu olan entropidir. Çocuk düğümlerindeki entropi ile ana düğüm arasındaki fark Bilgi Kazancı'dır. GINI impurity işlevi, sınıflara göre G = 1- toplamıdır [pi ^ 2].

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.