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:
dengan adalah prediksi awal, adalah pohon ke m, dan 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.
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}")HistGradientBoosting: train=1.000, test=0.965
RandomForest : train=1.000, test=0.958Kedua 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.
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}")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.958Akurasi 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.
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))Jumlah nilai NaN di seluruh data : 12
Akurasi data uji : 0.965Pelatihan 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_ratedanmax_iterdisetel sebagai pasangan, dan laju belajar yang lebih kecil menuntut jumlah pohon yang lebih besar.
Referensi#
- 1.11. Ensembles: gradient boosting, random forests, bagging, voting, stacking — scikit-learn documentation — Bagian user guide yang mengulas gradient boosting dan penurunan gradiennya.
- sklearn.ensemble.HistGradientBoostingClassifier — scikit-learn documentation
— Rujukan parameter
learning_rate,max_iter,early_stopping, serta dukungan nilai hilang. - sklearn.ensemble.RandomForestClassifier — scikit-learn documentation — Rujukan model pembanding pada contoh topik ini.
- sklearn.datasets.load_breast_cancer — scikit-learn documentation — Dataset breast_cancer yang digunakan pada seluruh contoh.