Xgboost'ta overfit hakkında tartışma


20

Kurulumum şu şekildedir:

"Uygulamalı Öngörücü Modelleme" kılavuz ilkelerini takip ediyorum. Böylece ilişkili özellikleri filtreledim ve aşağıdakilerle sonuçlandım:

  • Eğitim setinde 4900 veri noktası ve test setinde 1600 veri noktası.
  • 26 özelliğim var ve hedef sürekli bir değişken.

caretPaketi kullanarak modelleri eğitmek için 5 kat çapraz geçerlilik uygularım . Bir MARS modeli uyguladığımda, eğitim setinde ve test setinde yaklaşık 4 ortalama bir mutlak hata (MAE) alıyorum.

Ancak xgboost uygulayarak (ya ağaç algoritması ya da doğrusal olan) Eğitim setinde 0.32 (!) Ve test setinde 2.4 gibi bir şey alıyorum.

Bu nedenle test hatası eğitim hatasının 8 katı ise şunu söyleyebilirim: Eğitim verilerinin gereğinden fazla var. Yine de testte daha küçük bir hata alıyorum.

Ben xgboost aşağıdaki parametreleri kullanın:

  • nrounds = 1000ve eta = 0.01(çevreleri arttırmak ve eta'yı azaltmak yardımcı olabilir, ancak hafızam tükendi ve çalışma süresi çok uzun)
  • max_depth = 16: Eğer diğer mesajları ve varsayılan 6 karşılaştırırsanız, o zaman bu büyük görünüyor ama sorun oldukça karmaşık - belki bu durumda 16 çok büyük değil.
  • colsample_bytree = 0.7, subsample = 0.8ve min_child_weight = 5: bunu yaparken fazlalığı azaltmaya çalışıyorum.

Ben max_depth azaltırsanız o zaman tren ve test hatası yaklaşmak ama yine de büyük bir boşluk var ve test hatası daha büyük (biraz 3 üzerinde).

Lineer güçlendirici kullanarak en uygun parametrelerde kabaca aynı tren ve test hatasını alıyorum:

  • lambda = 90 ve alfa = 0: çapraz doğrulamayla bulundu, lambda aşırı uyumu önlemelidir.
  • colsample_bytree = 0.8, subsample = 0.8ve min_child_weight = 5: bunu yaparken fazlalığı azaltmaya çalışıyorum.

Benim hissim xgboost hala fazla uyuyor - ama eğitim hatası ve gerçek zamanlı testte görebildiğim kadarıyla (xgboost modellerini kullandım ve 4 gün boyunca gerçekte bir topluluğu) ok-ish görünüyor (hata test hatasından daha büyüktür, ancak gerçek hayatta özelliklerin ve diğer değişkenlerin tahmini hakkında daha fazla belirsizlik vardır).

Ne düşünüyorsun: (eğer mümkünse) gerçek yaşam performansı daha üstündeyse aşırı uyumu kabul edebilir miyim? Benim ayarımdaki xgboost aşırıya kaçma eğiliminde mi?

Yanıtlar:


34

Aşırı sığdırma o kadar kötü mü, test hatası daha küçük olsa bile, fazla uygun olan bir model seçmemelisiniz? Hayır. Ama bunu seçmek için bir gerekçe olmalı.

Bu davranış XGBoost ile sınırlı değildir. Tüm makine öğrenme teknikleri arasında ortak bir konu; eksik takma ve fazla takma arasında doğru dengeyi bulma. Resmi tanım, Sapma-varyans dengesidir (Wikipedia) .

Önyargı-varyans dengesi

Aşağıda, modelinizin seçimini haklı çıkarmaya yardımcı olmak için Önyargı-varyans toleransının basitleştirilmesi verilmiştir.

  • Bir modelin, verilerdeki bilgileri tam olarak kullanamaması durumunda yüksek bir önyargıya sahip olduğunu söylüyoruz . En sık karşılaşılan durum, yanıtın ortalaması veya birkaç güçlü özellik gibi genel bilgilere çok bağımlıdır. Önyargı, değişkenlerin Normal olarak dağıtıldığını veya modelin doğrusal olduğunu varsayarak yanlış varsayımlardan gelebilir.

  • Bir modelin verilerden çok fazla bilgi kullanıyor olması durumunda yüksek varyansa sahip olduğunu söylüyoruz . Sadece kendisine sunulan ve yeterince iyi genelleştirilmeyen eğitim setinde vahiy olan bilgilere dayanır. Genellikle, eğitim setini değiştirirseniz model çok değişecektir, bu nedenle "yüksek varyans" adı.

Bu tanım, yetersiz ve aşırı uydurma tanımlarına çok benzer. Bununla birlikte, bu tanım, çoğu zaman karşıt olmak için çok basitleştirilmiştir.

  • Hem eğitim hem de test hatası yüksekse model uygun değildir. Bu, modelin çok basit olduğu anlamına gelir.
  • Test hatası egzersiz hatasından yüksekse model aşırı uyuyor. Bu, modelin çok karmaşık olduğu anlamına gelir.

Bu basitleştirmeler, modelin doğru karmaşıklığını seçmeye yardımcı oldukları için elbette faydalıdır. Ancak önemli bir noktayı göz ardı ediyorlar, (neredeyse) her modelin hem bir önyargıya hem de bir varyans bileşenine sahip olması. Uygun olmayan / aşırı sığdırma açıklaması size çok fazla önyargı / çok fazla varyansınız olduğunu söyler, ancak (neredeyse) her zaman her ikisine de sahipsiniz .

Önyargı varyans dengesi hakkında daha fazla bilgi edinmek isterseniz, bunlar google üzerinden sunulan yararlı görselleştirme ve iyi kaynaklardır. Her makine öğrenimi ders kitabında önyargı-varyans dengesi hakkında bir bölüm olacak, işte birkaç

  • İstatistiksel öğrenmeye giriş ve İstatistiksel öğrenmenin öğeleri (burada bulunabilir) .
  • Örüntü Tanıma ve Makine Öğrenimi, Christopher Bishop.
  • Makine Öğrenimi: Olasılıksal Bir Bakış, Kevin Murphy.

Ayrıca, bana yardımcı olan güzel bir blog yazısı Scott Fortmann-Roe'in Önyargı Varyans Anlayışını Anlamak'tır .

Sorununuz için uygulama

Yani iki modeliniz var,

MAE TrenTest MAEMARS~4,0~4,0Düşük varyans, daha yüksek sapma,XGBoost~0.3~2.4Yüksek sapma, düşük sapma,

ve birini seçmelisin. Bunu yapmak için neyin daha iyi bir model olduğunu tanımlamanız gerekir. Kararlarınıza dahil edilmesi gereken parametreler, modelin karmaşıklığı ve performansıdır.

  • Kaç tane "birim" karmaşıklık, bir "birim" performansla değiş tokuş etmek istersiniz?
    • Daha fazla karmaşıklık, daha yüksek varyans ile ilişkilidir. Modelinizin, eğitim verdiğinizden biraz farklı bir veri kümesinde iyi genelleştirilmesini istiyorsanız, daha az karmaşıklık hedeflemelisiniz.
    • Kolayca anlayabileceğiniz bir model istiyorsanız, bunu modelin karmaşıklığını azaltarak performans maliyetiyle yapabilirsiniz.
    • Eğitim setinizle aynı üretken süreçten geldiğini bildiğiniz bir veri kümesinde en iyi performansı hedefliyorsanız , test hatasını optimize etmek ve bunu bir metrik olarak kullanmak için karmaşıklığı değiştirebilirsiniz. Bu, egzersiz setiniz daha büyük bir setten rastgele örneklendiğinde gerçekleşir ve modeliniz bu sete uygulanır. Örnek vermek gerekirse, çoğu Kaggle yarışmalarında durum böyledir.

Buradaki amaç "fazla uymayan" bir model bulmak değil. En iyi sapma-varyans dengesine sahip modeli bulmaktır. Bu durumda, XGBoost modeli tarafından gerçekleştirilen önyargıdaki azalmanın, varyanstaki artışı haklı çıkaracak kadar iyi olduğunu iddia ediyorum.

Ne yapabilirsin

Bununla birlikte, hiperparametreleri ayarlayarak muhtemelen daha iyisini yapabilirsiniz.

  • Tur sayısını artırmak ve öğrenme oranını azaltmak bir olasılıktır. Gradyan yükseltme ile ilgili "garip" bir şey, eğitim hatasının sıfıra çarptığı noktadan daha iyi bir şekilde çalıştırılmasının test hatasını iyileştirmeye devam etmesidir (burada tartışıldığı gibi: Yalnızca Sığ İyiyken Daha Derin Daha İyi Midir? ). Diğer parametreleri ayarladıktan sonra modelinizi veri kümenizde biraz daha uzun süre eğitmeyi deneyebilirsiniz,

  • Yetiştirdiğiniz ağaçların derinliği başlamak için çok iyi bir yer. Her bir derinlik birimi için, inşa edilecek yaprak sayısını iki katına çıkardığınızı not etmelisiniz. Eğer 16 beden yerine iki beden ağaç yetiştirecekseniz,1/214zamanın! Daha küçük ağaçlar yetiştirmeyi denemelisin. Bunun nedeni , ağacın derinliğinin özellik etkileşiminin derecesini temsil etmesi gerektiğidir . Bu jargon olabilir, ancak özellikleriniz 3 derecelik bir etkileşime sahipse (Kabaca: 4 özelliğin kombinasyonu, bu özelliğin + dördüncü kombinasyonundan daha güçlü değildir), o zaman 3'ten büyük boyutta büyüyen ağaçlar zararlı. Üçüncü derinlikteki iki ağaç, dört derinlikteki bir ağaçtan daha fazla genelleme gücüne sahip olacaktır. Bu oldukça karmaşık bir kavram ve şu an buna girmeyeceğim, ancak bu kağıt koleksiyonunu bir başlangıç ​​için kontrol edebilirsiniz . Ayrıca, derin ağaçların yüksek varyansa yol açtığını unutmayın!

  • Olarak bilinen alt örnekleme kullanılarak torbalama , çelişkileri azaltmak adına harika. Bireysel ağaçlarınız yüksek bir varyansa sahipse, torbalama ağaçları ortalama yapar ve ortalama, bireysel ağaçlardan daha az varyansa sahiptir. Ağaçlarınızın derinliğini ayarladıktan sonra hala yüksek sapma ile karşılaşırsanız, alt örneklemeyi artırmaya çalışın (yani, kullanılan verilerin oranını azaltın). Özellik alanının alt örneklemesi de bu hedefe ulaşır.


1
Biri "teşekkür" diyerek yorum yapmamalı ama bu uzun ve ilginç cevap için "teşekkür ederim" demek istiyorum. Aleady yazdığınız bazı şeyler hakkında biraz bilgi vardı ama bu gerçekten güzel bir araya getirildi. Bazı referanslarınızdan geçip yeni ağaçlar yetiştireceğim ve belki de bir yorum ile geri döneceğim. Şimdilik: teşekkürler! Harika!
Ric

Etkileşimler sayfasının bağlantısı stat.columbia.edu/~jakulin/Int gerçekten harika!
Ric

Tavsiyeni aldım ve ağaçların derinliğini 3'le sınırladım ama 1200'lük çevre aldım ve sonuçlar harika hissettirdi: çok hızlı hesaplamalar, tren ve test arasındaki fark azaldı ve hala iyi bir seviyede. Hikayenin geri kalanı burada: stats.stackexchange.com/questions/205858/…
Ric
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.