R: gbm ve RandomForest'in kısmi bağımlılık grafiklerinde ne görüyorum?


14

Aslında, kısmi bağımlılık planıyla bir kişinin neyi gösterebileceğini anladığımı sanıyordum, ama çok basit bir varsayımsal örnek kullanarak oldukça şaşırdım. Aşağıdaki kod yığınında, üç bağımsız değişken ( a , b , c ) ve bir bağımlı değişken ( y ) ile c , y ile yakın bir doğrusal ilişki gösterirken, a ve b y ile ilişkisizdir . R paketini kullanarak yükseltilmiş bir regresyon ağacı ile regresyon analizi yapıyorum gbm:

a <- runif(100, 1, 100)
b <- runif(100, 1, 100)
c <- 1:100 + rnorm(100, mean = 0, sd = 5)
y <- 1:100 + rnorm(100, mean = 0, sd = 5)
par(mfrow = c(2,2))
plot(y ~ a); plot(y ~ b); plot(y ~ c)
Data <- data.frame(matrix(c(y, a, b, c), ncol = 4))
names(Data) <- c("y", "a", "b", "c")
library(gbm)
gbm.gaus <- gbm(y ~ a + b + c, data = Data, distribution = "gaussian")
par(mfrow = c(2,2))
plot(gbm.gaus, i.var = 1)
plot(gbm.gaus, i.var = 2)
plot(gbm.gaus, i.var = 3)

Şaşırtıcı olmayan bir şekilde, değişkenler için bir ve b kısmi bağımlılık parsellerin ortalama etrafında yatay çizgiler verim bir . Beni bulmaca ne değişken c için arsa . C <40 ve c > 60 aralıkları için yatay çizgiler alıyorum ve y ekseni y ortalamasına yakın değerlerle sınırlıdır . Bu yana bir ve B tamamen ilişkili olmayan y , O (modelinde ve böylece orada değişken önemi 0 olduğu) beklenen cdeğerlerinin çok sınırlı bir aralığı için o sigmoid şekli yerine tüm aralığı boyunca kısmi bağımlılık gösterecektir. Friedman (2001) "Açgözlü fonksiyon yaklaşımı: gradyan artırıcı makine" ve Hastie ve ark. (2011) "İstatistiksel Öğrenmenin Unsurları", ancak benim matematiksel becerilerim, içindeki tüm denklemleri ve formülleri anlamak için çok düşük. Dolayısıyla sorum: Değişken c için kısmi bağımlılık grafiğinin şeklini ne belirler ? (Lütfen matematikçi olmayan biri için anlaşılır kelimelerle açıklayınız!)

17 Nisan 2014 tarihinde eklendi:

Yanıt beklerken, aynı örnek verileri R-paketiyle analiz için kullandım randomForest. RandomForest'in kısmi bağımlılık grafikleri, gbm grafiklerinden beklediğim şeye çok daha fazla benziyor: Açıklayıcı değişkenlerin a ve b'ye kısmi bağımlılığı 50 civarında rasgele ve yakından değişirken, açıklayıcı değişken c , tüm aralığı (ve neredeyse tüm y aralığı ). Kısmi bağımlılık araziler bu farklı şekiller nedenleri ne olabilir gbmve randomForest?

gbm ve random'in kısmi grafikleri

Grafikleri karşılaştıran değiştirilmiş kod:

a <- runif(100, 1, 100)
b <- runif(100, 1, 100)
c <- 1:100 + rnorm(100, mean = 0, sd = 5)
y <- 1:100 + rnorm(100, mean = 0, sd = 5)
par(mfrow = c(2,2))
plot(y ~ a); plot(y ~ b); plot(y ~ c)
Data <- data.frame(matrix(c(y, a, b, c), ncol = 4))
names(Data) <- c("y", "a", "b", "c")

library(gbm)
gbm.gaus <- gbm(y ~ a + b + c, data = Data, distribution = "gaussian")

library(randomForest)
rf.model <- randomForest(y ~ a + b + c, data = Data)

x11(height = 8, width = 5)
par(mfrow = c(3,2))
par(oma = c(1,1,4,1))
plot(gbm.gaus, i.var = 1)
partialPlot(rf.model, Data[,2:4], x.var = "a")
plot(gbm.gaus, i.var = 2)
partialPlot(rf.model, Data[,2:4], x.var = "b")
plot(gbm.gaus, i.var = 3)
partialPlot(rf.model, Data[,2:4], x.var = "c")
title(main = "Boosted regression tree", outer = TRUE, adj = 0.15)
title(main = "Random forest", outer = TRUE, adj = 0.85)

1
Hiperparametreleri bir dokunuşla ayarlamak isteyebilirsiniz. Varsayılan ağaç sayısının gbm cinsinden ne olduğundan emin değilim, ancak o kadar küçük olabilir ki sağlıklı bir eğriliği öğrenmek için zamanı yoktur.
Shea Parkes

@Shea Parkes - Haklısın. Varsayılan ağaç sayısı 100'dür ve bu da iyi bir model oluşturmak için yeterli değildir. 2000 ağaç ile gbm ve rastgele ormanın kısmi bağımlılık alanları neredeyse aynıdır.
user7417

Yanıtlar:


7

Zaten R randomForest kütüphanesinde paketlenmiş olduğunu fark etmeden önce kendi "partial.function-plotter" ı yazmak için biraz zaman harcadım.

[DÜZENLEME ... ama sonra CRAN paket ormanı yapmak için bir yıl geçirdim ki bu benim görüşüme göre klasik kısmi bağımlılık alanlarından çok daha iyi]

Burada açıkladığınız değişkenin diğer değişkenlerle etkileşime girmediği bu simülasyon örneği olarak kısmi işlev grafiği örnek olarak mükemmeldir. Açıklayan her değişken bilinmeyen bir fonksiyon tarafından hedef-Y'ye katkıda bulunursa, bu yöntem tahmini gizli fonksiyonun gösterilmesinde harikadır. Kısmi işlevlerin sınırlarında sık sık böyle bir düzleşme görüyorum.

Bazı nedenler: randomForsest'in 'nodesize = 5' adlı bir argümanı vardır, bu da hiçbir ağacın 5 veya daha az üyeden oluşan bir grubu alt bölümlere ayırmayacağı anlamına gelir. Bu nedenle her ağaç daha fazla hassasiyetle ayırt edilemez. Ensemple'ın torbalama / önyükleme katmanı, tek tek ağaçların birçok adım fonksiyonunu oylayarak pürüzsüzleştirir - ancak sadece veri bölgesinin ortasında. Alanı temsil eden verilerin sınırlarına yaklaşıldığında, kısmi işlevin 'genliği' düşecektir. Düğüm boyutu = 3 ayarı yapmak ve / veya gürültüye kıyasla daha fazla gözlem almak bu kenar düzleştirme etkisini azaltabilir ... Sinyal / gürültü oranı genel olarak rasgele ormanda düştüğünde tahminler ölçeği yoğunlaşır. Dolayısıyla tahminler kesinlikle doğru terimler değildir, sadece hedefle doğrusal olarak ilişkilidir. A ve b değerlerini çok düşük sinyal / gürültü oranına örnek olarak görebilirsiniz. bu nedenle bu kısmi fonksiyonlar çok düzdür. Rastgele ormanın güzel bir özelliği, halihazırda eğitim seti tahminlerinden, modelin ne kadar iyi performans gösterdiğini tahmin edebilirsiniz. OOB.predictions da harika ..

veri bulunmayan bölgelerde kısmi grafiğin düzleştirilmesi mantıklıdır: Rasgele orman ve CART veri odaklı modelleme olduğundan, bu modellerin ekstrapolasyon yapmadığı kavramını şahsen seviyorum. Dolayısıyla, c = 500 veya c = 1100 tahmini, c = 100 ile tamamen aynıdır veya çoğu durumda da c = 98'dir.

İşte sınır düzleştirme azaltılmış bir kod örneği:

Gbm paketini denemedim ...

İşte eaxample dayalı bazı açıklayıcı kod ...

#more observations are created...
a <- runif(5000, 1, 100)
b <- runif(5000, 1, 100)
c <- (1:5000)/50 + rnorm(100, mean = 0, sd = 0.1)
y <- (1:5000)/50 + rnorm(100, mean = 0, sd = 0.1)
par(mfrow = c(1,3))
plot(y ~ a); plot(y ~ b); plot(y ~ c)
Data <- data.frame(matrix(c(y, a, b, c), ncol = 4))
names(Data) <- c("y", "a", "b", "c")
library(randomForest)
#smaller nodesize "not as important" when there number of observartion is increased
#more tress can smooth flattening so boundery regions have best possible signal to             noise, data specific how many needed

plot.partial = function() {
partialPlot(rf.model, Data[,2:4], x.var = "a",xlim=c(1,100),ylim=c(1,100))
partialPlot(rf.model, Data[,2:4], x.var = "b",xlim=c(1,100),ylim=c(1,100))
partialPlot(rf.model, Data[,2:4], x.var = "c",xlim=c(1,100),ylim=c(1,100))
}

#worst case! : with 100 samples from Data and nodesize=30
rf.model <- randomForest(y ~ a + b + c, data = Data[sample(5000,100),],nodesize=30)
plot.partial()

#reasonble settings for least partial flattening by few observations: 100 samples and nodesize=3 and ntrees=2000
#more tress can smooth flattening so boundery regions have best possiblefidelity
rf.model <- randomForest(y ~ a + b + c, data = Data[sample(5000,100),],nodesize=5,ntress=2000)
plot.partial()

#more observations is great!
rf.model <- randomForest(y ~ a + b + c,
 data = Data[sample(5000,5000),],
 nodesize=5,ntress=2000)
plot.partial()

4

Yukarıdaki yorumlarda belirtildiği gibi, gbm modeli bazı parametre ayarlamalarında daha iyi olacaktır. Modeldeki problemleri tespit etmenin kolay bir yolu ve bu parametrelere duyulan ihtiyaç bazı teşhis grafikleri oluşturmaktır. Örneğin, yukarıdaki varsayılan parametrelerle (ve grafikleri oluşturmak için plotmo paketini kullanarak) yukarıdaki gbm modeli için

gbm.gaus <- gbm(y~., data = Data, dist = "gaussian")
library(plotmo)   # for the plotres function
plotres(gbm.gaus) # plot the error per ntrees and the residuals

hangi verir

arsa

Soldaki grafikte hata eğrisinin dibe vurulmadığını görüyoruz. Ve sağ el planında artıklar istediğimiz şey değil.

Modeli daha fazla sayıda ağaçla yeniden inşa edersek

gbm.gaus1 <- gbm(y~., data = Data, dist = "gaussian",
                 n.trees=5000, interact=3)
plotres(gbm.gaus1)

aldık

arsa

Hata eğrisinin çok sayıda ağaçla birlikte aşağı doğru olduğunu görüyoruz ve artıklar grafiği daha sağlıklı. Ayrıca yeni gbm modeli ve rastgele orman modeli için kısmi bağımlılık grafikleri çizebiliriz

library(plotmo)
plotmo(gbm.gaus1, pmethod="partdep", all1=TRUE, all2=TRUE)
plotmo(rf.model,  pmethod="partdep", all1=TRUE, all2=TRUE)

hangi verir

arsa

Gbm ve rastgele orman modeli grafikleri şimdi beklendiği gibi benzer.


3

interaction.depthArtırılmış modelinizi oluştururken parametrenizi güncellemeniz gerekir . Varsayılan olarak 1'dir ve bu, gbmalgoritmanın oluşturduğu tüm ağaçların yalnızca bir kez bölünmesine neden olur . Bu, her ağacın sadece değişkene ayrıldığı cve kullandığı gözlem örneğine bağlı olarak 40-60 civarında bir yere ayrılacağı anlamına gelir.

İşte kısmi parseller interaction.depth = 3

resim açıklamasını buraya girin


iyi bir nokta, öyle
Soren Havelund Welling
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.