Ana içeriğe geç

Orta14 dk

Ridge, Lasso, Elastic Net

Önkoşul:Aşırı öğrenme ve bias-variance

Kanca

  1. derste “çok esnek model = aşırı öğrenme” dedik ama çözümü sadece “daha az esnek bir model seç” diye bıraktık. Peki modeli aynı bırakıp, sadece katsayıların büyümesini CEZALANDIRARAK aşırı öğrenmeyi önleyebilir miyiz? Ve bu ceza, gereksiz öznitelikleri otomatik olarak “eleyebilir” mi?

Sezgi

Düzenlileştirme (regularization), kayıp fonksiyonuna bir CEZA TERİMİ ekler — model artık sadece hatayı değil, hata + katsayıların büyüklüğünü birlikte küçültmeye çalışır. Bu, modelin verideki gürültüye aşırı uymasını (7. dersteki aşırı öğrenme) frenler.

İki temel ceza türü var:

  • Ridge (L2): katsayıların KARELERİ toplamını cezalandırır. Tüm katsayıları küçültür ama nadiren tam sıfıra indirir.
  • Lasso (L1): katsayıların MUTLAK DEĞERLERİ toplamını cezalandırır. Bazı katsayıları TAM SIFIRA indirir — bu da otomatik bir öznitelik seçimi demektir.

λ = 0.032

Ridge (L2) -- katsayılar küçülür ama nadiren tam sıfır olur

-3-2.50-2-1.50-1-0.500-1-0.5000.501log10(λ)katsayı

Lasso (L1) -- katsayılar birer birer TAM SIFIRA iniyor

-3-2.50-2-1.50-1-0.500-1-0.5000.501log10(λ)katsayı
  • metrekare
  • oda_sayısı
  • bina_yaşı
  • kat_no (gürültü)
  • sokak_gürültüsü (gürültü)
  • doğum_ayı (gürültü)
ÖznitelikRidgeLasso
metrekare0.8090.789
oda_sayısı0.5450.524
bina_yaşı-0.225-0.208
kat_no0.0710.042
sokak_gürültüsü0.0290.000 (sıfırlandı)
doğum_ayı0.0010.000 (sıfırlandı)

Bu λ değerinde Lasso, 2 / 6 özniteliğin katsayısını tam sıfıra indirdi -- Ridge'de hiçbir katsayı tam sıfır olmuyor, sadece küçülüyor.

λ (lambda) kaydırıcısını sağa kaydır: Ridge panelinde tüm çizgiler yavaşça sıfıra yaklaşır ama hiçbiri tam sıfır OLMAZ. Lasso panelinde ise gürültü öznitelikleri (kesikli/gri) birer birer tam sıfıra “çarpıp” orada kalır — bu, iki cezanın matematiksel olarak neden farklı davrandığının görsel kanıtı.

Mekanizma

Gerçek verilerle doğrulayalım — 6 öznitelikten sadece 3’ü fiyatı gerçekten etkiliyor, diğer 3’ü tamamen rastgele (gürültü):

Veri: 3 gerçek + 3 gürültü öznitelik

# 6 öznitelik: sadece 3'ü GERÇEKTEN fiyatı etkiliyor, diğer 3'ü saf gürültü (rastgele, alakasız).
n = 100
isimler = ["metrekare", "oda_sayisi", "bina_yasi", "kat_no", "sokak_gurultusu", "dogum_ayi"]
gercek_agirliklar = np.array([0.8, 0.5, -0.3, 0.0, 0.0, 0.0])

X_ham = rng.normal(0, 1, size=(n, 6))
X = StandardScaler().fit_transform(X_ham)
y = X @ gercek_agirliklar + rng.normal(0, 0.5, n)

print(f"Veri: {n} satır, {X.shape[1]} öznitelik (bunlardan 3'ü gürültü: kat_no, sokak_gurultusu, dogum_ayi)")
Veri: 100 satır, 6 öznitelik (bunlardan 3'ü gürültü: kat_no, sokak_gurultusu, dogum_ayi)

Ridge: hiçbir katsayı tam sıfır değil

ridge = Ridge(alpha=1.0)
ridge.fit(X, y)
print("Ridge katsayıları (alpha=1.0):")
for isim, k in zip(isimler, ridge.coef_):
    print(f"  {isim:<18} {k:+.3f}")
Ridge katsayıları (alpha=1.0):
  metrekare          +0.788
  oda_sayisi         +0.466
  bina_yasi          -0.228
  kat_no             -0.081
  sokak_gurultusu    +0.051
  dogum_ayi          -0.059

Ridge’de sokak_gurultusu ve dogum_ayi gibi alakasız öznitelikler küçük katsayılar alıyor (0.051, -0.059) ama TAM SIFIR değil. Şimdi Lasso’yu deneyelim:

Lasso: 3 gürültü özniteliği tam sıfırlanıyor

lasso = Lasso(alpha=0.1)
lasso.fit(X, y)
print("Lasso katsayıları (alpha=0.1):")
for isim, k in zip(isimler, lasso.coef_):
    isaret = "  <- SIFIRLANDI" if k == 0 else ""
    print(f"  {isim:<18} {k:+.3f}{isaret}")
Lasso katsayıları (alpha=0.1):
  metrekare          +0.712
  oda_sayisi         +0.357
  bina_yasi          -0.147
  kat_no             -0.000  <- SIFIRLANDI
  sokak_gurultusu    +0.000  <- SIFIRLANDI
  dogum_ayi          -0.000  <- SIFIRLANDI

Lasso, üç gürültü özniteliğini (kat_no, sokak_gurultusu, dogum_ayi) TAM OLARAK sıfırladı — model artık bu özniteliklerin var olduğunu bile “unuttu”. Çoğu kişi “Ridge ve Lasso ikisi de katsayıları küçültür, aralarında büyük fark olmaz” sanır. Değil, çünkü L1 cezasının matematiksel şekli (mutlak değer), optimizasyonun köşe noktalarında (katsayı=0 gibi) durmasına izin verir; L2 cezası (kare) ise pürüzsüz bir yüzey olduğu için optimizasyon neredeyse hiçbir zaman TAM sıfıra ulaşmaz.

Elastic Net ikisinin ortası bir yol sunuyor:

Elastic Net: kısmi seyreklik

# Elastic Net, Ridge (L2) ile Lasso (L1) cezalarını l1_ratio ile KARIŞTIRIR.
# l1_ratio=1 -> saf Lasso, l1_ratio=0 -> saf Ridge, arası bir denge sağlar.
elastic = ElasticNet(alpha=0.1, l1_ratio=0.5)
elastic.fit(X, y)
print("Elastic Net katsayıları (alpha=0.1, l1_ratio=0.5):")
for isim, k in zip(isimler, elastic.coef_):
    isaret = "  <- SIFIRLANDI" if k == 0 else ""
    print(f"  {isim:<18} {k:+.3f}{isaret}")
Elastic Net katsayıları (alpha=0.1, l1_ratio=0.5):
  metrekare          +0.718
  oda_sayisi         +0.392
  bina_yasi          -0.190
  kat_no             -0.021
  sokak_gurultusu    +0.000  <- SIFIRLANDI
  dogum_ayi          -0.005

l1_ratio=0.5 ile Elastic Net, sadece 1 özniteliği tam sıfırladı (sokak_gurultusu), diğer gürültü özniteliklerini (kat_no, dogum_ayi) küçük ama sıfır olmayan değerlere indirdi — Lasso’nun agresif seçiciliği ile Ridge’in yumuşak küçültmesi arasında bir denge.

Matematik

Üç düzenlileştirme cezası
Ridge: minw1n(yiy^i)2+αwj2\text{Ridge: } \min_w \frac{1}{n}\sum(y_i - \hat{y}_i)^2 + \alpha \sum w_j^2Lasso: minw1n(yiy^i)2+αwj\text{Lasso: } \min_w \frac{1}{n}\sum(y_i - \hat{y}_i)^2 + \alpha \sum \lvert w_j \rvert
SembolAnlamı
α\alphaDüzenlileştirme gücü — 0 ise sıradan regresyon, büyüdükçe ceza baskınlaşır
wj2\sum w_j^2L2 cezası (Ridge) — büyük katsayıları orantısız cezalandırır, pürüzsüz azalır
wj\sum \lvert w_j \rvertL1 cezası (Lasso) — köşeli bir ceza yüzeyi, katsayıları TAM sıfıra iter

Elastic Net, ikisini l1_ratio (ρ\rho) ile karıştırır: α(ρwj+1ρ2wj2)\alpha \left( \rho \sum \lvert w_j \rvert + \frac{1-\rho}{2} \sum w_j^2 \right). ρ=1\rho=1 saf Lasso, ρ=0\rho=0 saf Ridge’dir.

Kod

α arttıkça her iki yöntemde kaç katsayının tam sıfırlandığını izleyelim:

Alpha arttıkça sıfırlanan katsayı sayısı

alphalar = np.logspace(-3, 0.5, 8)
print(f"{'alpha':>8}  {'ridge sifir sayisi':>18}  {'lasso sifir sayisi':>18}")
for a in alphalar:
    r = Ridge(alpha=a).fit(X, y)
    l = Lasso(alpha=a, max_iter=5000).fit(X, y)
    r_sifir = int(np.sum(np.abs(r.coef_) < 1e-8))
    l_sifir = int(np.sum(np.abs(l.coef_) < 1e-8))
    print(f"{a:8.4f}  {r_sifir:18d}  {l_sifir:18d}")
print("\nRidge hemen hemen hiçbir zaman tam sıfır üretmiyor; Lasso alpha arttıkça öznitelikleri teker teker eliyor.")
   alpha  ridge sifir sayisi  lasso sifir sayisi
  0.0010                   0                   0
  0.0032                   0                   0
  0.0100                   0                   0
  0.0316                   0                   0
  0.1000                   0                   3
  0.3162                   0                   4
  1.0000                   0                   6
  3.1623                   0                   6

Ridge hemen hemen hiçbir zaman tam sıfır üretmiyor; Lasso alpha arttıkça öznitelikleri teker teker eliyor.

Tablo çok net: Ridge sütunu α=3.16’ya kadar hep 0 kalıyor (hiçbir katsayı tam sıfırlanmıyor); Lasso sütunu ise 0 → 3 → 4 → 6 şeklinde adım adım artıyor.

Sol grafikte Ridge katsayı yolları log(alpha) arttıkça pürüzsüzce sıfıra yaklaşıyor ama değmiyor; sağ grafikte Lasso katsayı yolları teker teker tam sıfıra iniyor ve orada düz kalıyor.
Ridge (sol) katsayıları pürüzsüzce küçültür; Lasso (sağ) katsayıları teker teker tam sıfıra 'kilitler' -- bu seyrekliktir (sparsity).

Nerede işe yarar

Düzenlileştirme, gerçek dünyadaki neredeyse her doğrusal modelde varsayılan bir bileşendir:

  • Çok sayıda öznitelik olan problemlerde Lasso. Yüzlerce öznitelik arasından hangilerinin gerçekten önemli olduğunu otomatik olarak bulmak istediğinde.
  • Öznitelikler birbiriyle ilişkiliyken (multicollinearity) Ridge. Lasso ilişkili özniteliklerden rastgele birini seçip diğerini sıfırlayabilir; Ridge ikisini de “paylaştırarak” tutar.
  • Elastic Net, ikisinden de emin olmadığında. Hem bazı özniteliklerin elenmesini hem de ilişkili özniteliklerin korunmasını istiyorsan.

Bu 3 hatayı yaparsın:

  1. Öznitelikleri standardize etmeden düzenlileştirme uygulamak — ceza terimi, büyük ölçekli özniteliklerin katsayısını orantısız cezalandırır (15. veri bilimi dersini hatırla).
  2. α’yı rastgele bir sabit seçmek — doğru α, veri setine göre değişir ve genelde çapraz doğrulamayla (bir sonraki ders) bulunur.
  3. Lasso’nun sıfırladığı bir özniteliğin “kesinlikle önemsiz” olduğuna karar vermek — sıfırlanma, o α değerinde ve o veri örnekleminde geçerlidir, mutlak bir gerçek değildir.

Kendini test et

1. Lasso (L1) ile Ridge (L2) arasındaki en önemli pratik fark nedir?
  1. Lasso her zaman daha düşük hata verir
  2. Lasso katsayıları TAM SIFIRA indirebilir (öznitelik seçimi yapar), Ridge sadece küçültür (doğru cevap)
  3. Ridge daha hızlı çalışır
  4. Aralarında pratik fark yoktur

Neden: L1 cezasının köşeli matematiksel şekli, optimizasyonun tam sıfır noktasında durmasına izin verir; L2 cezası pürüzsüz olduğu için bu neredeyse hiç olmaz.

2. Notebook'ta Lasso, hangi 3 özniteliğin katsayısını tam sıfıra indirdi?
  1. metrekare, oda_sayisi, bina_yasi (gerçek etkisi olanlar)
  2. kat_no, sokak_gurultusu, dogum_ayi (saf gürültü olanlar) (doğru cevap)
  3. Rastgele 3 öznitelik
  4. Hiçbirini, hepsi nonzero kaldı

Neden: Lasso, gerçekte fiyatı etkilemeyen (saf gürültü) 3 özniteliği doğru şekilde sıfırladı; gerçek etkisi olan 3 öznitelik nonzero kaldı.

3. Elastic Net ne zaman Ridge veya Lasso'nun tek başına kullanılmasından daha uygun olabilir?
  1. Asla, her zaman Lasso tercih edilmeli
  2. Hem bazı özniteliklerin elenmesini hem de ilişkili özniteliklerin birlikte korunmasını istediğinde (doğru cevap)
  3. Sadece veri seti çok küçükken
  4. Sadece sınıflandırma problemlerinde

Neden: Elastic Net, L1'in seçicilik özelliği ile L2'nin ilişkili öznitelikleri birlikte tutma özelliğini birleştirir -- ikisinin avantajını da kısmen almak istediğinde tercih edilir.

Özet

Özet

  • Düzenlileştirme, kayıp fonksiyonuna katsayı büyüklüğünü cezalandıran bir terim ekleyerek aşırı öğrenmeyi frenler.
  • Ridge (L2), tüm katsayıları küçültür ama neredeyse hiçbir zaman tam sıfıra indirmez.
  • Lasso (L1), bazı katsayıları TAM SIFIRA indirir -- bu otomatik bir öznitelik seçimidir (seyreklik/sparsity).
  • Elastic Net, L1 ve L2 cezalarını l1_ratio ile karıştırarak ikisi arasında bir denge sunar.
  • Düzenlileştirme gücü (α) veri setine göre ayarlanmalı, genelde çapraz doğrulamayla bulunur.
Sonraki adım: Çapraz doğrulama türleri →