Menyelami gradient boosting secara mendalam: hyperparameter penting XGBoost, LightGBM, dan CatBoost, kontrol overfitting dengan regularization dan early stopping, GPU acceleration, benchmark tabular dan interpretasi prediksi memakai SHAP.

Di episode 7 kita mengenal gradient boosting dan memakainya sebagai baseline. Episode ini kita membongkarnya sampai ke dalam: mengapa GBM begitu dominan di data tabular 2026, hyperparameter mana yang paling berpengaruh, bagaimana mengendalikan overfitting, dan bagaimana mempercepat training dengan GPU. Di akhir, kalian akan tahu cara memilih dan mengatur GBM secara profesional — bukan sekadar memakai default.
Mengapa topik ini layak satu episode penuh? Karena untuk data tabular — jenis data terbanyak di industri — gradient boosting adalah state of the art. Menguasai tuning-nya adalah keterampilan yang langsung terbayar di proyek nyata maupun kompetisi.
Boosting membangun model sebagai jumlah dari pohon-pohon lemah yang dilatih berurutan. Pohon baru t+1 difokuskan untuk memperbaiki residual — kesalahan — yang tersisa dari gabungan pohon sebelumnya.
import numpy as np
from sklearn.tree import DecisionTreeRegressor
pred = np.zeros(len(y_train))
for _ in range(10):
residual = y_train - pred
stump = DecisionTreeRegressor(max_depth=2).fit(X_train, residual)
pred = pred + 0.1 * stump.predict(X_train)Kunci kekuatannya ada di dua parameter:
learning_rate (eta): seberapa besar kontribusi tiap pohon. Kecil = lebih hati-hati tapi butuh banyak pohon.n_estimators: jumlah pohon. Banyak = lebih kuat tapi rawan overfit.Inilah trade-off inti: learning_rate kecil + n_estimators besar umumnya akurat, selama dihentikan di titik yang tepat (early stopping).
import xgboost as xgb
model = xgb.XGBClassifier(
n_estimators=500,
learning_rate=0.05,
max_depth=6,
min_child_weight=5,
gamma=0.1,
subsample=0.8,
colsample_bytree=0.8,
reg_alpha=0.1,
reg_lambda=1.0,
tree_method="hist",
random_state=42,
eval_metric="logloss",
)| Parameter | Fungsi | Arah tuning |
|---|---|---|
max_depth | Kedalaman pohon | Naik → overfit; kontrol utama |
min_child_weight | Bobot minimal anak | Naik → lebih konservatif |
gamma | Gain minimal untuk split | Naik → pohon lebih jarang split |
subsample | Proporsi baris per pohon | 0.5-0.9 → mengurangi overfit |
colsample_bytree | Proporsi kolom per pohon | 0.5-0.9 → lebih acak, tahan overfit |
reg_alpha / reg_lambda | Regularisasi L1/L2 | Naik → bobot lebih kecil |
import lightgbm as lgb
model = lgb.LGBMClassifier(
n_estimators=500,
learning_rate=0.05,
num_leaves=31,
min_child_samples=20,
subsample=0.8,
colsample_bytree=0.8,
reg_alpha=0.1,
reg_lambda=1.0,
random_state=42,
)Perbedaan kunci LightGBM: leaf-wise growth — ia menumbuhkan daun yang paling menguntungkan, bukan level penuh seperti XGBoost (level-wise). Konsekuensinya: num_leaves lebih sensitif daripada max_depth; terlalu besar = overfit instan.
from catboost import CatBoostClassifier
model = CatBoostClassifier(
iterations=500,
learning_rate=0.05,
depth=6,
l2_leaf_reg=3.0,
cat_features=["kota", "produk"],
eval_metric="Logloss",
random_seed=42,
verbose=False,
)CatBoost menonjol di tiga hal: ordered boosting (anti-leakage), native categorical support, dan performa stabil dengan default yang baik — paling jarang butuh tuning dalam.
Warning
n_estimators dan learning_rate harus dituning bersama, bukan terpisah. Naikkan n_estimators (dengan early stopping) saat menurunkan learning_rate — mengganti satu tanpa yang lain justru menguras komputasi tanpa hasil optimal.
Boosting adalah model dengan kapasitas besar — ia bisa overfit jika dibiarkan. Dua mekanisme paling efektif:
Latih dengan validation set, berhenti saat error tidak membaik:
model.fit(
X_train, y_train,
eval_set=[(X_val, y_val)],
eval_metric="auc",
callbacks=[lgb.early_stopping(50), lgb.log_evaluation(0)],
)
print(f"best_iteration = {model.best_iteration_}")Model otomatis menemukan jumlah pohon optimal — tidak perlu menebak n_estimators.
Gabungkan kontrol kapasitas (depth/leaves) dengan regularisasi (alpha/lambda) dan sampling (subsample/colsample). Aturan praktis untuk data dengan banyak noise:
max_depth / num_leaves.learning_rate menjadi 0.01-0.05.min_child_samples / min_child_weight.XGBoost dan LightGBM mendukung training GPU dengan perubahan minimal:
pip install xgboost --upgrademodel = xgb.XGBClassifier(
tree_method="hist",
device="cuda",
n_estimators=500,
learning_rate=0.05,
)Percepatan GPU paling terasa di dataset besar (jutaan baris) dan n_estimators besar — untuk data kecil, overhead transfer CPU/GPU justru bisa memperlambat. Jangan langsung asumsi GPU selalu menang; ukur dulu.
Alur yang saya sarankan untuk benchmark GBM di dataset kalian:
import time
import lightgbm as lgb
import xgboost as xgb
from catboost import CatBoostClassifier
def bench(name, model, X, y):
start = time.time()
model.fit(X, y)
score = model.score(X_test, y_test)
print(f"{name}: acc={score:.4f} ({time.time()-start:.1f}s)")
bench("XGBoost", xgb.XGBClassifier(tree_method="hist", random_state=42,
eval_metric="logloss"), X_train, y_train)
bench("LightGBM", lgb.LGBMClassifier(random_state=42), X_train, y_train)
bench("CatBoost", CatBoostClassifier(verbose=False, random_seed=42),
X_train, y_train)Yang penting: ukur akurasi dan waktu sekaligus, dengan split yang sama. Library terbaik di dataset A belum tentu terbaik di dataset B — itulah kenapa benchmark langsung lebih berharga daripada rekomendasi dari artikel.
Model GBM kuat tapi sulit dijelaskan. SHAP (Shapley Additive Explanations) memberi nilai kontribusi tiap fitur untuk tiap prediksi:
import shap
explainer = shap.TreeExplainer(model)
shap_values = explainer.shap_values(X_test)
shap.summary_plot(shap_values, X_test, feature_names=X.columns)Plot summary SHAP menjawab dua pertanyaan sekaligus: fitur mana yang paling penting, dan arah pengaruhnya (nilai tinggi menaikkan atau menurunkan prediksi). Detail lengkap interpretasi model kita bahas di episode 20.
n_estimators dan learning_rate terpisah — suboptimal dan boros.num_leaves LightGBM terlalu besar — overfit cepat, tidak terlihat di train.n_estimators asal pilih.Pada episode 19 ini, kalian telah mendalami gradient boosting secara profesional.
Inti yang harus dibawa pulang:
learning_rate × n_estimators adalah pasangan kunci.Di episode 20 selanjutnya kita membahas model interpretation (XAI) — SHAP, LIME, permutation importance, dan partial dependence, lengkap dengan praktik explainability untuk stakeholder dan kepatuhan seperti credit scoring. Sampai jumpa di episode 20!