CodeBlanks Logo Icon CodeBlanks

Gradient boosting

Gradient boosting, hataları gradyan ile azaltarak modeli geliştirir.

Gradient boosting

Gradient boosting her yeni ağacı, mevcut toplam modelin kalıntılarına (regresyonda y - ŷ) uydurur. Yani her ağaç "şu ana kadarki tahminin ne kadar yanlış olduğunu" öğrenir ve tahmine küçük bir adımla eklenir:

p = np.full(len(y), y.mean())            # başlangıç: ortalama
for _ in range(100):
    kalinti = y - p
    agac = DecisionTreeRegressor(max_depth=2).fit(X, kalinti)
    p += 0.1 * agac.predict(X)            # küçük adım

Adı kayıp fonksiyonunun gradyanından gelir: kare hatanın negatif gradyanı tam olarak kalıntıdır.

scikit-learn'deki uygulamalar

İki sürüm vardır:

  • GradientBoostingClassifier/Regressor: klasik, küçük-orta veri için.
  • HistGradientBoostingClassifier/Regressor: özellikleri kutulara ayırır; on binlerce örnekte çok daha hızlıdır, eksik değerleri doğrudan destekler.
from sklearn.ensemble import HistGradientBoostingClassifier
hgb = HistGradientBoostingClassifier(random_state=0).fit(X_train, y_train)   # NaN olabilir

Büyük tablo verisinde ilk denenecek model genellikle HistGradientBoosting'dir.

Uygulama Elle gradient boosting

Başlangıç tahmini y.mean() olan elle bir gradient boosting döngüsü yaz: 50 tur, her turda DecisionTreeRegressor(max_depth=2) kalıntılara uydurulsun ve tahmine 0.1 katıyla eklensin. Başlangıçtaki ve sondaki MSE'yi round(..., 2) ile alt alta yazdır.

Başlangıç kodu

model.py
import numpy as np
from sklearn.tree import DecisionTreeRegressor

rng = np.random.default_rng(0)
X = rng.uniform(0, 6, size=(200, 1))
y = np.sin(X[:, 0]) + rng.normal(0, 0.1, 200)

# buraya yaz

Örnek çözüm

model.py
import numpy as np
from sklearn.tree import DecisionTreeRegressor

rng = np.random.default_rng(0)
X = rng.uniform(0, 6, size=(200, 1))
y = np.sin(X[:, 0]) + rng.normal(0, 0.1, 200)

p = np.full(len(y), y.mean())
print(round(((y - p) ** 2).mean(), 2))
for _ in range(50):
    agac = DecisionTreeRegressor(max_depth=2).fit(X, y - p)
    p += 0.1 * agac.predict(X)
print(round(((y - p) ** 2).mean(), 2))

Beklenen çıktı

0.5
0.01

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Gradient boosting regresyonunda her yeni ağaç neyi hedef alır?

  • Özgün y'yi
  • Rastgele etiketleri
  • Önceki ağacın tahminini
  • Mevcut modelin kalıntılarını Doğru cevap

Açıklama: Kalıntı = y - ŷ; ağaç bu farkı küçültmeyi öğrenir.

2 Ağacı kalıntılara uydur.

Soru
agac = DecisionTreeRegressor(max_depth=2).fit(X, ____)
Cevap
agac = DecisionTreeRegressor(max_depth=2).fit(X, y - p)

Açıklama: Hedef, gerçek ile mevcut tahmin arasındaki farktır.

3 Kavramları eşleştir.

Kavram Anlamı
kalıntı y - ŷ
başlangıç tahmini Ortalama
HistGradientBoosting Hızlı, NaN destekli
negatif gradyan Kare hatada kalıntı

Orta seviye bölümündeki tüm dersler