Ana içeriğe geç

İleri14 dk

Gradient Boosting

Önkoşul:AdaBoost

Kanca

  1. derste AdaBoost’un yanlış sınıflandırılan örneklerin AĞIRLIĞINI artırdığını gördük. Gradient Boosting, aynı “sırayla düzelt” fikrini farklı bir açıdan uyguluyor: her yeni model, bir öncekinin HATASINI (kalıntısını) doğrudan tahmin etmeye çalışıyor.

Sezgi

Gradient Boosting, en basit bir tahminle (genelde ortalama) başlar, sonra her adımda bir önceki modelin YAPTIĞI HATAYA (kalıntı/residual) yeni bir küçük ağaç uydurup bunu toplama ekler. Fikir şu: eğer model bir evi 5 birim eksik tahmin ediyorsa, bir sonraki ağaç doğrudan “bu evler için +5 ekle” demeyi öğrenmeye çalışır.

“Gradient” (gradyan) kelimesi buradan geliyor: her yeni ağaç, kayıp fonksiyonunun GRADYANI yönünde (4. dersteki gradyan inişini hatırla) küçük bir adım atıyor — ama bu adımı bir sayı güncellemesiyle değil, YENİ BİR AĞAÇ ekleyerek atıyor.

Mekanizma

Eğrisel bir fiyat-metrekare ilişkisiyle başlayalım:

Eğrisel ev fiyatı verisi

# Ev fiyatı, metrekareyle EĞRİSEL bir ilişki taşıyor (6. dersteki polinom örneğine benzer).
n = 80
metrekare = rng.uniform(40, 200, n)
fiyat = 3 + 0.01 * metrekare + 0.0007 * metrekare**2 + rng.normal(0, 1.2, n)
X = metrekare.reshape(-1, 1)
print(f"{n} ev, fiyat aralığı: {fiyat.min():.2f}-{fiyat.max():.2f}")
80 ev, fiyat aralığı: 2.52-34.03

Model 0: sadece ortalama

# Gradient Boosting'in başlangıcı: en basit tahmin, ORTALAMA.
tahmin_0 = np.full(n, fiyat.mean())
mse_0 = mean_squared_error(fiyat, tahmin_0)
print(f"Model 0 (sadece ortalama): MSE = {mse_0:.3f}")

kalinti_1 = fiyat - tahmin_0
print(f"İlk kalıntıların (residuals) std sapması: {kalinti_1.std():.3f}")
print("Gradient Boosting'in fikri: bir sonraki ağacı fiyata değil, bu KALINTIYA uydur.")
Model 0 (sadece ortalama): MSE = 74.645
İlk kalıntıların (residuals) std sapması: 8.640
Gradient Boosting'in fikri: bir sonraki ağacı fiyata değil, bu KALINTIYA uydur.

En basit başlangıç: her eve aynı (ortalama) fiyatı ver. MSE=74.645 — kötü ama bir başlangıç noktası. Şimdi elle 3 tur boyunca, kalıntıya küçük ağaçlar uydurup ekleyelim:

Elle 3 tur: kalıntıya uyum

ogrenme_orani = 0.3
tahmin = tahmin_0.copy()
for tur in range(1, 4):
    kalinti = fiyat - tahmin
    agac = DecisionTreeRegressor(max_depth=2, random_state=tur)
    agac.fit(X, kalinti)
    tahmin = tahmin + ogrenme_orani * agac.predict(X)
    mse = mean_squared_error(fiyat, tahmin)
    print(f"Tur {tur}: kalıntıya uydurulan yeni ağaç eklendi -> MSE = {mse:.3f}")
print("Her turda, bir önceki modelin HATASINA (kalıntıya) yeni bir küçük ağaç uyduruluyor ve toplama ekleniyor.")
Tur 1: kalıntıya uydurulan yeni ağaç eklendi -> MSE = 39.049
Tur 2: kalıntıya uydurulan yeni ağaç eklendi -> MSE = 20.529
Tur 3: kalıntıya uydurulan yeni ağaç eklendi -> MSE = 11.332
Her turda, bir önceki modelin HATASINA (kalıntıya) yeni bir küçük ağaç uyduruluyor ve toplama ekleniyor.

MSE, 74.645’ten 39.049’a, sonra 20.529’a, sonra 11.332’ye düşüyor — her tur, bir önceki hatanın bir kısmını “yamıyor”. Şimdi 100 tur çalıştıralım:

100 tur Gradient Boosting

gb = GradientBoostingRegressor(n_estimators=100, max_depth=2, learning_rate=0.3, random_state=15)
gb.fit(X, fiyat)
mse_gb = mean_squared_error(fiyat, gb.predict(X))
print(f"\n100 turluk tam Gradient Boosting: MSE = {mse_gb:.3f}")
print(f"Model 0'a (sadece ortalama, MSE={mse_0:.3f}) göre {mse_0 / mse_gb:.1f} kat iyileşme.")

100 turluk tam Gradient Boosting: MSE = 0.062
Model 0'a (sadece ortalama, MSE=74.645) göre 1205.6 kat iyileşme.

MSE 0.062’ye düştü — ortalama tahminden 1205 kat daha iyi (bu, EĞİTİM verisi üzerindeki MSE; az sonra bunun neden tek başına yeterli bir ölçüt olmadığını göreceğiz).

Matematik

Gradient Boosting'in aşamalı güncelleme kuralı
F0(x)=yˉF_0(x) = \bar{y}Fm(x)=Fm1(x)+ηhm(x)F_m(x) = F_{m-1}(x) + \eta \cdot h_m(x)hmargminhi(yiFm1(xi)h(xi))2h_m \approx \arg\min_h \sum_i \left(y_i - F_{m-1}(x_i) - h(x_i)\right)^2
SembolAnlamı
F0(x)F_0(x)Başlangıç modeli — basitçe hedefin ortalaması
hm(x)h_m(x)mm‘inci turda eklenen küçük ağaç — bir önceki modelin KALINTISINA uydurulur
η\eta (eta)Öğrenme oranı — her yeni ağacın toplama ne kadar “güçlü” katılacağını belirler

Kare hata (MSE) kaybı için, kalıntıya (yFm1y - F_{m-1}) uyum sağlamak, matematiksel olarak kaybın GRADYANI yönünde adım atmakla AYNI şeydir — bu yüzden “Gradient” Boosting adını taşır. 4. dersteki gradyan inişiyle aynı mantık, farklı bir uygulama.

Kod

Öğrenme oranının etkisini, hem eğitim hem çapraz doğrulama MSE’siyle inceleyelim:

Öğrenme oranının etkisi

from sklearn.model_selection import cross_val_score

for lr in [0.01, 0.1, 0.3, 1.0]:
    m = GradientBoostingRegressor(n_estimators=100, max_depth=2, learning_rate=lr, random_state=15)
    m.fit(X, fiyat)
    mse_egitim = mean_squared_error(fiyat, m.predict(X))
    mse_cv = -cross_val_score(m, X, fiyat, cv=5, scoring="neg_mean_squared_error").mean()
    print(f"learning_rate={lr:<5} eğitim MSE = {mse_egitim:.3f}   çapraz doğrulama MSE = {mse_cv:.3f}")
print("\nEn iyi ÇAPRAZ DOĞRULAMA skoru learning_rate=0.1'de (1.895) -- learning_rate=1.0 eğitim verisine")
print("MÜKEMMEL uyuyor (MSE=0.000) ama çapraz doğrulaması (2.619) daha KÖTÜ: klasik aşırı öğrenme (7. ders).")
learning_rate=0.01  eğitim MSE = 12.350   çapraz doğrulama MSE = 14.584
learning_rate=0.1   eğitim MSE = 0.391   çapraz doğrulama MSE = 1.895
learning_rate=0.3   eğitim MSE = 0.062   çapraz doğrulama MSE = 2.410
learning_rate=1.0   eğitim MSE = 0.000   çapraz doğrulama MSE = 2.619

En iyi ÇAPRAZ DOĞRULAMA skoru learning_rate=0.1'de (1.895) -- learning_rate=1.0 eğitim verisine
MÜKEMMEL uyuyor (MSE=0.000) ama çapraz doğrulaması (2.619) daha KÖTÜ: klasik aşırı öğrenme (7. ders).

En düşük ÇAPRAZ DOĞRULAMA hatası learning_rate=0.1’de (1.895) — learning_rate=1.0 eğitim verisine neredeyse mükemmel uyuyor (MSE=0.000) ama çapraz doğrulaması daha KÖTÜ (2.619). Çoğu kişi “eğitim hatası ne kadar düşükse model o kadar iyidir” sanır. 7. dersten hatırlarsak yanlış, çünkü eğitim hatasının sıfıra yaklaşması, modelin veriye (gürültüsüyle birlikte) aşırı uyduğunun işareti olabilir — asıl güvenilir ölçüt, hiç görmediği veride (çapraz doğrulama) nasıl performans gösterdiğidir.

Solda sadece ortalamayı tahmin eden düz çizgi ile 100 tur sonra elde edilen eğrisel tahmin çizgisini karşılaştıran grafik; sağda tur sayısına karşı MSE'nin azalan bir eğri çizdiğini gösteren grafik.
Sol: 100 tur sonra model, eğrisel fiyat-metrekare ilişkisini yakından takip ediyor. Sağ: her turda MSE azalıyor, ama bu SADECE eğitim verisinde -- çapraz doğrulamayla kontrol etmeden bu iyileşmeye güvenmemeli.

Nerede işe yarar

Gradient Boosting, tablo (yapılandırılmış) verilerde en güçlü yöntemlerden biridir:

  • Yapılandırılmış/tablo verilerde en iyi performans gösteren yöntemlerden. Görüntü ve metin dışındaki çoğu problemde (finans, sağlık, e-ticaret), Gradient Boosting türevleri genelde en yüksek doğruluğu verir.
  • XGBoost, LightGBM (23-24. ders) gibi endüstri standardı araçların temeli. Bu dersteki fikri anlamak, o araçları anlamayı doğrudan kolaylaştırır.
  • Hem regresyon hem sınıflandırmada kullanılabilir. Kayıp fonksiyonu değiştirilerek (MSE yerine log-loss gibi) aynı çerçeve sınıflandırmaya uyarlanabilir.

Bu 3 hatayı yaparsın:

  1. Sadece eğitim MSE’sine bakıp “model harika” diye sevinmek — bu derste gördüğümüz gibi, düşük eğitim hatası aşırı öğrenmenin işareti olabilir.
  2. Öğrenme oranı ve ağaç sayısını birbirinden BAĞIMSIZ ayarlamak — düşük öğrenme oranı genelde DAHA FAZLA ağaç gerektirir (bu derste lr=0.01, 100 turda bile yetersiz kaldı).
  3. Gradient Boosting’i Random Forest gibi paralelleştirebileceğini sanmak — AdaBoost gibi SIRALIDIR, her ağaç bir öncekine bağımlıdır.

Kendini test et

1. Gradient Boosting'te her yeni ağaç neyi tahmin etmeye çalışır?
  1. Orijinal hedef değişkeni (y) doğrudan
  2. Bir önceki modelin HATASINI (kalıntı/residual) -- yani gerçek değer ile o ana kadarki tahmin arasındaki farkı (doğru cevap)
  3. Rastgele bir sayı
  4. Sadece en son eklenen ağacın çıktısını

Neden: Her yeni ağaç, bir önceki toplam modelin kalıntısına (y - F_{m-1}) uydurulur; bu kalıntıyı tahmin edip toplama eklemek, modelin hatasını kademeli olarak azaltır.

2. Notebook'ta learning_rate=1.0 eğitim MSE'sini 0.000'a indirdi ama çapraz doğrulama MSE'si (2.619), learning_rate=0.1'in çapraz doğrulama MSE'sinden (1.895) daha KÖTÜYDÜ. Bu neyi gösteriyor?
  1. Kod hatalıydı
  2. Eğitim hatasının sıfıra yaklaşması aşırı öğrenmenin işareti olabilir -- gerçek performans göstergesi çapraz doğrulamadır (doğru cevap)
  3. learning_rate=1.0 her zaman en iyisidir
  4. Çapraz doğrulama güvenilmezdir

Neden: 7. dersteki bias-variance dengesinin bir örneği: düşük eğitim hatası, modelin veriye (gürültüsüyle) aşırı uyduğunu gösterebilir; çapraz doğrulama gerçek genelleme performansını ölçer.

3. Gradient Boosting ile AdaBoost (21. ders) arasındaki temel benzerlik nedir?
  1. İkisi de paralel çalışır
  2. İkisi de modelleri SIRAYLA kurar, her yeni model bir öncekinin eksik kaldığı yerlere odaklanır (doğru cevap)
  3. İkisi de sadece regresyon yapar
  4. Aralarında hiçbir benzerlik yoktur

Neden: Her ikisi de boosting ailesindendir: modelleri sırayla kurar ve her yeni model bir öncekinin hatasına (AdaBoost'ta ağırlıklandırma, Gradient Boosting'te kalıntıya uydurma yoluyla) odaklanır.

Özet

Özet

  • Gradient Boosting, ortalama gibi basit bir tahminle başlar, her turda bir önceki modelin kalıntısına yeni bir küçük ağaç uydurup ekler.
  • Öğrenme oranı, her yeni ağacın toplama ne kadar güçlü katılacağını belirler.
  • Düşük öğrenme oranı daha fazla ağaç (tur) gerektirir; yüksek öğrenme oranı hızlı öğrenir ama aşırı öğrenmeye daha yatkındır.
  • Eğitim hatasının çok düşük olması başarı değil, aşırı öğrenme riskinin işareti olabilir -- çapraz doğrulama şart.
  • AdaBoost gibi sıralı çalışır; XGBoost ve LightGBM (23-24. ders) bu fikrin optimize edilmiş, endüstri standardı uygulamalarıdır.
Sonraki adım: XGBoost →