Gradient Boosting

HistGradientBoostingClassifier sebagai pilihan modern untuk data tabular.

Daftar isi

Gradient boosting adalah keluarga ensemble yang membangun pohon secara berurutan, yaitu setiap pohon baru dilatih untuk memperbaiki kesalahan yang masih tersisa dari gabungan pohon-pohon sebelumnya. Pendekatan ini berlawanan dengan random forest yang melatih pohon-pohonnya secara mandiri, sehingga karakter dan parameter pengendalinya berbeda. Topik ini membahas mekanisme boosting bertahap, HistGradientBoostingClassifier sebagai implementasi modern bawaan scikit-learn untuk data tabular, serta peran parameter learning_rate dan max_iter. Seluruh contoh dijalankan pada dataset breast_cancer dan dibandingkan dengan RandomForestClassifier pada pemecahan data yang sama.

Boosting: memperbaiki sisa model sebelumnya#

Random forest mengurangi kesalahan dengan merata-ratakan banyak pohon yang saling independen, sedangkan gradient boosting membangun model secara aditif dan berurutan. Model akhirnya dinyatakan sebagai jumlah kontribusi pohon-pohon kecil:

FM(x)=F0(x)+ν∑m=1Mhm(x) F_M(x) = F_0(x) + \nu \sum_{m=1}^{M} h_m(x)

dengan F0 F_0 adalah prediksi awal, hm h_m adalah pohon ke m, dan ν \nu adalah laju belajar (learning rate) yang mengecilkan kontribusi tiap pohon. Pada klasifikasi, pohon baru diturunkan dari gradien fungsi kerugian terhadap prediksi saat ini, sehingga secara praktis setiap pohon berusaha memperbaiki sampel-sampel yang masih salah atau kurang yakin. Istilah residual sering digunakan untuk menyebut sisa kesalahan yang menjadi target pohon berikutnya, dan konsepnya sama dengan sisa pada regresi.

Sifat berurutan inilah yang membedakan cara mengendalikannya. Menambah jumlah pohon pada random forest hanya menstabilkan voting, sedangkan menambah jumlah pohon pada gradient boosting membuat model lebih mampu menyesuaikan data, sehingga risiko overfitting ikut naik. Karena itu pasangan learning_rate dan max_iter menjadi dua parameter terpenting yang harus dibaca sebagai satu kesatuan, dan keduanya diukur langsung pada bagian “HistGradientBoostingClassifier dan pembandingnya”.

HistGradientBoostingClassifier dan pembandingnya#

scikit-learn menyediakan HistGradientBoostingClassifier sebagai implementasi yang terinspirasi LightGBM. Implementasi ini mengelompokkan nilai fitur ke dalam histogram berjumlah terbatas sebelum mencari pemisahan, sehingga pencarian ambang jauh lebih cepat daripada memeriksa setiap nilai yang unik. Keunggulan kedua adalah penanganan nilai yang hilang secara bawaan, yaitu setiap pemisahan mempelajari arah mana nilai NaN sebaiknya mengikuti, sehingga imputasi tidak diperlukan. Kombinasi kecepatan dan ketahanan ini menjadikan kelas tersebut pilihan awal yang kuat untuk data tabular pada ukuran menengah hingga besar.

Program berikut melatih HistGradientBoostingClassifier dan RandomForestClassifier pada pemecahan data breast_cancer yang identik, kemudian mencetak akurasi train dan test keduanya. Keduanya diberi benih yang sama agar selisih skor tidak berasal dari keacakan pelatihan.

python hgbt-vs-rf.py
from sklearn.datasets import load_breast_cancer
from sklearn.ensemble import HistGradientBoostingClassifier, RandomForestClassifier
from sklearn.model_selection import train_test_split

bc = load_breast_cancer()
X_train, X_test, y_train, y_test = train_test_split(
    bc.data, bc.target, test_size=0.25, stratify=bc.target, random_state=42
)

# HistGradientBoostingClassifier membangun pohon secara berurutan
hgbt = HistGradientBoostingClassifier(random_state=42)
hgbt.fit(X_train, y_train)

# RandomForestClassifier membangun pohon secara paralel lalu menggabungkannya
rf = RandomForestClassifier(n_estimators=100, random_state=42)
rf.fit(X_train, y_train)

print(f"HistGradientBoosting: train={hgbt.score(X_train, y_train):.3f}, "
      f"test={hgbt.score(X_test, y_test):.3f}")
print(f"RandomForest        : train={rf.score(X_train, y_train):.3f}, "
      f"test={rf.score(X_test, y_test):.3f}")
text Keluaran
HistGradientBoosting: train=1.000, test=0.965
RandomForest        : train=1.000, test=0.958

Kedua model mencapai akurasi train 1.000, tetapi angka itu bukan tanda kegagalan karena akurasi test 0.965 dan 0.958 tetap tinggi dan berdekatan. Pada data tabular berukuran sedang seperti breast_cancer, kedua keluarga pohon ini biasanya berada pada tingkat yang sama, dan selisih antarkeduanya lebih sering ditentukan oleh penyetelan parameter daripada oleh pilihan keluarganya. Keunggulan HistGradientBoostingClassifier pada contoh ini lebih tepat dibaca dari kecepatan pelatihannya dan fitur bawaannya, bukan dari selisih skor yang tipis.

learning_rate dan max_iter#

Dua parameter ini bekerja berpasangan. max_iter menentukan jumlah pohon yang dibangun, sedangkan learning_rate menentukan besar kontribusi setiap pohon terhadap model akhir. Nilai learning_rate yang kecil menuntut jumlah pohon lebih banyak agar model mencapai kecukupan yang sama, sedangkan nilai besar bergerak cepat tetapi berisiko melewati titik optimum. Program berikut mengamati efeknya dengan mengubah learning_rate dan mempertahankan pengaturan lainnya.

python Contoh: pengaruh learning_rate terhadap akurasi train dan test
from sklearn.datasets import load_breast_cancer
from sklearn.ensemble import HistGradientBoostingClassifier
from sklearn.model_selection import train_test_split

bc = load_breast_cancer()
X_train, X_test, y_train, y_test = train_test_split(
    bc.data, bc.target, test_size=0.25, stratify=bc.target, random_state=42
)

for lr in [0.05, 0.1, 0.5, 1.0]:
    model = HistGradientBoostingClassifier(learning_rate=lr, random_state=42)
    model.fit(X_train, y_train)
    print(f"learning_rate={lr}: train={model.score(X_train, y_train):.3f}, "
          f"test={model.score(X_test, y_test):.3f}")
text Keluaran
learning_rate=0.05: train=1.000, test=0.965
learning_rate=0.1: train=1.000, test=0.965
learning_rate=0.5: train=1.000, test=0.979
learning_rate=1.0: train=1.000, test=0.958

Akurasi test mencapai puncaknya pada learning_rate=0.5 dengan 0.979, kemudian turun menjadi 0.958 pada learning_rate=1.0. Pola naik lalu turun seperti ini adalah ciri penyetelan pada pasangan parameter tersebut, karena laju belajar yang terlalu besar membuat kontribusi tiap pohon terlalu dominan dan model cepat menyesuaikan kebisingan data. Nilai bawaan learning_rate=0.1 merupakan titik awal yang aman, dan penyesuaiannya dilakukan bersama max_iter, misalnya laju belajar yang dikecilkan disertai jumlah pohon yang dinaikkan. Pada data yang jauh lebih besar, parameter early_stopping menghentikan penambahan pohon secara otomatis ketika skor data validasi, yaitu potongan data yang dipisahkan untuk penilaian, berhenti membaik, sehingga kombinasi ini tidak harus ditelaah seluruhnya secara manual.

Nilai NaN tanpa imputasi#

Penanganan nilai hilang bawaan dapat dibuktikan dengan menyuntikkan nilai NaN ke dalam data breast_cancer, kemudian melatih HistGradientBoostingClassifier tanpa imputasi apa pun. Penyuntikan dilakukan secara deterministik pada setiap baris ke-50 agar hasilnya dapat direproduksi. Tidak ada baris yang dibuang dan tidak ada kolom yang dihapus, sehingga prosedurnya persis sama dengan pelatihan pada data yang lengkap.

python Contoh: pelatihan langsung pada data yang memuat NaN
import numpy as np
from sklearn.datasets import load_breast_cancer
from sklearn.ensemble import HistGradientBoostingClassifier
from sklearn.model_selection import train_test_split

bc = load_breast_cancer()
X, y = bc.data.copy(), bc.target

# suntikkan nilai NaN secara deterministik pada 1 dari setiap 50 baris
X[::50, 0] = np.nan
jumlah_nan = int(np.isnan(X).sum())

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.25, stratify=y, random_state=42
)

model = HistGradientBoostingClassifier(random_state=42)
model.fit(X_train, y_train)  # tanpa imputasi, tanpa error

print("Jumlah nilai NaN di seluruh data :", jumlah_nan)
print("Akurasi data uji                 :", round(model.score(X_test, y_test), 3))
text Keluaran
Jumlah nilai NaN di seluruh data : 12
Akurasi data uji                 : 0.965

Pelatihan berjalan tanpa error meskipun 12 nilai NaN tersebar pada fitur pertama, dan akurasinya 0.965, sama seperti model tanpa nilai hilang. Pada setiap pemisahan, algoritma mempelajari apakah sampel bermuatan NaN lebih cocok mengikuti cabang kiri atau kanan, sehingga informasi bahwa suatu nilai hilang pun dapat dimanfaatkan. Keluarga model lain berperilaku berbeda, karena KNN dan SVM menolak masukan yang memuat NaN dan menuntut imputasi terlebih dahulu. Keunggulan ini menjadikan HistGradientBoostingClassifier praktis pada data mentah yang belum dibersihkan, sekaligus menghemat satu langkah praproses beserta risiko salah konfigurasinya.

Kesalahan umum#

Kesalahan pertama adalah menyertakan StandardScaler di depan HistGradientBoostingClassifier. Keluarga pohon membandingkan satu fitur dengan satu ambang, sehingga penyetaraan skala tidak mengubah hasilnya dan hanya menambah langkah yang tidak diperlukan. Pipeline yang lebih panjang juga memperberat proses penyetelan karena seluruh transformasi ikut dievaluasi ulang pada setiap kombinasi parameter.

Kesalahan kedua adalah menaikkan max_iter atau learning_rate tanpa mengamati akurasi data uji. Model boosting yang berjalan terlalu jauh menyesuaikan data latih menurunkan skor test secara diam-diam, sedangkan pemantauan sederhana pada data uji atau early stopping mencegahnya. Pencatatan skor pada setiap percobaan menjaga arah penyetelan tetap terlihat.

Kesalahan ketiga adalah menghilangkan random_state=42 saat membandingkan model. HistGradientBoostingClassifier menggunakan keacakan pada pemilihan fitur dan sampel, sehingga tanpa benih yang sama, selisih skor antardua model dapat berasal dari keacakan dan bukan dari perbedaan algoritmanya. Aturan yang sama berlaku pada RandomForestClassifier, sehingga kedua model pada contoh utama diberi benih yang identik.

Ringkasan#

  • Gradient boosting membangun pohon secara berurutan, dan setiap pohon baru mengecilkan sisa kesalahan gabungan pohon sebelumnya dengan kontribusi yang diskalakan oleh learning_rate.
  • HistGradientBoostingClassifier adalah implementasi berbasis histogram yang cepat, menerima nilai NaN tanpa imputasi, dan layak menjadi pilihan awal untuk klasifikasi data tabular.
  • Pada breast_cancer, HistGradientBoostingClassifier mencapai akurasi test 0.965 berbanding 0.958 pada RandomForestClassifier dengan pengaturan bawaan.
  • learning_rate dan max_iter disetel sebagai pasangan, dan laju belajar yang lebih kecil menuntut jumlah pohon yang lebih besar.

Referensi#