Boosting DAN Bagging Tree (XGBoost, LightGBM)

17

Ada banyak posting blog, video YouTube, dll. Tentang ide mengantongi atau meningkatkan pohon. Pemahaman umum saya adalah bahwa kode pseudo untuk masing-masing adalah:

Mengantongi:

  1. Ambil N sampel acak x% dari sampel dan y% dari fitur
  2. Paskan model Anda (misalnya, pohon keputusan) pada masing-masing N
  3. Prediksi dengan setiap N
  4. Rata-rata prediksi untuk mendapatkan prediksi akhir

Meningkatkan:

  1. Sesuaikan model Anda (mis. Pohon keputusan) dengan data Anda
  2. Dapatkan residunya
  3. Sesuaikan model Anda dengan residu
  4. Pergi ke 2 untuk putaran meningkatkan N
  5. Prediksi akhir adalah jumlah tertimbang dari prediksi berurutan.

Saya akan mengambil klarifikasi apa pun untuk pengertian saya di atas, tetapi pertanyaan yang saya maksudkan adalah sebagai berikut:

Baik XGBoost dan LightGBM memiliki params yang memungkinkan untuk mengantongi. Aplikasi ini bukan Mengantongi ATAU Meningkatkan (yang dibicarakan setiap posting blog), tetapi Mengantongi DAN Meningkatkan. Apa kode pseudo untuk di mana dan kapan penggabungan dan peningkatan gabungan terjadi?

Saya berharap itu menjadi "Pohon Boosted Bagged", tetapi tampaknya itu adalah "Pohon Boosted Bagged". Perbedaannya tampak substansial.

Pohon-pohon Boosted yang Dikantongi:

  1. Ambil N sampel acak x% dari sampel dan y% dari fitur
  2. Cocokkan pohon-pohon Boosted pada masing-masing sampel N
  3. Prediksi dengan setiap N
  4. Rata-rata prediksi untuk mendapatkan prediksi akhir

Ini sepertinya cara terbaik untuk melakukannya. Lagipula, risiko dalam meningkatkan overfitting dan manfaat utama mengantongi adalah mengurangi overfitting; mengantongi banyak model yang dikuatkan sepertinya ide yang bagus.

Namun, dari melihat melalui, misalnya scikit-learn gradient_boosting.py (yang tidak mengantongi sampel, tetapi bukan pemilihan fitur acak), dan menyatukan beberapa nugget kecil di seluruh tulisan tentang LightGBM dan XGBoost, sepertinya XGBoost dan LightGBM berfungsi sebagai berikut:

Boosted Bagged Trees:

  1. Sesuaikan pohon keputusan dengan data Anda
  2. Untuk saya dalam putaran meningkatkan N:
    • Dapatkan residunya
    • jika saya mod bag_frequency == 0 (yaitu, bag setiap 5 putaran):
      • Ambil sampel acak tunggal x% dari sampel dan y% dari fitur; gunakan sampel acak ini untuk maju
    • paskan pohon dengan residu
  3. Prediksi akhir adalah jumlah tertimbang dari prediksi berurutan.

Harap perbaiki pemahaman saya di sini dan isi detailnya. Boosted Bagged Tree (dengan hanya 1 pohon acak per bag_frequency) sepertinya tidak sekuat Bagged Boosted Tree.

Jonathan
sumber
2
+1 untuk pertanyaan yang menarik dan dirumuskan dengan sangat baik. Dan selamat datang di situs ini.
mkt - Reinstate Monica
Anda memerlukan "hitung kesalahan" untuk meningkatkan Anda. Melakukan kesalahan yang berantakan. Bobot sangat penting untuk adaboost. Itu bukan residu mentah. ... Kami tidak berbicara tentang gradien stokastik yang diperlukan dalam meningkatkan, meskipun mempercepat.
EngrStudent
Inilah kantong yang dikuatkan. Alih-alih pohon baru untuk setiap seri-langkah Anda mendapatkan hutan baru dengan output rata-rata. Eugene Tuv dan Kari Torkkola. jmlr.org/papers/volume10/tuv09a/tuv09a.pdf
Reinstate Monica
dorongan kantong akan membuat hutan ansambel seri, dan mengambil output rata-rata. Ini mungkin melibatkan over-fitting yang dapat dihasilkan oleh serangkaian ensemble (dikuatkan), dan memberikan output yang lebih kuat, tetapi keuntungannya tidak akan besar.
EngrStudent

Jawaban:

13

Bagging: Ambil N sampel acak x% dari sampel dan y% dari Fitur

Contoh berulang kali disub-sampel di Bagging , tetapi tidak di Fitur. ( RandomForest , XGBoost dan CatBoost melakukan keduanya):

Given dataset D of size N.
For m in n_models:
    Create new dataset D_i of size N by sampling with replacement from D.
    Train model on D_i (and then predict)
Combine predictions with equal weight 

Sertakan langkah inisialisasi dalam kode pseudo Boosting Anda untuk menghilangkan redundansi:

Init data with equal weights (1/N).
For m in n_model:
    Train model on weighted data (and then predict)
    Update weights according to misclassification rate.
    Renormalize weights
Combine confidence weighted predictions

Boosted Trees Bagged (seperti Anda menyebutnya) tentu saja merupakan Pendekatan yang masuk akal, tetapi berbeda dari XGBoost atau CatBoost :

Given dataset D of size N.
For m in n_models:
    Create new dataset D_i of size N by sampling with replacement from D.
    (Insert Boosting pseudo code here (on D_i))
Combine predictions with equal weight 

XGBoost dan CatBoost keduanya didasarkan pada Peningkatan dan penggunaan seluruh data pelatihan. Mereka juga menerapkan bagging dengan berlangganan sekali dalam setiap Iterasi meningkatkan:

Init data with equal weights (1/N).
For m in n_model:
    Train model on weighted bootstrap sample (and then predict)
    Update weights according to misclassification rate.
    Renormalize weights
Combine confidence weighted predictions

Jika Anda ingin tetap menggunakan "fit model to residuals", maka ini akan sama dengan "fit model to residuals data dalam sampel bootstrap ".


Keterangan Lebih Lanjut :

Tidak ada " cara terbaik untuk melakukannya " seperti yang Anda sarankan (tidak ada teorema makan siang gratis). "Bagged Boosted Trees" mungkin mengungguli XGBoost pada set data tertentu.

Ambil sampel acak tunggal x% dari sampel

Baris ini membingungkan. Darimana kamu mendapatkan ini?

jika saya mod bag_frequency == 0 (yaitu, bag setiap 5 putaran):

Ini tidak harus disebutkan dalam kode semu Anda. Terutama ketika ada parameter lain yang lebih penting yang ditinggalkan (seperti tingkat pembelajaran dalam meningkatkan).

Laksan Nathan
sumber
(+1) Jawaban yang bagus! Untuk memperjelas: apakah OP salah dalam menyatakan " XGBoost dan LightGBM memiliki params yang memungkinkan untuk mengantongi "?
mkt - Reinstate Monica
Keduanya memungkinkan untuk mengantongi: bagging_fraction di LightGBM dan subsampel di XGBoost . Tidak yakin, mengapa saya merujuk ke CatBoost sepanjang waktu. Tetapi mereka semua bekerja dengan cara yang sama dalam hal pertanyaan.
Laksan Nathan
Kesalahan saya, saya melewatkan baris dalam jawaban Anda yang menyebutkan itu. Bisakah Anda menjelaskan " subsampling sekali dalam setiap peningkatan Iterasi "? Apakah yang Anda maksudkan bahwa dalam setiap peningkatan iterasi, banyak subsampel diambil, pohon cocok untuk masing-masing subsampel, dan kemudian tingkat kesalahan klasifikasi dihitung berdasarkan pohon yang dikantongi, dan akhirnya bobot diperbarui? Jika demikian, dapatkah Anda mengklarifikasi hal ini dalam kodesemu?
mkt - Reinstate Monica
Tidak banyak sub-sampel yang diambil, hanya satu: Alih-alih menyesuaikan model untuk semua instance yang ditimbang, model ini dilatih pada sampel bootstrap.
Laksan Nathan
Mengenai "Ambil sampel acak tunggal x% dari sampel"; lebih baik "mengambil sampel tunggal x% dari baris". Saya mendapatkannya dari sini .
Jonathan