Kaggle yarışmalarının vazgeçilmezi, tabular veri problemlerinin tartışmasız şampiyonu: gradient boosting. Peki bu algoritma ailesinin arkasında ne yatıyor? XGBoost, LightGBM ve CatBoost arasında nasıl bir seçim yapmalıyız? Bu yazıda gradient boosting'in matematiksel temellerinden başlayarak üç büyük kütüphanenin iç mekanizmalarını, benchmark sonuçlarını ve pratik kullanım senaryolarını derinlemesine inceleyeceğiz.
Gradient Boosting Nedir?
Gradient boosting, ensemble learning (topluluk öğrenmesi) yöntemlerinden biridir. Temel fikir oldukça zariftir: zayıf öğrenicileri (genellikle sığ karar ağaçları) sıralı olarak eğitip, her yeni modelin bir öncekinin hatalarını düzeltmesini sağlamak.
Matematiksel Temel
Gradient boosting'in çalışma prensibini adım adım inceleyelim:
Formül olarak ifade edersek:
F_m(x) = F_{m-1}(x) + η * h_m(x)
Burada F_m(x) m'inci adımdaki toplam tahmin, η learning rate ve h_m(x) yeni eklenen zayıf öğrenicidir.
Kayıp Fonksiyonu ve Gradient Descent
"Gradient" kelimesi, kayıp fonksiyonunun gradyanının (türevinin) kullanılmasından gelir. Her adımda, kayıp fonksiyonunun negatif gradyanı yönünde bir adım atılır — tıpkı klasik gradient descent'te olduğu gibi, ancak burada fonksiyon uzayında optimizasyon yapılmaktadır.
Regresyon için MSE kayıp fonksiyonu kullandığımızda negatif gradyan tam olarak residual'lara eşittir. Sınıflandırma için ise log-loss kullanıldığında, her adımda log-odds üzerinden güncelleme yapılır.
XGBoost: Extreme Gradient Boosting
Tianqi Chen tarafından 2014 yılında geliştirilen XGBoost, gradient boosting'i hem algoritmik hem de sistem düzeyinde optimize eden bir kütüphanedir.
XGBoost'un Temel Yenilikleri
Regularization (Düzenlileştirme): XGBoost, geleneksel gradient boosting'den farklı olarak amaç fonksiyonuna L1 (Lasso) ve L2 (Ridge) regularization terimleri ekler:
Obj = Σ L(y_i, ŷ_i) + Σ Ω(f_k)
Burada Ω(f) = γT + ½λ||w||² ifadesinde T yaprak sayısı ve w yaprak ağırlıklarıdır. Bu mekanizma overfitting'i önemli ölçüde azaltır.
Weighted Quantile Sketch: Sürekli değişkenler için en iyi split noktalarını bulmak O(n log n) maliyetlidir. XGBoost, approximate split finding algoritması ile ağırlıklı quantile sketch kullanarak bu işlemi hızlandırır.
Sparsity-Aware Split Finding: Eksik değerler (missing values) için varsayılan yönleri otomatik olarak öğrenir. Her split noktasında, eksik değerlerin sola mı sağa mı gideceğini deneyerek optimal yönü bulur.
Column Block ve Cache-Aware Access: Veri, sıralanmış sütun blokları halinde saklanarak paralel split hesaplamasına olanak tanır. Ayrıca cache-aware erişim düzeni ile CPU cache'lerinden maksimum verim alınır.
XGBoost Pratik Kullanım
import xgboost as xgb
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
X, y = make_classification(n_samples=10000, n_features=20, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
params = {
'objective': 'binary:logistic',
'max_depth': 6,
'learning_rate': 0.1,
'n_estimators': 500,
'subsample': 0.8,
'colsample_bytree': 0.8,
'reg_alpha': 0.1, # L1 regularization
'reg_lambda': 1.0, # L2 regularization
'eval_metric': 'logloss',
'early_stopping_rounds': 50,
'tree_method': 'hist', # Histogram-based (daha hızlı)
}
model = xgb.XGBClassifier(**params)
model.fit(X_train, y_train, eval_set=[(X_test, y_test)], verbose=50)
LightGBM: Light Gradient Boosting Machine
Microsoft Research tarafından 2017'de yayımlanan LightGBM, özellikle büyük veri setlerinde hız ve bellek verimliliği konusunda çığır açan iki teknik sunar.
GOSS: Gradient-based One-Side Sampling
Geleneksel gradient boosting tüm veri noktalarını kullanır. Ancak küçük gradyanlı örnekler zaten iyi tahmin edilmektedir. GOSS bu gözleme dayanır:
(1-a)/b ile çarparak dağılımı korur.Bu yaklaşım, bilgi kaybını minimize ederken eğitim hızını dramatik şekilde artırır.
EFB: Exclusive Feature Bundling
Yüksek boyutlu sparse veri setlerinde birçok özellik birbirini dışlar (aynı anda sıfır olmayan değer taşımaz). EFB bu tür özellikleri bir araya gruplar:
- Özellik çatışma grafiği oluşturulur
- Graph coloring benzeri bir algoritma ile çatışması düşük özellikler aynı bundle'a atanır
- Bundle'daki özellikler offset eklenerek tek bir özelliğe dönüştürülür
Bu sayede özellik sayısı azalır ve split bulma işlemi hızlanır.
Leaf-wise Büyüme Stratejisi
XGBoost varsayılan olarak level-wise (seviye bazlı) ağaç büyütür — her seviyedeki tüm yapraklar genişletilir. LightGBM ise leaf-wise (yaprak bazlı) strateji kullanır: en yüksek kayıp azalmasına sahip yaprağı seçer ve onu böler.
Leaf-wise büyüme aynı yaprak sayısına daha az iterasyonla ulaşır, ancak max_depth sınırlaması dikkatli ayarlanmazsa overfitting'e yol açabilir.
LightGBM Pratik Kullanım
import lightgbm as lgb
params = {
'objective': 'binary',
'metric': 'binary_logloss',
'boosting_type': 'gbdt',
'num_leaves': 63, # leaf-wise için kritik parametre
'learning_rate': 0.05,
'feature_fraction': 0.8,
'bagging_fraction': 0.8,
'bagging_freq': 5,
'verbose': -1,
}
dtrain = lgb.Dataset(X_train, label=y_train)
dvalid = lgb.Dataset(X_test, label=y_test, reference=dtrain)
model = lgb.train(
params,
dtrain,
num_boost_round=1000,
valid_sets=[dvalid],
callbacks=[lgb.early_stopping(50), lgb.log_evaluation(100)]
)
CatBoost: Categorical Boosting
Yandex tarafından 2017'de geliştirilen CatBoost, özellikle kategorik değişkenler ve prediction shift problemi üzerine odaklanır.
Ordered Boosting
Geleneksel gradient boosting'de target leakage (hedef sızıntısı) sorunu vardır: residual'ları hesaplarken aynı veri noktası hem eğitim hem de tahmin için kullanılır. CatBoost bunu ordered boosting ile çözer:
Bu yaklaşım, özellikle küçük veri setlerinde overfitting'i belirgin şekilde azaltır.
Kategorik Değişken İşleme
CatBoost'un en güçlü yönlerinden biri, kategorik özellikleri otomatik ve etkili şekilde işlemesidir. Ordered Target Statistics yöntemi kullanılır:
x_i^k = (Σ_{j: σ(j)<σ(i), x_j^k=x_i^k} y_j + a * prior) / (count + a)
Burada σ rastgele permütasyon, a smoothing parametresi ve prior ise hedef değişkenin global ortalamasıdır. Bu formül, her kategorik değer için o değere sahip önceki örneklerin hedef ortalamasını hesaplar — böylece target leakage önlenir.
Ayrıca CatBoost, kategorik özellik kombinasyonlarını otomatik olarak keşfeder. Ağaç büyütme sürecinde, mevcut kategorik özelliklerin birleşimleri yeni özellikler olarak değerlendirilir.
Symmetric Trees
CatBoost, varsayılan olarak oblivious decision trees (simetrik karar ağaçları) kullanır. Bu ağaçlarda, aynı derinlikteki tüm düğümler aynı split koşulunu kullanır. Bu yapı:
- Tahmin süresini hızlandırır (branch prediction dostu)
- Overfitting'e karşı doğal regularization sağlar
- GPU'da paralel hesaplamaya olanak tanır
CatBoost Pratik Kullanım
from catboost import CatBoostClassifier
# Kategorik sütun indeksleri
cat_features = [0, 3, 7] # kategorik değişken pozisyonları
model = CatBoostClassifier(
iterations=1000,
depth=6,
learning_rate=0.1,
loss_function='Logloss',
eval_metric='AUC',
cat_features=cat_features,
auto_class_weights='Balanced',
early_stopping_rounds=50,
verbose=100,
)
model.fit(X_train, y_train, eval_set=(X_test, y_test))
Üç Kütüphanenin Karşılaştırması
Hız ve Bellek Karşılaştırması
| Özellik | XGBoost | LightGBM | CatBoost |
|---|---|---|---|
| Ağaç büyüme stratejisi | Level-wise (varsayılan) | Leaf-wise | Symmetric |
| Eğitim hızı (büyük veri) | Orta | En hızlı | Orta-yavaş |
| Bellek kullanımı | Orta | En düşük | Yüksek |
| GPU desteği | Var | Var | Var (güçlü) |
| Kategorik değişken desteği | Manuel encoding gerekli | Sınırlı native destek | En iyi native destek |
| Eksik değer işleme | Otomatik | Otomatik | Otomatik |
| Varsayılan performans | İyi | İyi | En iyi |
Benchmark Sonuçları
Çeşitli akademik çalışmalar ve Kaggle deneyimleri, şu genel eğilimleri ortaya koyar:
Büyük veri setlerinde (>100K satır): LightGBM genellikle eğitim süresi açısından 2-5x daha hızlıdır. GOSS ve EFB'nin etkisi büyük veri setlerinde belirgin hale gelir.
Kategorik ağırlıklı veri setlerinde: CatBoost, one-hot encoding veya label encoding gerektirmeden doğrudan kategorik değişkenleri işleyerek hem kullanım kolaylığı hem de performans avantajı sağlar.
Küçük veri setlerinde (<10K satır): CatBoost'un ordered boosting mekanizması overfitting'i azaltır ve genellikle daha iyi genelleme performansı sunar.
Hyperparameter hassasiyeti: CatBoost varsayılan parametrelerle en iyi sonucu verme eğilimindedir. XGBoost ve LightGBM genellikle daha fazla hyperparameter tuning gerektirir.
Hangi Durumda Hangisini Seçmeli?
XGBoost tercih edin:
- Geniş topluluk desteği ve dökümantasyon önemli olduğunda
- Scikit-learn pipeline'larıyla entegrasyon gerektiğinde
- Regularization üzerinde ince kontrol istediğinizde
LightGBM tercih edin:
- Büyük veri setleriyle çalışırken (milyonlarca satır)
- Eğitim hızı kritik olduğunda
- Bellek kısıtlamalarınız olduğunda
- Yüksek boyutlu sparse verilerle çalışırken
CatBoost tercih edin:
- Veri setiniz çok sayıda kategorik değişken içeriyorsa
- Minimum hyperparameter tuning ile iyi sonuç istiyorsanız
- Küçük veri setlerinde overfitting'den kaçınmak istiyorsanız
- Tahmin süresinin kritik olduğu production sistemlerinde
Hiperparametre Tuning İpuçları
Her üç kütüphane için ortak kritik parametreler:
# Tüm kütüphaneler için genel tuning stratejisi
from optuna import create_study
def objective(trial):
params = {
'learning_rate': trial.suggest_float('lr', 0.01, 0.3, log=True),
'max_depth': trial.suggest_int('max_depth', 3, 10),
'n_estimators': trial.suggest_int('n_estimators', 100, 2000),
'subsample': trial.suggest_float('subsample', 0.5, 1.0),
'colsample_bytree': trial.suggest_float('colsample', 0.5, 1.0),
'reg_alpha': trial.suggest_float('reg_alpha', 1e-8, 10.0, log=True),
'reg_lambda': trial.suggest_float('reg_lambda', 1e-8, 10.0, log=True),
}
# Cross-validation ile değerlendirme
scores = cross_val_score(model_class(**params), X, y, cv=5, scoring='roc_auc')
return scores.mean()
study = create_study(direction='maximize')
study.optimize(objective, n_trials=100)
Genel ipuçları:
- Learning rate'i düşük tutun (0.01-0.1) ve iterasyon sayısını artırın
- Early stopping mutlaka kullanın
subsamplevecolsample_bytreeile stochastic gradient boosting uygulayın- Önce yapısal parametreleri (depth, leaves), sonra regularization parametrelerini ayarlayın
Sonuç
Gradient boosting, tabular verilerle çalışan her makine öğrenmesi pratisyeni için temel bir araçtır. XGBoost, LightGBM ve CatBoost'un her biri farklı senaryolarda parlar:
- XGBoost olgun ekosistemi ve esnekliğiyle genel amaçlı bir seçenek sunar.
- LightGBM hız ve ölçeklenebilirlik konusunda liderdir.
- CatBoost kategorik veri ve out-of-the-box performansıyla öne çıkar.
Pratikte, ciddi projelerde üçünü de deneyip ensemble yapmak sıklıkla en iyi sonucu verir. Ancak üretim ortamında tek model seçmeniz gerekiyorsa, veri setinizin özelliklerine göre yukarıdaki karşılaştırmayı rehber edinebilirsiniz.