Bir yayında rastgele bir orman sunmanın en iyi yolu?


75

Rastgele orman algoritmasını, iki grubun sağlam bir sınıflandırıcısı olarak, 1000'li özelliklere sahip bir mikro dizi çalışmasında kullanıyorum.

  • Rastgele ormanı sunmanın en iyi yolu nedir, böylece bir makalede tekrarlanabilir kılmak için yeterli bilgi olacak?
  • Az sayıda özellik varsa, aslında ağacı çizmek için R'de bir çizim yöntemi var mı?
  • OOB hata oranı tahmini için en uygun istatistik nedir?

2
Tek bir ağaç yok ... Fakat bkz. @ Shane, bunlardan birini açıklayıcı amaç için çizmek için verilen cevabı görüyor.
chl

Kesinlikle randomForest :: partialPlot, stats.stackexchange.com/questions/92150/…
Soren Havelund Welling

1
rastgele orman görselleştirme paketimi deneyebilirsiniz, forestFloor - forestfloor.dk
Soren Havelund Welling

Yanıtlar:


48

Tekrarlanabilir kılmakla ilgili olarak, en iyi yol, makale ile birlikte tekrarlanabilir araştırma (örn. Kod ve veri) sağlamaktır . Web sitenizde veya bir barındırma sitesinde (github gibi) kullanıma sunun.

Görselleştirme ile ilgili olarak, Leo Breiman bu konuda bazı ilginç çalışmalar yaptı ( ana sayfasını , özellikle grafikler bölümüne bakınız ).

Ancak R kullanıyorsanız, randomForestpaketin bazı yararlı işlevleri vardır:

data(mtcars)
mtcars.rf <- randomForest(mpg ~ ., data=mtcars, ntree=1000, keep.forest=FALSE,
                           importance=TRUE)
plot(mtcars.rf, log="y")
varImpPlot(mtcars.rf)

Ve

set.seed(1)
data(iris)
iris.rf <- randomForest(Species ~ ., iris, proximity=TRUE,
                        keep.forest=FALSE)
MDSplot(iris.rf, iris$Species)

Gerçekten bir ağacı çizmenin basit bir yolunun farkında değilim, ancak getTreeağacı almak ve ayrı ayrı çizmek için işlevi kullanabilirsiniz .

getTree(randomForest(iris[,-5], iris[,5], ntree=10), 3, labelVar=TRUE)

“Neden ve nasıl rasgele orman değişken önem tedbirleri (ve nasıl kullanmamalısınız)” kullanımı üzerine verilen Strobl / Zeileis sunumunun, bu şekilde üretilmiş ağaç örnekleri vardır. Ağaç modelleriyle ilgili bu blog yazısında, örneğin kullanabileceğiniz bazı CART ağacı çizimleri örnekleri var.

@Chl'ın yorumladığı gibi, tek bir ağaç bu bağlamda özellikle anlamlı değildir, bu yüzden rastgele bir ormanın ne olduğunu açıklamak için kullandığımda, bunu bir makaleye dahil etmem.


4
plot.randomForestAlanlar hakkında küçük uzantı: artan ağaç sayısıyla birlikte OOB hatası ve sınıf içi OOB hatasının nasıl geliştiğini gösterir; RF nesnesi yakınlık ölçüsünün 2B izdüşümünde çizilen tüm nesneler varImpPlotve MDSplottüm nesneler için özellik önem önlemlerini gösterir .

MDSplot()Fonksiyonu göstermek için +1 . En iyi özellikleri seçmek yerine, RF'leri birey kümelerini (RF yakınlık ölçütüne dayanarak) vurgulamanın bir yolu olarak kullandığımı itiraf etmeliyim. Klinisyenler genellikle bu tür arsaları var. önemi ...
chl

18
  1. Shane'nin yazdığı gibi; RF, stokastik olduğu için tekrarlanabilir araştırmayı + rastgele tohumları içerir.
  2. Her şeyden önce, RF oluşturan tek ağaçları çizmek saçmalıktır; bu bir topluluk sınıflandırıcısıdır, sadece bir bütün olarak anlam ifade eder. Ancak bütün ormanın çizilmesi bile saçmalıktır - kara kutu sınıflandırıcısıdır, bu nedenle verileri orijinal süreci kopyalamak yerine yapısıyla açıklamak amaçlanmamıştır. Bunun yerine, Shane'in önerdiği parselleri yapın.
  3. Uygulamada, OOB çok iyi bir hata yaklaşımıdır; Yine de, bu yaygın olarak kabul edilen bir gerçek değildir, bu nedenle yayın için onaylamak için bir özgeçmiş hazırlamak daha iyidir.

Yani bir CV yaparken @ mbq, ilk olarak seçilen tüm örnekleri seçerek rastgele bir orman yapmak geçerlidir; iki kere bir kez tümüyle ve ikinci olarak ilk 10 değişkenle (bir kâğıtta alıntı yapılabilir). O zaman bir tane dışarıda bırakma çapraz doğrulama yapın (her biri denediği en iyi 10 geni seçerek) ve bundan CV özeti alın.
danielsbrewer

1
@ danielsbrewer Bunu başka bir şekilde yapardım (özellik seçimine daha fazla dikkat ederek), ancak bu doğrudur; Yine de, biyolojik probleminiz için en iyi belirteçleri seçmek yerine, RF özellik seçimi seçiminde daha fazla bir şey var.

2
Asıl sorun, iki modeli (model = öğrenme yöntemi + özellik seçim yöntemi) karşılaştırmanın gerçekten zor olmasıdır, ancak basitlik için sadece bir şey varsayabilir (RF kullanacağım ve en iyi 10 özelliği seçeceğim gibi) ve bildiğinizi itiraf edebilirsiniz. bunun yetersiz olabileceğini, ancak örneğin hassasiyetten memnun kaldığınızda buna katılıyorsunuz. Bu durumda tek sorun, nitelik seçiminin önyargısını ortadan kaldırmaktır. tbc.

2
Bu yüzden basit bir torbalama yapacağım: nesnelerin rastgele alt örneklerini (değiştirmeyle rastgele seçerek söyleyelim) 10 (veya 30'lu bir bilgisayar) yaratırsınız, her birine RF ekler, önemini alır ve her birinin sıralamasını geri döndürürsünüz. tüm tekrarlar üzerinden ortalama alan öznitelik (en iyi öznitelik 1, ikinci en iyi 2 vb. değer alır; bu değerin ortalaması alınabilir; böylece 12 kez 1. ve 18 kez 2. olan özellik 1.6 olarak sıralanır), nihayet en iyi sırada 10 seçip bunları çağırın İşaretçilerin. Ardından, işaretleyicilerinizi kullanarak RF'nin bir hata yaklaşımı elde etmek için bir CV (LOO, 10 kat veya tercihen rasgele örnekleme) kullanın. tbc.

2
Sıraları rapor et (umarım yaklaşık 1,2,3 ... olmalı), sapmasıyla CV hatası (sadece her CV turunun sonuçlarının standart sapmasını say) ve OOB hatası (muhtemelen CV hatası ile aynı olacaktır). YASAL UYARI: Bu, optimal sayıda özellik seçmek için bir yöntem değildir - bunu yapmak için RFE'ye ve iç içe geçmiş CV'ye ihtiyacınız vardır. YASAL UYARI 2: Böyle bir veriyle çalışmadım, bu yüzden hakemlerinizin bundan mutlu olacağını garanti etmiyorum (olması gerektiğine inanıyorum).

13

Arsa ile ilgili diğer cevaplardaki uyarıları mutlaka anlamlı bir şekilde aklınızda bulundurun. Ancak açıklayıcı / pedagojik amaçlar için bir arsa istiyorsanız, aşağıdaki R pasajı faydalı olabilir. Gerekirse kenar metne "ayırma noktası" eklemek zor değildir.

to.dendrogram <- function(dfrep,rownum=1,height.increment=0.1){

  if(dfrep[rownum,'status'] == -1){
    rval <- list()

    attr(rval,"members") <- 1
    attr(rval,"height") <- 0.0
    attr(rval,"label") <- dfrep[rownum,'prediction']
    attr(rval,"leaf") <- TRUE

  }else{##note the change "to.dendrogram" and not "to.dendogram"
    left <- to.dendrogram(dfrep,dfrep[rownum,'left daughter'],height.increment)
    right <- to.dendrogram(dfrep,dfrep[rownum,'right daughter'],height.increment)
    rval <- list(left,right)

    attr(rval,"members") <- attr(left,"members") + attr(right,"members")
    attr(rval,"height") <- max(attr(left,"height"),attr(right,"height")) + height.increment
    attr(rval,"leaf") <- FALSE
    attr(rval,"edgetext") <- dfrep[rownum,'split var']
    #To add Split Point in Dendrogram
    #attr(rval,"edgetext") <- paste(dfrep[rownum,'split var'],"\n<",round(dfrep[rownum,'split point'], digits = 2),"=>", sep = " ")
  }

  class(rval) <- "dendrogram"

  return(rval)
}

mod <- randomForest(Species ~ .,data=iris)
tree <- getTree(mod,1,labelVar=TRUE)

d <- to.dendrogram(tree)
str(d)
plot(d,center=TRUE,leaflab='none',edgePar=list(t.cex=1,p.col=NA,p.lty=0))

1
Kod çok iyi ağaç arsa üretir. Ancak değerler görüntülenmiyor. Muhtemelen bir text () fonksiyonunun last (plot) ifadesinden sonra eklenmesi gerekir.
rnso
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.