Diskusi tentang pakaian dalam xgboost

20

Pengaturan saya adalah sebagai berikut:

Saya mengikuti garis pedoman dalam "Pemodelan Prediktif Terapan". Jadi saya telah memfilter fitur-fitur terkait dan berakhir dengan yang berikut:

  • 4900 titik data di set latihan dan 1600 titik data di set tes.
  • Saya memiliki 26 fitur dan targetnya adalah variabel kontinu.

Saya menerapkan validasi silang 5 kali lipat untuk melatih model menggunakan caretpaket. Ketika saya menerapkan model MARS maka saya mendapatkan rata-rata kesalahan absolut (MAE) sekitar 4 pada set pelatihan serta pada testset.

Namun menerapkan xgboost (baik algoritma pohon atau yang linear) saya mendapatkan sesuatu seperti 0,32 (!) Pada set pelatihan dan 2,4 pada testset.

Jadi jika kesalahan tes adalah 8 kali kesalahan pelatihan maka saya akan mengatakan: Saya memiliki data pelatihan yang berlebihan. Namun saya masih mendapatkan kesalahan yang lebih kecil pada tes anyways.

Saya menggunakan parameter berikut di xgboost:

  • nrounds = 1000dan eta = 0.01(meningkatkan nrounds dan mengurangi eta dapat membantu tetapi saya kehabisan memori dan waktu berjalan terlalu lama)
  • max_depth = 16: jika saya membandingkan posting lain dan default 6 maka ini terlihat besar tetapi masalahnya cukup kompleks - mungkin 16 tidak terlalu besar dalam hal ini.
  • colsample_bytree = 0.7, subsample = 0.8dan min_child_weight = 5: melakukan ini saya mencoba untuk mengurangi pakaian.

Jika saya mengurangi max_depth maka latih dan test-error semakin dekat tapi masih ada celah besar dan test-error lebih besar (sedikit di atas 3).

Menggunakan penguat linier, saya mendapatkan kereta yang hampir sama dan pengujian kesalahan pada parameter optimal:

  • lambda = 90 dan `alpha = 0: ditemukan melalui validasi silang, lambda harus mencegah overfit.
  • colsample_bytree = 0.8, subsample = 0.8dan min_child_weight = 5: melakukan ini saya mencoba untuk mengurangi pakaian.

Perasaan saya adalah xgboost masih overfits - tetapi kesalahan pelatihan dan sejauh yang saya bisa lihat dalam tes waktu nyata (saya telah menggunakan model xgboost dan ansambelnya dalam kenyataannya selama 4 hari) terlihat ok-ish (kesalahannya adalah lebih besar dari kesalahan pengujian tetapi ada lebih banyak ketidakpastian dalam kehidupan nyata tentang perkiraan fitur dan variabel lainnya).

Bagaimana menurut Anda: dapatkah saya menerima pakaian berlebihan jika (jika memungkinkan) kinerja kehidupan nyata lebih baik? Apakah xgboost di pengaturan saya cenderung overfit?

Ric
sumber

Jawaban:

34

Apakah overfitting sangat buruk sehingga Anda tidak harus memilih model yang mengenakan pakaian berlebih, meskipun kesalahan pengujiannya lebih kecil? Tidak. Tapi Anda harus memiliki alasan untuk memilihnya.

Perilaku ini tidak terbatas pada XGBoost. Ini adalah benang merah di antara semua teknik pembelajaran mesin; menemukan tradeoff yang tepat antara underfitting dan overfitting. Definisi formal adalah tradeoff Bias-variance (Wikipedia) .

Tradeoff bias-varians

Berikut ini adalah penyederhanaan tradeoff Bias-variance, untuk membantu menjustifikasi pilihan model Anda.

  • Kami mengatakan bahwa model memiliki bias yang tinggi jika tidak dapat sepenuhnya menggunakan informasi dalam data. Itu terlalu bergantung pada informasi umum, seperti kasus yang paling sering, rata-rata respons, atau beberapa fitur yang kuat. Bias dapat berasal dari asumsi yang salah, misalnya dengan mengasumsikan bahwa variabel terdistribusi secara normal atau modelnya linier.

  • Kami mengatakan bahwa model memiliki varian yang tinggi jika menggunakan terlalu banyak informasi dari data. Ini bergantung pada informasi yang hanya berseri dalam set pelatihan yang telah disajikan kepadanya, yang tidak cukup umum. Biasanya, model akan banyak berubah jika Anda mengubah set pelatihan, maka nama "varian tinggi".

Definisi tersebut sangat mirip dengan definisi underfitting dan overfitting. Namun, definisi tersebut seringkali terlalu disederhanakan untuk menjadi bertentangan, seperti dalam

  • Model ini kurang cocok jika pelatihan dan kesalahan tes tinggi. Ini berarti bahwa modelnya terlalu sederhana.
  • Model ini overfitting jika kesalahan tes lebih tinggi dari kesalahan pelatihan. Ini berarti bahwa modelnya terlalu kompleks.

Penyederhanaan itu tentu saja membantu, karena membantu memilih kompleksitas model yang tepat. Tetapi mereka mengabaikan poin penting, fakta bahwa (hampir) setiap model memiliki bias dan komponen varians. Deskripsi underfitting / overfitting memberi tahu Anda bahwa Anda memiliki terlalu banyak bias / varian terlalu banyak, tetapi Anda (hampir) selalu memiliki keduanya .

Jika Anda ingin informasi lebih lanjut tentang pengorbanan bias-varians, mereka banyak visualisasi bermanfaat dan sumber daya yang baik tersedia melalui google. Setiap buku pelajaran mesin akan memiliki bagian pada tradeoff bias-varians, berikut adalah beberapa

  • Pengantar pembelajaran statistik dan Elemen pembelajaran statistik (tersedia di sini) .
  • Pengenalan Pola dan Pembelajaran Mesin, oleh Christopher Bishop.
  • Pembelajaran Mesin: Perspektif Probabilistik, oleh Kevin Murphy.

Juga, posting blog bagus yang membantu saya memahami adalah Scott Fortmann-Roe's Understanding the Bias-Variance Tradeoff .

Aplikasi untuk masalah Anda

Jadi, Anda memiliki dua model,

Latih MAETes MAEMARS4.04.0Varians rendah, bias lebih tinggi,XGBoost0,32.4Varians yang lebih tinggi, bias yang lebih rendah,

dan Anda harus memilih satu. Untuk melakukannya, Anda perlu mendefinisikan model apa yang lebih baik. Parameter yang harus dimasukkan dalam keputusan Anda adalah kompleksitas dan kinerja model.

  • Berapa banyak "unit" kompleksitas yang bersedia Anda tukarkan dengan satu "unit" kinerja?
    • Lebih banyak kompleksitas dikaitkan dengan varian yang lebih tinggi. Jika Anda ingin model Anda menggeneralisasi dengan baik pada dataset yang sedikit berbeda dari yang Anda latih, Anda harus mencari kompleksitas yang lebih sedikit.
    • Jika Anda menginginkan model yang dapat Anda pahami dengan mudah, Anda dapat melakukannya dengan biaya kinerja dengan mengurangi kompleksitas model.
    • Jika Anda bertujuan untuk kinerja terbaik pada dataset yang Anda tahu berasal dari proses generatif yang sama dari set pelatihan Anda, Anda dapat memanipulasi kompleksitas untuk mengoptimalkan kesalahan pengujian Anda dan menggunakannya sebagai metrik. Ini terjadi ketika set pelatihan Anda secara acak diambil dari set yang lebih besar, dan model Anda akan diterapkan pada set ini. Ini adalah kasus di sebagian besar kompetisi Kaggle, misalnya.

Tujuannya di sini bukan untuk menemukan model yang "tidak overfit". Ini untuk menemukan model yang memiliki tradeoff bias-varians terbaik. Dalam hal ini, saya berpendapat bahwa pengurangan bias yang dilakukan oleh model XGBoost cukup baik untuk membenarkan peningkatan varian.

Apa yang bisa kau lakukan

Namun, Anda mungkin bisa melakukan yang lebih baik dengan menyetel hyperparameter.

  • Meningkatkan jumlah putaran dan mengurangi tingkat pembelajaran adalah suatu kemungkinan. Sesuatu yang "aneh" tentang peningkatan gradien adalah menjalankannya dengan baik melewati titik di mana kesalahan pelatihan mencapai nol tampaknya masih meningkatkan kesalahan pengujian (seperti yang dibahas di sini: Apakah Lebih Dalam Lebih Baik Hanya Ketika Dangkal Baik? ). Anda dapat mencoba untuk melatih model Anda sedikit lebih lama pada dataset Anda setelah Anda mengatur parameter lainnya,

  • 1/214. Ini mungkin jargon, tetapi jika fitur Anda memiliki tingkat interaksi 3 (Kira-kira: Kombinasi dari 4 fitur tidak lebih kuat daripada kombinasi 3 dari fitur tersebut + yang keempat), maka menanam pohon dengan ukuran lebih besar dari 3 adalah merugikan. Dua pohon dengan kedalaman tiga akan memiliki kekuatan generalisasi lebih dari satu pohon dengan kedalaman empat. Ini adalah konsep yang agak rumit dan saya tidak akan membahasnya sekarang, tetapi Anda dapat memeriksa koleksi makalah ini sebagai permulaan. Juga, perhatikan bahwa pohon yang dalam mengarah ke varian yang tinggi!

  • Menggunakan subsampling, yang dikenal sebagai bagging , sangat bagus untuk mengurangi varians. Jika pohon individual Anda memiliki varian yang tinggi, mengantongi pohon akan rata-rata dan rata-rata pohon memiliki varians yang lebih rendah daripada masing-masing pohon. Jika, setelah menyetel kedalaman pohon Anda, Anda masih menemukan varians yang tinggi, cobalah untuk meningkatkan subsampling (yaitu, kurangi fraksi data yang digunakan). Subsampling ruang fitur juga mencapai tujuan ini.

Mengedipkan mata
sumber
1
Orang seharusnya tidak berkomentar mengatakan "terima kasih" tetapi untuk jawaban yang panjang dan menarik ini saya ingin mengucapkan "terima kasih". Saya aleady memiliki pengetahuan tentang beberapa hal yang Anda tulis tetapi ini benar-benar disatukan. Saya akan membaca beberapa referensi Anda dan menumbuhkan pohon baru dan mungkin kembali dengan komentar. Untuk sekarang: terima kasih! Bagus!
Ric
Tautan ke halaman interaksi stat.columbia.edu/~jakulin/Int benar-benar hebat!
Ric
Saya menerima saran Anda dan membatasi kedalaman pohon menjadi 3 tetapi mengambil 1200 dan hasilnya terasa luar biasa: perhitungan yang sangat cepat, perbedaan antara kereta dan uji berkurang dan masih pada tingkat yang baik. Kisah selanjutnya ada di sini: stats.stackexchange.com/questions/205858/…
Ric