Degrade artırıcı makine doğruluğu, yineleme sayısı arttıkça azalır


15

Gradyan arttırıcı makine algoritmasını caretR'deki paket üzerinden deniyorum.

Küçük bir kolej veri kümesi kullanarak, aşağıdaki kodu koştu:

library(caret)

### Load admissions dataset. ###
mydata <- read.csv("http://www.ats.ucla.edu/stat/data/binary.csv")

### Create yes/no levels for admission. ### 
mydata$admit_factor[mydata$admit==0] <- "no"
mydata$admit_factor[mydata$admit==1] <- "yes"             

### Gradient boosting machine algorithm. ###
set.seed(123)
fitControl <- trainControl(method = 'cv', number = 5, summaryFunction=defaultSummary)
grid <- expand.grid(n.trees = seq(5000,1000000,5000), interaction.depth = 2, shrinkage = .001, n.minobsinnode = 20)
fit.gbm <- train(as.factor(admit_factor) ~ . - admit, data=mydata, method = 'gbm', trControl=fitControl, tuneGrid=grid, metric='Accuracy')
plot(fit.gbm)

ve sürpriz yineleme sayısı arttıkça , modelin çapraz doğrulama doğruluğunun artmak yerine azaldığını ve ~ 450.000 yinelemede minimum 0,59 hassasiyete ulaştığını şaşırdım .

resim açıklamasını buraya girin

GBM algoritmasını yanlış mı uyguladım?

DÜZENLEME: Underminer'ın önerisini takiben, yukarıdaki caretkodu tekrar çalıştırdım ancak 100 ila 5.000 artırıcı yineleme çalıştırmaya odaklandım:

set.seed(123)
fitControl <- trainControl(method = 'cv', number = 5, summaryFunction=defaultSummary)
grid <- expand.grid(n.trees = seq(100,5000,100), interaction.depth = 2, shrinkage = .001, n.minobsinnode = 20)
fit.gbm <- train(as.factor(admit_factor) ~ . - admit, data=mydata, method = 'gbm', trControl=fitControl, tuneGrid=grid, metric='Accuracy')
plot(fit.gbm)

Ortaya çıkan grafik, doğruluğun aslında ~ 1.800 yinelemede yaklaşık .705'te zirve yaptığını göstermektedir:

resim açıklamasını buraya girin

Tuhaf olan, doğruluk oranının ~ .70 seviyesinde olmaması, bunun yerine 5.000 yinelemenin ardından azalmasıdır.

Yanıtlar:


14

Genel olarak, artırma hatası, özellikle veri gürültülü olduğunda (örn. Yanlış etiketlenmiş durumlar) yineleme sayısı ile artabilir. Bu sizin sorununuz olabilir, ancak verileriniz hakkında daha fazla bilgi sahibi olmadan söyleyemezdim

Temel olarak, destekleme yanlış bilgi içeren vakaları doğru şekilde tahmin etmeye odaklanabilir ve bu süreçte daha önemli olan diğer vakalardaki ortalama performansı düşürebilir.

Bu bağlantı ( Yükseltme ve Gürültü ) sorunu sağlayabildiğimden daha iyi bir açıklama gösteriyor.

Long ve Servedio'nun bu makalesi ( Rastgele Sınıflandırma Gürültüsü ), konuyla ilgili daha fazla teknik ayrıntı sunmaktadır.


16

Gösterdiğiniz şey aşırı uydurmanın klasik bir örneğidir. Hatadaki küçük artış, çapraz doğrulanmış veri kümenizin doğrulama bölümünde daha düşük performanstan kaynaklanır. Daha fazla yineleme hemen hemen her zaman eğitim setindeki hatayı iyileştirmelidir, ancak bunun tersi doğrulama / test seti için geçerlidir.


Peki, # yineleme artırımına dayalı olarak gradyan artırıcı fazlalıklar? İlginç. Bunun yerine, en uygun yineleme sayısını vurduktan sonra doğruluğun plato haline geleceğini düşündüm.
RobertF

4
Bu doğru. Gradyan yükseltmede, sonraki her ağaç önceki ağaçların kalıntılarından oluşur, bu nedenle GBM, doğrulama / test setlerine genelleme yapma pahasına bile eğitim verisi setinde kalan hatayı kesmeyi denemeye devam edecektir. Bu yüzden çapraz doğrulama gerçekleştirirsiniz - çünkü uydurma algoritması ne zaman duracağını doğal olarak bilmez
Ryan Zotti

1
Gradient Boosting, AdaBoost'tan esinlenmiştir. AdaBoost çok nadiren fazla uyuyor ve öyle olduğunda, sadece biraz ve çok sayıda yinelemeden sonra. @Underminer açıklamasının, özellikle bu yorumda referans bulunmadığı düşünüldüğünde, bu yorumdan daha çok neler olduğunu temsil etme olasılığının daha yüksek olduğunu düşünüyorum.
Ricardo Cruz

2
@RicardoCruz Nadiren degrade artırıcı fazlalığı görmenin ilginç olduğunu düşünüyorum. Kullandığım dört yıl boyunca, tam tersini gördüm - çok fazla ağaç aşırı sığmaya yol açar. Bir keresinde bir meslektaşımla benzer bir şey kanıtlamak zorunda kaldım ve eğitimdeki hatayı neredeyse sıfıra indirebildim, ancak doğrulama hatası, fazla olmayan GBM'den daha fazla arttı. Hala gradyan arttırmanın harika bir algoritma olduğunu düşünüyorum. Genellikle kullandığım ilk algoritma - sadece çapraz doğrulama yoluyla izleyebileceğiniz çok fazla ağaç konusunda dikkatli olmanız gerekir
Ryan Zotti

2
@RyanZotti O zaman düzeltilmiş duruyorum. AdaBoost'ta Schapire ve arkadaşlarından bir sürü makale okudum, çünkü onun güzel güçlü teorik temelinden zevk alıyorum. Yazarlar, artırmanın aşırı uyuma eğilimli olduğunu, ancak bunun çok zor olduğunu savunuyorlar. Bunu kullanma konusunda çok fazla deneyimim yok ve bunu tartışmak için sağlam bir teorik temelleri yok ve elbette yazarlar yazarlar, doğal olarak buluşlarına gayret gösteriyorlar, bu yüzden tam tersine bir deneyime sahipseniz , Düzeltilmiş duruyorum.
Ricardo Cruz

4

Şebeke araması olmadan benzer bir sonucu yeniden üreten kodlar,

mod = gbm(admit ~ .,
      data = mydata[,-5],
      n.trees=100000,
      shrinkage=0.001,
      interaction.depth=2,
      n.minobsinnode=10,
      cv.folds=5,
      verbose=TRUE,
      n.cores=2)

best.iter <- gbm.perf(mod, method="OOB", plot.it=TRUE, oobag.curve=TRUE, overlay=TRUE)
print(best.iter)
[1] 1487
pred = as.integer(predict(mod, newdata=mydata[,-5], n.trees=best.iter) > 0)
y = mydata[,1]
sum(pred == y)/length(y)
[1] 0.7225

3

Gbm paketinin en uygun yineleme sayısını (= ağaç sayısı veya temel işlev sayısı) tahmin etme işlevi vardır,

gbm.perf(mod, method="OOB", plot.it=TRUE, oobag=TRUE, overlay=TRUE)

Bunun için caret trenine ihtiyacınız yok.


Bunun yaşadığım sorunu çözüp çözmediğini bilmiyorum - en uygun yineleme sayısı, doğruluğun en yüksek olduğu, 0.70'e yakın olduğu durumda benim durumumda 5.000 (grafiğimdeki ilk veri noktası). Ama bu yanlış görünüyor. Daha fazla yineleme daha düşük bir doğrulukla değil, daha yüksek bir doğrulukla sonuçlanmalıdır, değil mi?
RobertF

1
@RobertF İlk olarak, itiraf etmene dönüşmenize gerek olmadığını düşünüyorum. Aynı şekilde çalışır: mod = gbm (itiraf ~., Veri = verilerim [, - 5], n.trees = 100000, büzülme = 0.001, etkileşim.depth = 2, n.minobsinnode = 10, cv.folds = 5 , ayrıntılı = TRUE, n.cores = 2). Gbm'nin optimal iter'i nerede seçtiğini görebilirsiniz: best.iter <- gbm.perf (mod, method = "OOB", plot.it = TRUE, oobag.curve = TRUE, overlay = TRUE). Yani, sapmadaki değişiklik negatif olduğunda (bundan üretilen şemaya bakın).
horaceT

1
@RobertF Bir şey daha. Gbm çağrısında n.trees = (bir milyon) belirterek, 1 ile 1.000.000 arasındaki tüm yineleme sayılarını çalıştırmış olursunuz. Yani sizin için bunu yapmak için carete ihtiyacınız yok.
horaceT

1
Daha fazla takip. Sadece 100 bin ağaç / yineleme yaptım. Gbm.perf ile en iyi yinelemeyi seçerek elde ettiğim doğruluk, tam bir yineleme ızgarası çalıştıran sizinkine oldukça yakın olan 0.7225.
horaceT
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.