Mekanika Gradient Boosting

Mekanika gradient boosting: membangun pohon berurutan yang memperbaiki residual.

Daftar isi

Gradient boosting sering menjadi pilihan awal yang kuat pada data tabular, tetapi mekanikanya perlu dipahami sebelum modelnya disetel dengan benar. Topik ini menguraikan cara kerja ensemble pohon, yaitu gabungan beberapa pohon kecil dalam satu model yang dibangun secara berurutan. Pembahasan dimulai dari model awal yang sederhana dan rumus pembaruan di setiap tahap, lalu ditutup dengan peran learning rate dalam mengatur besarnya langkah. Bagian praktik menggunakan dataset diabetes bawaan scikit-learn beserta metode staged_predict untuk mengamati skor data uji pada enam tahap yang berbeda.

Dari baseline menuju pohon pertama#

Gradient boosting membangun prediksi secara aditif, tahap demi tahap, dan tahap pertamanya bukan pohon. Untuk regresi dengan fungsi biaya kuadrat, model awal F0F_0 hanyalah baseline berupa rata-rata target pada data latih. Model awal yang polos itu kemudian diperbaiki bertahap. Setiap tahap menambahkan satu pohon kecil hmh_m yang mengoreksi sisa kesalahan model pada tahap sebelumnya.

Nama gradient pada gradient boosting mengacu pada gradient descent, dan yang dituruni di sini adalah ruang fungsi, bukan permukaan parameter model. Pada setiap tahap, pohon baru tidak dilatih terhadap target asli, melainkan terhadap gradien negatif fungsi biaya yang dihitung pada prediksi model saat ini. Untuk fungsi biaya MSE, gradien negatif itu berbentuk residual, yaitu selisih yi−Fm−1(xi)y_i - F_{m-1}(x_i) untuk setiap baris data. Klasifikasi menggunakan fungsi biaya logloss, yaitu ukuran kesalahan yang dihitung dari probabilitas prediksi. Gradiennya berbentuk lain, tetapi resepnya sama, sehingga satu kerangka mencakup regresi maupun klasifikasi.

Pembaruan model pada setiap tahap dituliskan sebagai berikut.

Fm(x)=Fm−1(x)+ν hm(x) F_m(x) = F_{m-1}(x) + \nu \, h_m(x)

Simbol Fm(x)F_m(x) adalah model setelah mm tahap, sedangkan Fm−1(x)F_{m-1}(x) adalah model dari tahap sebelumnya. Simbol hm(x)h_m(x) adalah pohon yang baru saja dilatih pada gradien negatif tersebut. Simbol ν\nu adalah learning rate berupa bilangan antara 0 dan 1 yang menyusutkan kontribusi pohon baru, sehingga prediksi akhir adalah jumlahan model awal dengan seluruh koreksi yang sudah ditambahkan.

Learning rate dan arah yang berlawanan dengan bagging#

Learning rate yang kecil membuat satu pohon hampir tidak mengubah model, sehingga banyak tahap diperlukan sebelum pola besar tertangkap. Mekanisme ini dikenal sebagai shrinkage, yaitu penyusutan langkah agar tidak ada satu pohon pun yang mendominasi, sehingga model lebih tahan overfitting. Konsekuensinya, n_estimators harus diperbesar, dan pembesaran itu menaikkan waktu pelatihan. Titik awal yang lazim adalah learning_rate=0.1 dengan beberapa ratus tahap. Kedua nilai tersebut disetel berpasangan, karena menurunkan learning rate tanpa menaikkan n_estimators menghasilkan underfitting, sedangkan menaikkan learning rate tanpa menurunkan n_estimators menghasilkan overfitting.

Arah kerja boosting berlawanan dengan bagging pada random forest. Bagging membangun banyak pohon secara paralel pada sampel bootstrap yang berbeda, lalu merata-ratakan hasilnya untuk menurunkan varians. Boosting bekerja berurutan, dan setiap pohon memanfaatkan kesalahan pohon sebelumnya untuk menurunkan bias. Keduanya adalah ensemble berisi pohon, tetapi menyasar kelemahan yang berbeda. Pilihan di antara keduanya mengikuti gejala yang tampak pada model, bukan kebiasaan semata. Gejala varians terlihat dari skor data latih dan data uji yang berjauhan, sedangkan gejala bias terlihat apabila kedua skor sama-sama rendah.

Membaca skor per tahap pada dataset diabetes#

Skrip berikut melatih GradientBoostingRegressor dengan 200 tahap dan learning rate 0.1, lalu menilai prediksi data uji pada tahap 1, 5, 10, 50, 100, dan 200. Metode staged_predict mengembalikan prediksi model pada setiap tahap, sehingga skor per tahap dapat dihitung tanpa melatih ulang model berkali-kali. Indeks pada staged_predict dimulai dari nol, sehingga tahap ke-tt berada pada indeks t−1t-1.

python boosting-diabetes.py
from sklearn.datasets import load_diabetes
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.metrics import r2_score
from sklearn.model_selection import train_test_split

X, y = load_diabetes(return_X_y=True)
X_latih, X_uji, y_latih, y_uji = train_test_split(
    X, y, test_size=0.2, random_state=42
)

model = GradientBoostingRegressor(
    n_estimators=200, learning_rate=0.1, random_state=42
)
model.fit(X_latih, y_latih)

# indeks pada staged_predict dimulai dari 0, sehingga tahap ke-t berada pada indeks t-1
tahap_dicari = {1, 5, 10, 50, 100, 200}
for indeks, pred in enumerate(model.staged_predict(X_uji)):
    no_tahap = indeks + 1
    if no_tahap in tahap_dicari:
        r2 = r2_score(y_uji, pred)
        print(f"Tahap {no_tahap:>3} : R-squared data uji = {r2:.4f}")
text Keluaran
Tahap   1 : R-squared data uji = 0.0640
Tahap   5 : R-squared data uji = 0.2727
Tahap  10 : R-squared data uji = 0.3924
Tahap  50 : R-squared data uji = 0.4621
Tahap 100 : R-squared data uji = 0.4529
Tahap 200 : R-squared data uji = 0.4366

Pola kenaikannya terlihat jelas pada keluaran di atas. Sepuluh tahap pertama mengangkat koefisien determinasi R2R^2 dari 0.0640 ke 0.3924 karena koreksi awal menangkap struktur data yang paling menonjol. Setelah itu pertumbuhannya melandai dan puncaknya berada di 0.4621 pada tahap 50. Selanjutnya skor data uji justru menurun, menjadi 0.4529 pada tahap 100 dan 0.4366 pada tahap 200. Penurunan tersebut adalah tanda overfitting tahap lanjut, karena ensemble yang makin rumit mulai menghafal derau data latih. Pada dataset kecil dengan 353 baris data latih, learning rate 0.1 membuat ensemble sudah melewati titik terbaiknya sebelum tahap terakhir.

Kesalahan umum#

  • Mengirim model pada tahap terakhir secara otomatis. Kebiasaan ini muncul karena skor data latih memang terus membaik sampai tahap terakhir, padahal yang menentukan kualitasnya adalah skor data uji. Pada pengukuran di atas, skor uji tahap 200 (0.4366) lebih rendah daripada skor uji tahap 50 (0.4621), sehingga tahap terakhir bukan otomatis yang terbaik. Pemilihan panjang ensemble diserahkan pada data validasi atau early stopping, yaitu penghentian pelatihan ketika skor validasi berhenti membaik.
  • Menurunkan learning rate tanpa menaikkan n_estimators. Kontribusi setiap tahap menjadi makin kecil sementara jumlah tahapnya tetap, sehingga model berhenti sebelum struktur data tertangkap dan underfitting terjadi. Perbaikannya berupa penyesuaian berpasangan, yaitu setiap penurunan learning rate disertai kenaikan n_estimators yang sepadan.
  • Menghitung indeks staged_predict dari satu. Indeks pada metode ini dimulai dari nol, sehingga prediksi setelah pohon pertama berada pada indeks 0, dan keliru satu posisi menggeser seluruh pembacaan skor. Kesalahan semacam ini tidak memunculkan pesan error, sehingga baru terlihat ketika skor yang dicetak tidak masuk akal. Perbaikannya sudah diterapkan skrip di atas, yaitu menambahkan satu pada indeks sebelum nomor tahap dicetak.

Ringkasan#

  • Gradient boosting menambahkan satu pohon kecil setiap tahap, dan pohon itu dilatih pada gradien negatif fungsi biaya yang untuk MSE berbentuk residual.
  • Pembaruan Fm(x)=Fm−1(x)+ν hm(x)F_m(x) = F_{m-1}(x) + \nu \, h_m(x) menyusutkan langkah melalui learning rate, sehingga learning rate kecil menuntut n_estimators besar tetapi lebih tahan overfitting.
  • Bagging menurunkan varians melalui perataan pohon paralel, sedangkan boosting menurunkan bias melalui koreksi berurutan.
  • Skor per tahap pada dataset diabetes naik cepat, melandai di sekitar tahap 50, lalu menurun karena ensemble mulai menghafal derau.

Referensi#