Ana içeriğe geç

Orta15 dk

Aşırı öğrenme ve bias-variance

Önkoşul:Polinom regresyon

Kanca

  1. derste “yüksek derece = daha kötü” gördük, ama nedeni sayısal kararsızlıktı. Peki sayısal sorun olmasa bile, çok yüksek bir derece neden hâlâ kötü bir fikir? Ve “en iyi” derece nasıl belirlenir — deneme yanılma dışında bir yolu var mı?

Sezgi

Bir modelin veriye ne kadar iyi uyduğunu SADECE eğitildiği veri üzerinde ölçersen, yanıltıcı bir resim elde edersin. Gerçek soru şu: model, daha önce hiç görmediği yeni verilerde nasıl performans gösterir? Bunu ölçmek için veriyi ikiye ayırırız: model eğitim verisiyle kurulur, sonra hiç görmediği test verisiyle sınanır.

-3-2-10123-202xy

eğitim noktası    test noktası (model bunları hiç görmedi)

246805101520Polinom derecesiMSE

eğitim hatası    test hatası

Derece 2 — eğitim MSE: 0.271, test MSE: 0.442. Model çok basit — hem eğitim hem test hatası yüksek (yüksek bias, yetersiz öğrenme).

Polinom derecesini değiştir: çok düşükken (1-2) hem eğitim hem test hatası yüksek kalır — model ilişkiyi yakalayacak kadar esnek değil, buna yetersiz öğrenme (yüksek bias) denir. Çok yüksekken, eğitim hatası küçülmeye devam eder ama test hatası fırlar — model artık gerçek örüntüyü değil, eğitim verisindeki GÜRÜLTÜYÜ ezberliyor, buna aşırı öğrenme (yüksek varyans) denir. İkisinin arasında bir “tatlı nokta” var.

Mekanizma

Gerçek verilerle, aynı fikri scikit-learn’le doğrulayalım. Önce veriyi eğitim ve test olarak ayıralım:

Eğitim/test ayrımı

# Gerçek ilişki dalgalı (sinüs benzeri) -- basit bir doğru veya tek bir parabol asla tam oturmaz.
n = 60
x = rng.uniform(-3, 3, n)
y = np.sin(1.3 * x) + 0.22 * x + rng.normal(0, 0.3, n)

x_egitim, x_test, y_egitim, y_test = train_test_split(x, y, test_size=0.3, random_state=21)
print(f"Eğitim seti: {len(x_egitim)} nokta, test seti: {len(x_test)} nokta")
Eğitim seti: 42 nokta, test seti: 18 nokta

Çok düşük bir derece deneyelim:

Derece=1: yetersiz öğrenme

donusturucu1 = PolynomialFeatures(degree=1, include_bias=False)
X1_egitim = donusturucu1.fit_transform(x_egitim.reshape(-1, 1))
X1_test = donusturucu1.transform(x_test.reshape(-1, 1))

model1 = LinearRegression()
model1.fit(X1_egitim, y_egitim)
mse1_egitim = mean_squared_error(y_egitim, model1.predict(X1_egitim))
mse1_test = mean_squared_error(y_test, model1.predict(X1_test))
print(f"Derece=1 -> eğitim MSE: {mse1_egitim:.3f}, test MSE: {mse1_test:.3f}")
print("İkisi de yüksek -- model dalgalı ilişkiyi hiç yakalayamıyor (yüksek bias).")
Derece=1 -> eğitim MSE: 0.524, test MSE: 0.433
İkisi de yüksek -- model dalgalı ilişkiyi hiç yakalayamıyor (yüksek bias).

Hem eğitim (0.524) hem test (0.433) hatası yüksek — model henüz veriyi “anlamamış” bile. Şimdi çok yüksek bir derece deneyelim:

Derece=16: aşırı öğrenme

donusturucu16 = PolynomialFeatures(degree=16, include_bias=False)
X16_egitim = donusturucu16.fit_transform(x_egitim.reshape(-1, 1))
X16_test = donusturucu16.transform(x_test.reshape(-1, 1))

model16 = LinearRegression()
model16.fit(X16_egitim, y_egitim)
mse16_egitim = mean_squared_error(y_egitim, model16.predict(X16_egitim))
mse16_test = mean_squared_error(y_test, model16.predict(X16_test))
print(f"Derece=16 -> eğitim MSE: {mse16_egitim:.3f}, test MSE: {mse16_test:.3f}")
print("Test hatası eğitim hatasının neredeyse 12 katı -- model eğitim verisindeki GÜRÜLTÜYÜ ezberliyor.")
Derece=16 -> eğitim MSE: 0.510, test MSE: 6.218
Test hatası eğitim hatasının neredeyse 12 katı -- model eğitim verisindeki GÜRÜLTÜYÜ ezberliyor.

Burada eğitim hatası (0.510) yüksek dereceye rağmen düşük DEĞİL (6. derste gördüğümüz sayısal kararsızlık burada da devrede), ama test hatası (6.218) çok daha çarpıcı biçimde kötü — eğitim hatasının neredeyse 12 katı. Çoğu kişi “aşırı öğrenme = eğitim verisinde mükemmel, sadece testte kötü” diye düşünür. Kısmen doğru, ama asıl belirleyici işaret eğitim ile test hatası arasındaki AÇILAN FARK — model, eğitim setine özgü rastgele gürültüyü “öğrenip” bunu genel bir kural sanıyor.

Matematik

Bias-variance ayrışımı (sezgisel)
Beklenen Test Hatası=Bias2model c¸ok basit+Varyansmodel c¸ok duyarlı+I˙ndirgenemez Hatagu¨ru¨ltu¨\text{Beklenen Test Hatası} = \underbrace{\text{Bias}^2}_{\text{model çok basit}} + \underbrace{\text{Varyans}}_{\text{model çok duyarlı}} + \underbrace{\text{İndirgenemez Hata}}_{\text{gürültü}}
TerimAnlamı
Bias (yanlılık)Modelin, gerçek ilişkiyi ne kadar SİSTEMATİK olarak kaçırdığı — çok basit bir model her zaman aynı şekilde yanılır
VaryansModelin, FARKLI eğitim setlerinde ne kadar farklı sonuçlar üreteceği — çok esnek bir model, verideki küçük değişikliklere aşırı duyarlıdır
İndirgenemez hataVerideki doğal gürültü — hiçbir model bunu ortadan kaldıramaz

Düşük dereceli model: yüksek bias (sistematik olarak yanlış), düşük varyans (hangi eğitim setini kullanırsan kullan, benzer -yanlış- sonuç). Yüksek dereceli model: düşük bias (esnek, veriye çok yakın), yüksek varyans (farklı bir eğitim seti, tamamen farklı bir eğri verir). En iyi derece, bias ve varyansın TOPLAMININ minimum olduğu noktadır — genelde her ikisi de sıfır olmaz.

Kod

Tüm dereceleri tek tek deneyip en iyisini bulalım:

En iyi dereceyi aramak

sonuclar = []
for derece in range(1, 17):
    donusturucu = PolynomialFeatures(degree=derece, include_bias=False)
    X_e = donusturucu.fit_transform(x_egitim.reshape(-1, 1))
    X_t = donusturucu.transform(x_test.reshape(-1, 1))
    model = LinearRegression()
    model.fit(X_e, y_egitim)
    sonuclar.append({
        "derece": derece,
        "egitim_mse": mean_squared_error(y_egitim, model.predict(X_e)),
        "test_mse": mean_squared_error(y_test, model.predict(X_t)),
    })

en_iyi = min(sonuclar, key=lambda s: s["test_mse"])
print(f"\nEn düşük test hatasını veren derece: {en_iyi['derece']}  (test MSE: {en_iyi['test_mse']:.3f})")
for s in sonuclar:
    isaret = "  <- en iyi" if s["derece"] == en_iyi["derece"] else ""
    print(f"derece={s['derece']:>2}  eğitim={s['egitim_mse']:.3f}  test={s['test_mse']:.3f}{isaret}")

En düşük test hatasını veren derece: 7  (test MSE: 0.077)
derece= 1  eğitim=0.524  test=0.433
derece= 2  eğitim=0.516  test=0.457
derece= 3  eğitim=0.109  test=0.102
derece= 4  eğitim=0.108  test=0.102
derece= 5  eğitim=0.071  test=0.087
derece= 6  eğitim=0.070  test=0.086
derece= 7  eğitim=0.067  test=0.077  <- en iyi
derece= 8  eğitim=0.065  test=0.097
derece= 9  eğitim=0.064  test=0.115
derece=10  eğitim=0.063  test=0.094
derece=11  eğitim=0.063  test=0.091
derece=12  eğitim=0.067  test=0.082
derece=13  eğitim=0.124  test=0.398
derece=14  eğitim=0.410  test=4.553
derece=15  eğitim=0.508  test=4.443
derece=16  eğitim=0.510  test=6.218

Derece 7, en düşük test hatasını (0.077) veriyor. Dikkat et: eğitim hatası derece arttıkça neredeyse hep düşüyor (13’e kadar), ama test hatası derece 7’den sonra tekrar yükselmeye başlıyor — bu, aşırı öğrenmenin başladığı nokta.

Polinom derecesine karşı eğitim ve test MSE'sini gösteren çizgi grafiği; eğitim hatası sürekli azalırken test hatası önce azalıp derece 7'den sonra keskin biçimde artıyor.
Eğitim hatası (mavi) sürekli düşer; test hatası (turuncu) bir noktadan sonra yükselmeye başlar -- bu ayrışma aşırı öğrenmenin işaretidir.

Nerede işe yarar

Bias-variance dengesi, makine öğrenmesinin neredeyse her modelinde karşına çıkar:

  • Model karmaşıklığı seçimi. Derece, ağaç derinliği, sinir ağı katman sayısı gibi her “esneklik” parametresi bu dengeyi taşır.
  • Eğitim/test ayrımının GEREKÇESİ. Sadece eğitim hatasına bakmak seni yanıltır — bir sonraki derste (çapraz doğrulama) bu ayrımı daha sağlam hale getireceğiz.
  • Erken durdurma sinyali. Birçok algoritmada (gradyan artırma, sinir ağları), eğitim ilerledikçe test hatasının ne zaman tekrar yükselmeye başladığını izlemek, durma noktasını belirler.

Bu 3 hatayı yaparsın:

  1. Modeli sadece eğitim hatasına bakarak seçmek — eğitim hatası her zaman “daha karmaşık = daha iyi” der, ama bu yanıltıcıdır.
  2. Test verisini modeli AYARLARKEN (derece seçerken) tekrar tekrar kullanmak — bu da bir tür gizli aşırı öğrenmedir (bu sorunun çözümü bir sonraki derste: çapraz doğrulama).
  3. “Aşırı öğrenme” ile “yetersiz öğrenme”yi karıştırmak — ikisi de kötü test performansına yol açar ama TEŞHİSİ (ve çözümü) tamamen farklıdır.

Kendini test et

1. Bir modelin eğitim hatası düşük ama test hatası yüksekse, bu neyin işaretidir?
  1. Yetersiz öğrenme (yüksek bias)
  2. Aşırı öğrenme (yüksek varyans) (doğru cevap)
  3. Model mükemmel çalışıyor
  4. Veri seti çok büyük

Neden: Eğitim ve test hatası arasındaki büyük fark, modelin eğitim verisine özgü gürültüyü ezberlediğinin (aşırı öğrenme, yüksek varyans) klasik işaretidir.

2. Bir model hem eğitim hem test verisinde yüksek hata veriyorsa, en olası açıklama nedir?
  1. Aşırı öğrenme
  2. Model çok karmaşık
  3. Yetersiz öğrenme (yüksek bias) -- model gerçek ilişkiyi yakalayacak kadar esnek değil (doğru cevap)
  4. Veri seti bölünmemiş

Neden: Model hem eğitim hem test verisinde başarısızsa, muhtemelen o modelin biçimi (örn. çok düşük dereceli bir polinom) gerçek ilişkiyi ifade etmeye yetmiyordur -- bu yüksek bias'tır.

3. Notebook'ta neden test hatası, derece 7'den sonra tekrar yükselmeye başladı?
  1. Kod hatalıydı
  2. Model, eğitim verisindeki rastgele gürültüye giderek daha fazla uymaya başladı, bu da genelleme (yeni veride) performansını kötüleştirdi (doğru cevap)
  3. Test verisi değişti
  4. scikit-learn bir sınır koyuyor

Neden: Derece arttıkça model daha esnek hale gelir ve eğitim verisindeki gürültüye bile uymaya başlar; bu gürültü test verisinde tekrarlanmadığı için test hatası yükselir -- bu aşırı öğrenmedir.

Özet

Özet

  • Bir modeli sadece eğitim verisinde değerlendirmek yanıltıcıdır; test verisi (modelin hiç görmediği veri) gerçek performansı gösterir.
  • Yetersiz öğrenme (yüksek bias): model çok basit, hem eğitim hem test hatası yüksek.
  • Aşırı öğrenme (yüksek varyans): model çok esnek, eğitim hatası düşük ama test hatası yüksek.
  • En iyi model karmaşıklığı, bias ile varyansın toplamını minimize eden noktadır.
  • Eğitim ile test hatası arasındaki AÇILAN FARK, aşırı öğrenmenin en güvenilir işaretidir.
Sonraki adım: Ridge, Lasso, Elastic Net →