Rastgele bir ormandan bilgi edinmek


127

Rastgele ormanlar kara kutu olarak kabul edilir, ancak son zamanlarda rastgele bir ormandan hangi bilgilerin elde edilebileceğini düşünüyordum?

En belirgin şey değişkenlerin önemidir, en basit değişkende, sadece değişkenlerin oluşum sayısını hesaplayarak yapılabilir.
Düşündüğüm ikinci şey etkileşimler. Ağaç sayısı yeterince büyükse, o zaman değişken çiftlerinin oluşum sayısının test edilebildiğini düşünüyorum (ki kare bağımsızlık gibi bir şey). Üçüncü şey değişkenlerin doğrusal olmayanlarıdır. İlk fikrim, sadece değişken Vs skorunun bir grafiğine bakmaktı, ancak bunun bir anlam ifade edip etmediğinden emin değilim.

Eklendi 23.01.2012
Motivasyon

Bu bilgiyi logit modelini geliştirmek için kullanmak istiyorum. Bence (veya en azından umarım) göz ardı edilen etkileşimleri ve doğrusal olmayanları bulmanın mümkün olduğunu düşünüyorum.


1
R kullanarak , bir Rastgele Orman tarafından ölçülen, değişken öneme sahip bir Nokta Grafiği oluşturabilirsiniz.
George Dontas

1
Stokastik gradyan ağacının güçlendirilmesi için değişken önem önlemlerinin nasıl hesaplandığı ile ilgili bir konu
Antoine

Bunun muhtemelen çok geç olduğunun farkındayım, ancak sadece bir logit modelini geliştirmek istiyorsanız, neden kement sonrası lojistik regresyon kullanmıyorsunuz? Seçmiş olduğunuz katsayıları cezalandırma / küçülme olmadan seçtikten sonra tekrar takabilirsiniz. Ayarlama prosedürünü biraz değiştirmek zorunda kalacaksınız, ancak bu tam olarak istediğiniz şeyi yapan daha doğrudan bir seçenektir.
ilprincipe

Yanıtlar:


122

Rastgele Ormanlar pek kara kutu değildir. Yorumlanması çok kolay olan karar ağaçlarına dayanırlar:

#Setup a binary classification problem
require(randomForest)
data(iris)
set.seed(1)
dat <- iris
dat$Species <- factor(ifelse(dat$Species=='virginica','virginica','other'))
trainrows <- runif(nrow(dat)) > 0.3
train <- dat[trainrows,]
test <- dat[!trainrows,]

#Build a decision tree
require(rpart)
model.rpart <- rpart(Species~., train)

Bu basit bir karar ağacına neden olur:

> model.rpart
n= 111 

node), split, n, loss, yval, (yprob)
      * denotes terminal node

1) root 111 35 other (0.68468468 0.31531532)  
  2) Petal.Length< 4.95 77  3 other (0.96103896 0.03896104) *
  3) Petal.Length>=4.95 34  2 virginica (0.05882353 0.94117647) *

Petal.Length <4.95 ise, bu ağaç gözlemi "diğer" olarak sınıflandırır. 4.95'ten büyükse, gözlemi “virginica” olarak sınıflandırır. Rastgele bir orman, her biri verinin rastgele bir alt kümesinde eğitildiği, bu tür birçok ağacın toplanması basittir. Her ağaç daha sonra her gözlemin son sınıflandırmasına "oy verir".

model.rf <- randomForest(Species~., train, ntree=25, proximity=TRUE, importance=TRUE, nodesize=5)
> getTree(model.rf, k=1, labelVar=TRUE)
  left daughter right daughter    split var split point status prediction
1             2              3  Petal.Width        1.70      1       <NA>
2             4              5 Petal.Length        4.95      1       <NA>
3             6              7 Petal.Length        4.95      1       <NA>
4             0              0         <NA>        0.00     -1      other
5             0              0         <NA>        0.00     -1  virginica
6             0              0         <NA>        0.00     -1      other
7             0              0         <NA>        0.00     -1  virginica

Tek tek ağaçları rf'den bile çıkarabilir ve yapılarına bakabilirsiniz. Biçim, rpartmodellerden biraz farklıdır , ancak istediğinizde her bir ağacı inceleyebilir ve verileri nasıl modellediğini görebilirsiniz.

Ayrıca, hiçbir model tam anlamıyla kara bir kutu değildir, çünkü veri kümesindeki her değişken için öngörülen yanıtları ve gerçek yanıtları inceleyebilirsiniz. Ne tür bir model oluşturduğunuzdan bağımsız olarak bu iyi bir fikirdir:

library(ggplot2)
pSpecies <- predict(model.rf,test,'vote')[,2]
plotData <- lapply(names(test[,1:4]), function(x){
  out <- data.frame(
    var = x,
    type = c(rep('Actual',nrow(test)),rep('Predicted',nrow(test))),
    value = c(test[,x],test[,x]),
    species = c(as.numeric(test$Species)-1,pSpecies)
    )
  out$value <- out$value-min(out$value) #Normalize to [0,1]
  out$value <- out$value/max(out$value)
  out
})
plotData <- do.call(rbind,plotData)
qplot(value, species, data=plotData, facets = type ~ var, geom='smooth', span = 0.5)

arsa

Değişkenleri (sepal ve petal uzunluk ve genişlik) 0-1 aralığına normalleştirdim. Tepki ayrıca 0-1, ki burada 0 diğer ve 1 virginica'dır. Gördüğünüz gibi rastgele orman, test setinde bile iyi bir model.

Ek olarak, rastgele bir orman, çok bilgilendirici olabilen çeşitli değişken önem derecesini hesaplayacaktır:

> importance(model.rf, type=1)
             MeanDecreaseAccuracy
Sepal.Length           0.28567162
Sepal.Width           -0.08584199
Petal.Length           0.64705819
Petal.Width            0.58176828

Bu tablo, her değişkeni kaldırmanın modelin doğruluğunu ne kadar azalttığını gösterir. Son olarak, kara kutuda neler olup bittiğini görmek için rastgele bir orman modelinden yapabileceğiniz birçok çizim var:

plot(model.rf)
plot(margin(model.rf)) 
MDSplot(model.rf, iris$Species, k=5)
plot(outlier(model.rf), type="h", col=c("red", "green", "blue")[as.numeric(dat$Species)])

Ne gösterdikleri hakkında daha iyi bir fikir edinmek için bu işlevlerin her biri için yardım dosyalarını görüntüleyebilirsiniz.


6
Cevabınız için teşekkürler, birçok yararlı bilgi var, fakat tam olarak aradığım şey bu değil. Belki de bu sorunun arkasındaki motivasyonu daha iyi netleştirmem gerekiyor. Logit modelini geliştirmek için rastgele bir orman kullanmak istiyorum, geliştirerek bazı etkileşimler eklemek veya doğrusal olmayan bir dönüşüm kullanmak demek istiyorum.
Tomek Tarczynski,

@TomekTarczynski bu ilginç bir problem ve şu anda uğraştığım birine benzer. "Logit model" ile lojistik regresyon veya benzeri bir şey mi demek istediniz? Tüm değişken çiftleri arasındaki etkileşimi gösteren bir modelden tahmincileri seçmek için (glmnet R paketinden) serbest lojistik regresyon kullanıyorum. Henüz doğrusal olmayan terimler eklemedim - ama prensipte de mümkün olmalı. Sanırım tek sorun hangi doğrusal olmayan terimlerin deneneceğine karar vermek (polinom terimleri, üstel dönüşümler, vb.). Ayrıca, daha yüksek dereceli etkileşimler alıyorum ama bu da kolay.
Anne Z.

2
@ Tomek, bu cevaptan ne alamadın? R'de randomForest paketini kullanıyorsanız, Zach'in açıkladığı grafikler çok yararlı olmalıdır. Özellikle, logit modelinizde özellik seçimi için varImpPlot ve logit modelinde sürekli kestiriciler denemek üzere dönüşüm türünü tahmin etmek için partialPlot kullanabilirsiniz. İkinci grafiğin, yordayıcı ve yanıt arasındaki doğrusal olmayan ilişkilerin nerede olduğunu belirlemek için kullanıldığını ve daha sonra bu dönüşümü açıkça yapmanızı veya bu değişken üzerinde bir spline kullanmanıza izin vermesini öneririm.
B_Miner

2
@b_miner - sadece bir tahmin, ama tomek'e benziyor, değişkenler arasındaki doğrusal olmayan etkileşimlerin nasıl bulunacağını soruyor çünkü lojistik regresyon zaten doğrusal ilişkileri yakalar.
rm999

@ rm999 Logit modelinde doğrusal olmayan bir etkileşimi nasıl tanımlarsınız? Dönüştürülen değişkenler arasında oluşturulan etkileşim terimleri?
B_Miner

52

Bir süre önce şirketimdeki bazı kimyagerler için bir RF modelinin uygun olduğunu doğrulamak zorunda kaldım. Farklı görselleştirme teknikleri denemek için oldukça zaman harcadım. İşlem sırasında, yanlışlıkla bir R paketine koyduğum bazı yeni tekniklerle de rastladım ( forestFloor) rastgele orman görselleştirmeleri için ) .

Klasik yaklaşım, aşağıdakiler tarafından desteklenen kısmi bağımlılık grafikleridir: Rminer (veri tabanlı duyarlılık analizi kısmi bağımlılığı yeniden yaratılmıştır) veya randomForest paketinde kısmi Plot . İceBOX'ın kısmi bağımlılık paketini etkileşimleri keşfetmenin zarif bir yolu olarak görüyorum . Kullanmadıysanız paketi edarf ancak RF için adanmış bazı ince görselleştirme var gibi görünüyor. GgRandomForest paketi de yararlı görsel büyük bir kümesini içerir.

Şu anda forestFloor randomForest nesnelerini destekler (diğer RF uygulamaları için destek yolda). Ayrıca, eğim artırılmış ağaçlar için, eğitim sonrası bu ağaçlar rastgele orman ağaçlarından çok farklı olmadığından, özellik katkıları hesaplanabilir. Yani forestFloor gelecekte XGBoost'u destekleyebilir. Kısmi bağımlılık grafikleri tamamen model değişmezdir.

y=F(X)f1(x1)+f2(x2)+...+fd(xd)

In Bu yazıda , ben çok küçük bir RF modeli yakalamıştı biyokimyasal fiili neyi ilişki açıklamaya forestFloor bir çok erken versiyonunu kullandı. Bu yazıda, özellik katkılarının görselleştirmelerini, Rastgele Ormanların Orman Zemini Görselleştirmelerini ayrıntılı olarak açıklıyoruz .

y=x12+sin(x2π)+2x3x4+

#1 - Regression example:
set.seed(1234)
library(forestFloor)
library(randomForest)

#simulate data y = x1^2+sin(x2*pi)+x3*x4 + noise
obs = 5000 #how many observations/samples
vars = 6   #how many variables/features
#create 6 normal distr. uncorr. variables
X = data.frame(replicate(vars,rnorm(obs)))
#create target by hidden function
Y = with(X, X1^2 + sin(X2*pi) + 2 * X3 * X4 + 0.5 * rnorm(obs)) 

#grow a forest
rfo = randomForest(
  X, #features, data.frame or matrix. Recommended to name columns.
  Y, #targets, vector of integers or floats
  keep.inbag = TRUE,  # mandatory,
  importance = TRUE,  # recommended, else ordering by giniImpurity (unstable)
  sampsize = 1500 ,   # optional, reduce tree sizes to compute faster
  ntree = if(interactive()) 500 else 50 #speedup CRAN testing
)

#compute forestFloor object, often only 5-10% time of growing forest
ff = forestFloor(
  rf.fit = rfo,       # mandatory
  X = X,              # mandatory
  calc_np = FALSE,    # TRUE or FALSE both works, makes no difference
  binary_reg = FALSE  # takes no effect here when rfo$type="regression"
)


#plot partial functions of most important variables first
plot(ff,                       # forestFloor object
     plot_seq = 1:6,           # optional sequence of features to plot
     orderByImportance=TRUE    # if TRUE index sequence by importance, else by X column  
)

görüntü tanımını buraya girin

#Non interacting features are well displayed, whereas X3 and X4 are not
#by applying color gradient, interactions reveal themself 
#also a k-nearest neighbor fit is applied to evaluate goodness-of-fit
Col=fcol(ff,3,orderByImportance=FALSE) #create color gradient see help(fcol)
plot(ff,col=Col,plot_GOF=TRUE) 

görüntü tanımını buraya girin

#feature contributions of X3 and X4 are well explained in the context of X3 and X4
# as GOF R^2>.8


show3d(ff,3:4,col=Col,plot_GOF=TRUE,orderByImportance=FALSE)

görüntü tanımını buraya girin görüntü tanımını buraya girin

Son olarak, J. Friedman tarafından açıklanan A.Liaw tarafından kodlanan kısmi bağımlılık grafikleri kodu. Ana etkiler için para cezası.

par(mfrow=c(2,3))
for(i in 1:6) partialPlot(rfo,X,x.var=names(X)[i])

görüntü tanımını buraya girin


Önceden, güçlendirilmiş ağaçlar için özellik katkılarının da hesaplanabileceğini düşündüm. Bir test algoritması yazdım ve bu mümkün. Ne yazık ki, yükseltilmiş ağaçlar için özellik katkıları, torbalanmış ağaçlarla aynı yararlı özellikleri göstermez. Bir özelliğin etkileri, tüm özellik katkılarına dağılma eğilimindedir, bu nedenle görselleştirme oldukça kafa karıştırıcı hale gelir.
Soren Havelund Welling

Oups! Test algoritmamda tüm sorunları çözen bir hata buldum. forestFloor, degrade yükseltilmiş ağaçlar için gayet iyi çalışacak şekilde güncellenebilir.
Soren Havelund Welling

3
forestFloor, gbm nesnelerini kabul edecek şekilde güncellendi?
Misha

Şimdiye kadar randomForest uygulamasını tamamen işlevsel bir gradyan artırma makinesine sarar ve özellik katkılarını hesaplamak için bazı yöntemler tanımlayan ters bir uygulama yaptım. Bence uygulama aslında makul derecede verimli. Kodu burada bulabilirsiniz: github.com/sorhawell/forestFloor/blob/master/inst/examples/…
Soren Havelund Welling

Tam liman yapmak zor bir iştir :) Bu uygulama epeyce satırda yapıldı.
Soren Havelund Welling,

24

Bu iyi yanıtları desteklemek için, degrade yükseltilmiş ağaçların kullanılmasından bahsedeceğim (örn . R'deki GBM Paketi ). R'de, bunu rasgele ormanlara tercih ederim, çünkü emporasyonun gerekli olduğu durumlarda randomForest ile karşılaştırıldığında eksik değerlere izin verilir. Logit modelinizde özellik seçimi ve doğrusal olmayan dönüşüm araştırmasına yardımcı olmak için değişken önem ve kısmi çizimler mevcuttur (randomForest'teki gibi). Ayrıca, değişken etkileşimi, Friedman's H-istatistiği ( interact.gbm) ile verilen referans ile ele alınmıştır J.H. Friedman and B.E. Popescu (2005). “Predictive Learning via Rule Ensembles.” Section 8.1. TreeNet adlı ticari bir sürüm Salford Systems'dan edinilebilir ve bu video sunumu değişken etkileşim kestirim Videolarını ele almayı konuşuyor .


2
Katılıyorum, GBM'ler rastgele ormanlardan bir sonraki adım mantıklı.
Zach

@ B_miner: Harika! Nasıl bilmiyorum ama GBM'yi gözden kaçırdım. GBM kullanarak, etkileşimleri ve doğrusal olmayanları tespit etmek kolaydır.
Tomek Tarczynski

15

Geç cevap, ancak forestFloorotomatik olarak bu "unblackboxing" görevini yapmanıza yardımcı olan yeni bir R paketine (2015) rastladım. Çok umut verici görünüyor!

library(forestFloor)
library(randomForest)
#simulate data
obs=1000
vars = 18
X = data.frame(replicate(vars,rnorm(obs)))
Y = with(X, X1^2 + sin(X2*pi) + 2 * X3 * X4 + 1 * rnorm(obs))
#grow a forest, remeber to include inbag
rfo=randomForest(X,Y,keep.inbag = TRUE,sampsize=250,ntree=50)
#compute topology
ff = forestFloor(rfo,X)
#ggPlotForestFloor(ff,1:9)
plot(ff,1:9,col=fcol(ff))

Aşağıdaki arazileri üretir:

görüntü tanımını buraya girin

Ayrıca etkileşimler arıyorsanız üç boyutlu görselleştirme sağlar.


4
Son satırın yerine ggplot2 desteğini kaldırdım, örneğin: plot (ff, 1: 9, col = fcol (ff, 1: 4))
Soren Havelund Welling

9

Zach'in dediği gibi, bir modeli anlamanın bir yolu, tahminleri değişkenlik gösterdikçe yanıtı çizmektir. Plotmo R paketi ile bunu “herhangi” bir model için kolayca yapabilirsiniz . Örneğin

library(randomForest)
data <- iris
data$Species <- factor(ifelse(data$Species=='virginica','virginica','other'))
mod <- randomForest(Species~Sepal.Length+Sepal.Width, data=data)
library(plotmo)
plotmo(mod, type="prob")

hangi verir

arsa

Bu, diğerlerini ortanca değerlerinde tutarken bir değişkeni değiştirir. Etkileşim grafikleri için iki değişken değiştirir. (Not Kasım 2016'da eklendi: plotmoşimdi kısmi bağımlılık alanlarını da destekliyor.)

Yukarıdaki örnek sadece iki değişken kullanır; daha karmaşık modeller, bir seferde bir veya iki değişkene bakarak parçalı bir şekilde görselleştirilebilir. "Diğer" değişkenler medyan değerlerinde tutulduğundan, bu sadece verilerin bir dilimini gösterir, ancak yine de faydalı olabilir. Bazı örnekler , plotmo paketi için skeçtedir . Diğer örnekler , rpart.plot paketi ile rpart ağaçlarının çizilmesidir .


4

Bu tür sorularla kendim çok ilgileniyorum. Rastgele bir ormandan elde edebileceğimiz çok fazla bilgi olduğunu düşünüyorum.

Etkileşimler hakkında, Breiman ve Cultier'in özellikle RF sınıflandırmaları için zaten araştırmaya çalıştıkları görülüyor.

Bildiğim kadarıyla, bu randomForest R paketinde uygulanmadı. Belki de bu kadar basit olmayabilir ve "değişken etkileşimler" in anlamı sizin sorununuza çok bağlı olduğu için.

Doğrusal olmayanlık hakkında, ne aradığınızdan emin değilim, regresyon ormanı, doğrusal olmayan bir fonksiyonun ne tür bir kullanılacağına ilişkin herhangi bir öncelik olmadan doğrusal olmayan çoklu regresyon problemleri için kullanılır.


3

Oyunun sonlarında ancak bu cephede bazı yeni gelişmeler var, örneğin LIME ve SHAP . Ayrıca kontrol etmeye değer bir paket DALEX'tir (özellikle R kullanıyorsanız ancak her durumda güzel kopya kağıtları içeriyorsa vs.), ancak şu anda etkileşimleri kapsamaz. Bunların hepsi model agnostiktir, bu nedenle rastgele ormanlar, GBM'ler, sinir ağları vb. İçin çalışacaktır.


(+1) Güzel kaynaklar!
mkt

2

Veriler hakkında daha fazla bilgi sağlayan rastgele ormanlarda yapılan küçük bir değişiklik, yakın zamanda geliştirilen nedensel orman yöntemleridir. Bkz GRF R-paket ve motive edici kağıdı burada . Fikir, nedensel etkilerde heterojeniteyi bulmak için rastgele orman temel yöntemlerini kullanmaktır.

Daha önceki bir makale ( burada ) basit bir nedensel ormana ayrıntılı bir yaklaşım sunmaktadır. Makalenin 9. sayfasında, nedensel bir ağacın yetiştirilmesi için adım adım bir prosedür uygulanmaktadır ve bu daha sonra her zamanki gibi bir ormana genişletilebilmektedir.Athey and Wager 2017'in Sayfa 9'undan Alındı

Denklem 4:

Denklem 4

Denklem 5: Denklem 5


1
Nedensel ağaç prosedürünü göstermek için önceki kağıda bağlantılar ve bu kağıdın ekran görüntüleri ile güncellendi.
gannawag

1

Buradaki sorumumla ilgili geç cevap ( Rastgele Orman tohumunu sabitleyerek% 100 yorumlanabilir hale getirebilir miyiz? ):

z1z2

  1. z1mD1(z1)D2(z1)D3(z1)Dm(z1)
  2. mT1(z1,z2)T2(z1,z2)T3(z1,z2)Tm(z1,z2)
  3. jth(j=1,2,...,m)xif^j(xi)(in,jm)
    F^(xi)=>1mj=1mf^j(xi)
  4. F^(xi)(z1,z2)xi
  5. xi
    x1F^(x1) - which is fixed> thanks to (z1,z2)
    x2F^(x2) -> which is fixed thanks to (z1,z2)
    x3→>F^(x3) - which is fixed thanks to (z1,z2)
    x4>→F^(x4) - which is fixed thanks to (z1,>z2)
    ....
  6. x1x2

Bu, ağaçların toplanmasına dayanan her topluluk yöntemi için de geçerlidir.

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.