Rastgele Orman modelinin öngörüleri tahmin aralığına sahip mi?


52

Bir randomForestmodel çalıştırırsam , o zaman modele dayalı tahminler yapabilirim. Modelin cevabının ne kadar “kesin” olduğunu bildiğim için tahminlerin her birinin tahmin aralığını elde etmenin bir yolu var mı? Bu mümkünse, tüm model için bağımlı değişkenin değişkenliğine dayanıyor mu, yoksa belirli bir tahmin için takip edilen belirli karar ağacına bağlı olarak daha geniş ve daha dar aralıklara sahip olacak mı?


3
AFAIK, tüm RF kütüphanelerinin scoreperformansı değerlendirmek için bir tür işlevi vardır. Çıktı ormandaki ağaçların çoğunluğunun oyuna dayandığından, sınıflandırma durumunda bu sonucun oy dağılımına bağlı olarak doğru olma olasılığını verecektir. Gerileme hakkında emin değilim ama ... Hangi kütüphaneyi kullanıyorsunuz?
sashkello

Yanıtlar:


40

Bu kısmen @Sashikanth Dareddy'nin (bir yoruma uymayacağından dolayı) bir yanıtı ve kısmen de orijinal yazıya verilen bir cevaptır.

Bir tahmin aralığının ne olduğunu hatırlayın, gelecekteki gözlemlerin yatacağını tahmin ettiğimiz bir aralık ya da değerler kümesidir. Genel olarak tahmin aralığı, genişliğini belirleyen 2 ana parçaya, tahmin edilen ortalama (veya diğer parametrelere) ilişkin belirsizliği temsil eden bir parçaya, bu da güven aralığı kısmıdır ve bu ortalama etrafındaki bireysel gözlemlerin değişkenliğini temsil eden bir parçaya sahiptir. Güven aralığı, Merkezi Limit Teoreminden dolayı peri sağlamdır ve rastgele bir orman durumunda, bootstrapping da yardımcı olur. Ancak tahmin aralığı, tahmin değişkenleri, CLT ve bootstrapping işlemlerinin bu kısım üzerinde hiçbir etkisi olmadığından verinin nasıl dağıtıldığı konusundaki varsayımlara tamamen bağlıdır.

Tahmin aralığı, ilgili güven aralığının da geniş olacağı yerlerde daha geniş olmalıdır. Tahmin aralığının genişliğini etkileyebilecek diğer şeyler, eşit sapma ya da olmama hakkındaki varsayımlardır, bunun rasgele orman modeli değil araştırmacının bilgisinden gelmesi gerekir.

Bir tahmin aralığı, kategorik bir sonuç için bir anlam ifade etmemektedir (bir aralık yerine bir tahmin seti yapabilirdiniz, ancak çoğu zaman muhtemelen çok bilgilendirici olmaz).

Gerçeği bildiğimiz verileri simüle ederek tahmin aralıkları ile ilgili bazı sorunları görebiliriz. Aşağıdaki verileri göz önünde bulundurun:

set.seed(1)

x1 <- rep(0:1, each=500)
x2 <- rep(0:1, each=250, length=1000)

y <- 10 + 5*x1 + 10*x2 - 3*x1*x2 + rnorm(1000)

Bu özel veri doğrusal regresyon varsayımlarını takip eder ve rastgele bir orman oturumu için oldukça yalındır. Her iki tahminci de 0 olduğunda ortalamanın 10 olduğunu belirten "doğru" modelden biliyoruz, bireysel noktaların 1 standart sapma ile normal bir dağılım izlediğini de biliyoruz. bu noktalar 8'den 12'ye kadar olacaktır (aslında 8.04'den 11.96'ya, ancak yuvarlama daha basit tutar). Tahmini herhangi bir tahmin aralığı bundan daha geniş olmalıdır (mükemmel bilgiye sahip olmamak telafi etmek için genişlik ekler) ve bu aralığı içermelidir.

Regresyondaki aralıklara bakalım:

fit1 <- lm(y ~ x1 * x2)

newdat <- expand.grid(x1=0:1, x2=0:1)

(pred.lm.ci <- predict(fit1, newdat, interval='confidence'))
#        fit       lwr      upr
# 1 10.02217  9.893664 10.15067
# 2 14.90927 14.780765 15.03778
# 3 20.02312 19.894613 20.15162
# 4 21.99885 21.870343 22.12735

(pred.lm.pi <- predict(fit1, newdat, interval='prediction'))
#        fit      lwr      upr
# 1 10.02217  7.98626 12.05808
# 2 14.90927 12.87336 16.94518
# 3 20.02312 17.98721 22.05903
# 4 21.99885 19.96294 24.03476

Tahmini ortalamada bazı belirsizliklerin olduğunu görüyoruz (güven aralığı) ve bize 8 ila 12 aralığında daha geniş (ancak dahil) bir tahmin aralığı veriyor.

Şimdi tek tek ağaçların bireysel tahminlerine dayanan aralığa bakalım (rastgele orman, lineer regresyonun (bu veriler için doğru olduğunu bildiğimiz)) varsayımlarından faydalanmadığından daha geniş olmasını beklemeliyiz:

library(randomForest)
fit2 <- randomForest(y ~ x1 + x2, ntree=1001)

pred.rf <- predict(fit2, newdat, predict.all=TRUE)

pred.rf.int <- apply(pred.rf$individual, 1, function(x) {
  c(mean(x) + c(-1, 1) * sd(x), 
  quantile(x, c(0.025, 0.975)))
})

t(pred.rf.int)
#                           2.5%    97.5%
# 1  9.785533 13.88629  9.920507 15.28662
# 2 13.017484 17.22297 12.330821 18.65796
# 3 16.764298 21.40525 14.749296 21.09071
# 4 19.494116 22.33632 18.245580 22.09904

Aralıklar, regresyon tahmin aralıklarından daha geniştir, ancak tüm aralığı kapsamaz. Gerçek değerleri içerirler ve bu nedenle güven aralıkları olarak meşru olabilirler, ancak yalnızca ortalamanın (öngörülen değer) olduğu yerde tahmin ederler, bu ortalamanın etrafındaki dağılım için ilave bir parça yoktur. X1 ve x2'nin her ikisinin de 0 olduğu ilk durumda, aralıklar 9.7'nin altına düşmez, bu, 8'e giden gerçek tahmin aralığından çok farklıdır. Yeni veri noktaları oluşturursak, o zaman birkaç nokta olacaktır (çok daha fazlası). % 5'ten daha fazla) bunlar doğru ve regresyon aralıklarındadır, ancak rasgele orman aralıklarına girmezler.

Bir tahmin aralığı oluşturmak için, bireysel noktaların öngörülen araçların etrafındaki dağılımı hakkında bazı güçlü varsayımlar yapmanız gerekecek, o zaman tahminleri tek tek ağaçlardan (önyüklenmiş güven aralığı parçası) alabilir ve ardından varsayılandan rastgele bir değer oluşturabilirsiniz. o merkeze göre dağılım. Üretilen parçalar için miktarlar tahmin aralığını oluşturabilir (ancak yine de test ederim, işlemi birkaç kez daha tekrarlamanız ve birleştirmeniz gerekebilir).

Normal (normal kullanılan verilerin kullanıldığını bildiğimiz için) bu ağaçtan hesaplanan MSE'ye dayanan standart sapma ile yapılan tahminlere sapma ekleyerek bunu yapmanın bir örneği:

pred.rf.int2 <- sapply(1:4, function(i) {
  tmp <- pred.rf$individual[i, ] + rnorm(1001, 0, sqrt(fit2$mse))
  quantile(tmp, c(0.025, 0.975))
})
t(pred.rf.int2)
#           2.5%    97.5%
# [1,]  7.351609 17.31065
# [2,] 10.386273 20.23700
# [3,] 13.004428 23.55154
# [4,] 16.344504 24.35970

Bu aralıklar mükemmel bilgiye dayalı olanları içerir, bu nedenle makul görünün. Ancak, yapılan varsayımlara büyük ölçüde bağlı olacaklardır (varsayımlar burada geçerlidir çünkü verilerin nasıl simüle edildiğine dair bilgiyi kullandık, gerçek verilerde geçerli olmayabilirler). Bu yönteme tam olarak güvenmeden önce, gerçek verilerinize benzeyen veriler için birkaç kez tekrar ediyorum (ancak bu gerçeği bildiğiniz için simüle).


11

Bunun eski bir yazı olduğunu biliyorum ama bu konuda bazı simülasyonlar yürüttüm ve bulgularımı paylaşacağımı düşündüm.

@GregSnow bu konuda çok ayrıntılı bir yazı yaptı, ancak bireysel ağaçlardan yapılan tahminleri kullanarak aralığı hesaplarken sadece% 70'lik bir tahmin aralığı olan bölümüne baktığını düşünüyorum . % 95 tahmin aralığını elde etmek için bakmamız gerekir .[ μ + 1,96 σ , μ - 1,96 σ ][μ+σ,μσ][μ+1.96σ,μ1.96σ]

Bu değişikliği @GregSnow kodunda yaparak aşağıdaki sonuçları alıyoruz

set.seed(1)
x1 <- rep( 0:1, each=500 )
x2 <- rep( 0:1, each=250, length=1000 )
y <- 10 + 5*x1 + 10*x2 - 3*x1*x2 + rnorm(1000)

library(randomForest)
fit2 <- randomForest(y~x1+x2)
pred.rf <- predict(fit2, newdat, predict.all=TRUE)
pred.rf.int <- t(apply( pred.rf$individual, 1, function(x){ 
  c( mean(x) + c(-1.96,1.96)*sd(x), quantile(x, c(0.025,0.975)) )}))

pred.rf.int
                          2.5%    97.5%
1  7.826896 16.05521  9.915482 15.31431
2 11.010662 19.35793 12.298995 18.64296
3 14.296697 23.61657 14.749248 21.11239
4 18.000229 23.73539 18.237448 22.10331

Şimdi bunları, MSE gibi @GregSnow'un önerdiği gibi standart sapma ile tahminlere normal sapma ekleyerek oluşturulan aralıklar ile karşılaştırarak,

pred.rf.int2 <- sapply(1:4, function(i) {
   tmp <- pred.rf$individual[i,] + rnorm(1000, 0, sqrt(fit2$mse))
   quantile(tmp, c(0.025, 0.975))
   })
t(pred.rf.int2)
          2.5%    97.5%
[1,]  7.486895 17.21144
[2,] 10.551811 20.50633
[3,] 12.959318 23.46027
[4,] 16.444967 24.57601

Her iki yaklaşım tarafından da aralık şimdi çok yakın görünüyor. Bu durumda hata dağılımına karşı üç yaklaşım için tahmin aralığının çizilmesi aşağıdaki gibidir

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

  • Siyah çizgiler = doğrusal regresyondan tahmin aralıkları,
  • Kırmızı çizgiler = Bireysel Tahminler üzerinden hesaplanan rastgele orman aralıkları,
  • Mavi çizgiler = Tahminlere normal sapma eklenerek hesaplanan rastgele orman aralıkları

Şimdi, simülasyonu tekrar çalıştıralım, ancak bu sefer hata teriminin varyansını artıracağız. Tahmin aralığı hesaplamalarımız iyi ise, yukarıda yaptığımızdan daha geniş aralıklarla bitmeliyiz.

set.seed(1)
x1 <- rep( 0:1, each=500 )
x2 <- rep( 0:1, each=250, length=1000 )
y <- 10 + 5*x1 + 10*x2 - 3*x1*x2 + rnorm(1000,mean=0,sd=5)

fit1 <- lm(y~x1+x2)
newdat <- expand.grid(x1=0:1,x2=0:1)
predict(fit1,newdata=newdat,interval = "prediction")
      fit       lwr      upr
1 10.75006  0.503170 20.99695
2 13.90714  3.660248 24.15403
3 19.47638  9.229490 29.72327
4 22.63346 12.386568 32.88035

set.seed(1)
fit2 <- randomForest(y~x1+x2,localImp=T)
pred.rf.int <- t(apply( pred.rf$individual, 1, function(x){ 
  c( mean(x) + c(-1.96,1.96)*sd(x), quantile(x, c(0.025,0.975)) )}))
pred.rf.int
                          2.5%    97.5%
1  7.889934 15.53642  9.564565 15.47893
2 10.616744 18.78837 11.965325 18.51922
3 15.024598 23.67563 14.724964 21.43195
4 17.967246 23.88760 17.858866 22.54337

pred.rf.int2 <- sapply(1:4, function(i) {
   tmp <- pred.rf$individual[i,] + rnorm(1000, 0, sqrt(fit2$mse))
   quantile(tmp, c(0.025, 0.975))
   })
t(pred.rf.int2)
         2.5%    97.5%
[1,] 1.291450 22.89231
[2,] 4.193414 25.93963
[3,] 7.428309 30.07291
[4,] 9.938158 31.63777

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

Şimdi bu, ikinci yaklaşımla tahmin aralıklarını hesaplamanın çok daha doğru olduğunu ve doğrusal regresyondan tahmin aralığına oldukça yakın sonuçlar verdiğini açıkça ortaya koymaktadır.

Normallik varsayımına göre, rastgele ormandan tahmin aralıklarını hesaplamanın daha kolay bir yolu vardır. Tek tek ağaçların her birinde tahmin edilen değere ( ) ve ortalama kare hataya ( ) . Dolayısıyla her bir ağaçtan yapılan tahmin olarak düşünülebilir . Normal dağılım özelliklerini kullanarak rastgele ormandaki tahminimiz dağılımına sahip olacaktır . Bunu yukarıda tartıştığımız örneğe uygulayarak aşağıdaki sonuçları alıyoruz M S E i , N ( μ I , R, M S D i ) N- ( Σ μ ı / n , Σ R M S D ı / n )μiMSEiN(μi,RMSEi)N(μi/n,RMSEi/n)

mean.rf <- pred.rf$aggregate
sd.rf <- mean(sqrt(fit2$mse))
pred.rf.int3 <- cbind(mean.rf - 1.96*sd.rf, mean.rf + 1.96*sd.rf)
pred.rf.int3
1  1.332711 22.09364
2  4.322090 25.08302
3  8.969650 29.73058
4 10.546957 31.30789

Bunlar doğrusal model aralıklarıyla ve aynı zamanda @GregSnow yaklaşımıyla çok iyi sonuç veriyor. Ancak, tartıştığımız tüm yöntemlerin altında yatan varsayımın, hataların bir Normal dağılışı takip ettiğini unutmayın.


10

Eğer R kullanırsanız kolayca rastgele ormanlar gerileme öngörüleri için tahmini aralıklarını üretebilir: Sadece paketi kullanmak quantregForest(mevcut CRAN ) ve okumak N. Meinshausen tarafından kağıt dilim regresyon ormanlar ve nasıl müdahale edilebilir nasıl koşullu kantilleri onlar Tahmin aralıkları oluşturmak için kullanılabilir. R ile çalışmasanız bile çok bilgilendirici!


Bu makalenin buraya taşındığı anlaşılıyor
Monica

2
Bu uygun cevaba benziyor ve tahmin aralığı ile ilgili dağıtım varsayımları gerektirmez. Burada python'da
colin

6

Bu randomForest ile çözmek kolaydır.

İlk önce, regresyon görevi ile uğraşmama izin verin (ormanınızın 1000 ağacı olduğunu varsayarak). İşlevde, predictayrı ayrı ağaçlardan sonuç döndürme seçeneğiniz vardır. Bu, 1000 sütun çıktısı alacağınız anlamına gelir. Her satır için 1000 sütunun ortalamasını alabiliriz - bu, RF'nin herhangi bir şekilde ürettiği normal çıktıdır. Şimdi tahmin aralığını almak için +/- 2 std diyelim. Yapmanız gereken tek şey sapmalar, her satır için, 1000 değerden +/- 2 std'yi hesaplamaktır. sapmaları ve bunları tahmininizde üst ve alt sınırlarınız yapın.

İkincisi, sınıflandırma durumunda, her ağacın ya 1 ya da 0 çıktığını (varsayılan olarak) ve 1000 ile bölünmüş tüm 1000 ağaç üzerindeki toplamın (ikili sınıflandırma durumunda) sınıf olasılığını verdiğini unutmayın. Olasılığa tahmin aralığı koymak için min. nodesize seçeneği (bu seçeneğin tam adı için randomForest belgesine bakın) bir kez >> 1 değerini ayarladıktan sonra ayrı ağaçlar 1 ile 0 arasında sayıları çıkartacaktır. Şimdi, buradan, yukarıda belirtilen işlemleri tekrarlayabilirsiniz. regresyon görevi.

Umarım anlamlı olur.


Denemedim ama mantıklı görünüyor. Eski soruma cevap verdiğiniz için teşekkürler.
Dean MacGregor

1
Bu yöntemin tahmin aralığından çok bir güven aralığı gibi bir şey vereceğini düşünüyorum. Sonuçlar, tahmin aralıkları teorisinin iyi kurulduğu doğrusal bir modelle karşılaştırılmalıdır. Gerçeğin bilindiği ve tüm varsayımların tutulduğu bazı benzetilmiş verilerde en iyisi.
Greg Snow,

1
@GregSnow: Yukarıda tarif ettiklerimden elde edeceğiniz şey, tahmin aralığının kesinliğidir. Tahmin aralıklarının genellikle güven aralıklarından çok daha geniş olduğuna dikkat edin, çünkü güven aralıkları gerçekten, bir tahminin ortalama istatistiğinin nerede olduğunu, tahminin sadece bir gözlemle ilgili olduğu ve dolayısıyla daha büyük belirsizlik ve dolayısıyla daha geniş aralıklarla ilgili olduğunu belirttiğini belirtir. 1000 ağaçtan alacağınız 1000 tahmin, önyüklenmiş bir örnek olarak düşünülebilir ve burada normallik varsayımları uygulamanıza gerek yoktur. Basit decile analizleri bile iyi sonuçlar verecektir.

5
@SashikanthDareddy, Anlattıklarınızdan elde edeceğiniz şey kesinlikle bir tahmin aralığı değildir. Bir tahmin aralığı, daha geniş olmaktan daha fazlasıyla belirlenir. Evet, tek tek ağaçlar bir önyükleme oluşturur, ancak önyükleme tek tek değerleri değil, parametreleri tahmin eder. Tahmin aralığı, bireysel noktaların dağılımına çok bağlıdır. Metodunuzun, kategoriler yerine kategorik bir sonucu olan oranlar için bir aralık vermesi, bunu göstermektedir. Eklenen cevaptaki örneğime bakın.
Greg Snow,

0

Bazı seçenekler denedim (hepsi bu WIP):

  1. Aslında bağımlı değişkene, sonuçları tek bir değer yerine aralıklar halinde sınıflandırma problemi yaptım. Elde ettiğim sonuçlar basit bir değere kıyasla zayıftı. Bu yaklaşımdan vazgeçtim.

  2. Sonra, her biri aralık için alt sınırda olan (modelin sonucu alt sınırdan geçip geçmeyeceği) çoklu sınıflandırma problemlerine dönüştürdüm ve sonra tüm modelleri koştum (~ 20) ve sonra aralık olarak son bir cevap almak için sonucu birleştirdi. Bu yukarıda 1'den daha iyi çalışır ancak ihtiyacım kadar iyi değil. Hala bu yaklaşımı geliştirmek için çalışıyorum.

Modellerimin ne kadar iyi / kötü olduğuna karar vermek için OOB ve bir-bir-dış tahminlerini kullandım.


0

Rastgele orman tahminleri için tahmin aralıkları oluşturma sorunu, aşağıdaki makalede ele alınmıştır:

Zhang, Haozhe, Joshua Zimmerman, Dan Nettleton ve Daniel J. Nordman. "Rastgele Orman Tahmin Aralıkları." Amerikan İstatistiği, 2019.

R paketi "rfinterval" CRAN'da mevcut bir uygulamasıdır.

Kurulum

R paketini kurmak için rfinterval :

#install.packages("devtools")
#devtools::install_github(repo="haozhestat/rfinterval")
install.packages("rfinterval")
library(rfinterval)
?rfinterval

kullanım

Hızlı başlangıç:

train_data <- sim_data(n = 1000, p = 10)
test_data <- sim_data(n = 1000, p = 10)

output <- rfinterval(y~., train_data = train_data, test_data = test_data,
                     method = c("oob", "split-conformal", "quantreg"),
                     symmetry = TRUE,alpha = 0.1)

### print the marginal coverage of OOB prediction interval
mean(output$oob_interval$lo < test_data$y & output$oob_interval$up > test_data$y)

### print the marginal coverage of Split-conformal prediction interval
mean(output$sc_interval$lo < test_data$y & output$sc_interval$up > test_data$y)

### print the marginal coverage of Quantile regression forest prediction interval
mean(output$quantreg_interval$lo < test_data$y & output$quantreg_interval$up > test_data$y)

Veri örneği:

oob_interval <- rfinterval(pm2.5 ~ .,
                            train_data = BeijingPM25[1:1000, ],
                            test_data = BeijingPM25[1001:2000, ],
                            method = "oob",
                            symmetry = TRUE,
                            alpha = 0.1)
str(oob_interval)

1
Xiaolongmao.You bizim atmak isteyebilirsiniz @, sitesine hoş geldiniz tur . Lütfen birden fazla konuya aynı cevapları göndermeyin. Cevaplarınızı her bir konudaki özel soruya göre uyarlamaya çalışın. Eğer özdeş bir cevabın soruyu tamamen cevapladığına gerçekten inandığınız bir durum varsa, bu sorunun bir kopyası olduğu anlamına gelir. 50 itibara ulaştığınızda, OP'ye bir yorum gönderebilirsiniz. Arada, kapanış için Q'yu kopya olarak işaretleyebilirsiniz.
gung - Reinstate Monica
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.