CatBoost

Basic

CatBoost | Gradient boosting unggul untuk fitur kategorikal

Dibuat: Pembaruan terakhir: Waktu baca: 3 menit

CatBoost adalah gradient boosted tree dari Yandex yang sangat kuat untuk fitur kategorikal. Dengan ordered target statistics dan pohon simetris (oblivious), akurasi tinggi bisa dicapai dengan preprocessing minimal.

Model ini cepat konvergen meski learning rate kecil, serta cukup robust terhadap missing value dan pergeseran distribusi, sehingga populer di produksi maupun kompetisi.


1. Cara kerja CatBoost #

  • Encoding kategorikal
    Memakai Ordered Target Statistics dengan pengacakan data dan pembaruan rata-rata secara berurutan, sehingga menghindari leakage dan kelemahan one-hot atau label encoding.

  • Oblivious tree
    Setiap level memakai fitur dan ambang yang sama, menghasilkan (2^d) leaf pada kedalaman (d). Struktur ini ramah GPU dan cepat saat inferensi.

  • Ordered boosting
    Gradien dihitung dari permutasi berbeda untuk menekan overfitting dan membuat pelatihan lebih stabil.

  • Fitur lengkap
    Mendukung class weighting, fitur teks, monotonic constraints, dan metrik gabungan.


2. Melatih klasifier di Python #

from catboost import CatBoostClassifier, Pool
from sklearn.datasets import fetch_openml
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report, roc_auc_score

# Data kredit (campuran kategorikal dan numerik)
data = fetch_openml(name="credit-g", version=1, as_frame=True)
X = data.data
y = (data.target == "good").astype(int)

categorical_features = X.select_dtypes(include="category").columns.tolist()

X_train, X_valid, y_train, y_valid = train_test_split(
    X, y, test_size=0.2, stratify=y, random_state=42
)

train_pool = Pool(
    X_train,
    label=y_train,
    cat_features=categorical_features,
)
valid_pool = Pool(X_valid, label=y_valid, cat_features=categorical_features)

model = CatBoostClassifier(
    depth=6,
    iterations=1000,
    learning_rate=0.03,
    loss_function="Logloss",
    eval_metric="AUC",
    random_seed=42,
    early_stopping_rounds=50,
    verbose=100,
)
model.fit(train_pool, eval_set=valid_pool, use_best_model=True)

proba = model.predict_proba(X_valid)[:, 1]
pred = (proba >= 0.5).astype(int)
print("ROC-AUC:", roc_auc_score(y_valid, proba))
print(classification_report(y_valid, pred, digits=3))

Cukup berikan daftar kolom kategorikal ke Pool; target encoding dan ordering diterapkan otomatis.


3. Hiperparameter utama #

ParameterPeran / tips
depthKedalaman pohon. Pada oblivious tree, depth=6 menghasilkan 64 leaf. Terlalu dalam bisa overfitting.
iterationsJumlah boosting round. Kombinasikan dengan early_stopping_rounds.
learning_rateSemakin kecil biasanya semakin akurat, tapi perlu lebih banyak iterasi.
l2_leaf_regRegularisasi L2 pada leaf; makin besar makin halus.
border_countJumlah bin untuk numerik (default 254). Lebih sedikit lebih cepat tetapi kurang presisi.
bagging_temperatureMengatur randomisasi sampling; mendekati 0 berarti deterministik.
class_weightsBobot kelas untuk data tidak seimbang.

4. Feature importance dan SHAP #

importance = model.get_feature_importance(type="PredictionValuesChange")
for name, score in sorted(zip(X.columns, importance), key=lambda x: -x[1])[:10]:
    print(f"{name}: {score:.3f}")

shap_values = model.get_feature_importance(valid_pool, type="ShapValues")
# shap_values[:, -1] adalah baseline; matplotlib bisa membuat ringkasan.
  • PredictionValuesChange mengukur perubahan prediksi; tanda menunjukkan arah kontribusi.
  • Nilai SHAP tersedia via type="ShapValues" dan berguna untuk penjelasan per sampel.

5. Teknik khas CatBoost #

  • Kombinasi kategori: one_hot_max_size dan combinations_ctypes membuat interaksi otomatis.
  • Fitur teks: gunakan text_features dan atur text_processing (TF-IDF, BM25).
  • Monotonic constraints: monotone_constraints untuk model harga atau risiko.
  • CV bawaan: cv menjalankan cross-validation yang dioptimalkan untuk ordered boosting.

6. Kapan memilih CatBoost #

  • Data dominan kategorikal dan ingin minim preprocessing → CatBoost.
  • Data dominan numerik dan ingin banyak eksperimen cepat → LightGBM sering lebih cepat.
  • Data besar dan sparse → DMatrix XGBoost bisa lebih efisien memori.
  • Dalam ensemble, menambah CatBoost meningkatkan performa pada fitur kategorikal.

7. Ringkasan #

  • CatBoost memproses kategori secara otomatis dan menstabilkan training lewat ordered boosting.
  • Kunci performa ada pada keseimbangan depth, iterations, learning_rate, dan l2_leaf_reg.
  • Dukungan SHAP dan fitur teks membuatnya fleksibel dalam stack ensemble.