Bias-variance trade-off: ezber mi, genelleme mi?
2026 · 10 dakika okuma
Modelini eğitim verisinde test ediyorsun, %99 doğruluk. Harika. Sonra gerçek veriye bakıyorsun — %60. Ne oldu?
Model eğitim verisini ezberledi. Öğrenmedi, ezberledi. Bu overfitting. Ve tam tersi de var: model çok basit, hiçbir şeyi yakalayamıyor — underfitting. İkisi arasındaki denge bias-variance trade-off'tur.
Önce dene
Polinom derecesini kaydır. Yeşil noktalar train verisi, kırmızı halkalar test verisi. Mor eğri modelinin öğrendikleri. Kesik gri çizgi ise gerçek fonksiyon — modelin bulmaya çalıştığı şey.
Derece 1: Model çok basit. Hem train hem test hatası yüksek — yüksek bias. Gerçek fonksiyonun karmaşıklığını yakalayamıyor.
Bias nedir, variance nedir?
- Bias (önyargı):Modelin gerçek fonksiyondan sistematik sapması. Çok basit model — yüksek bias, underfitting. "Model yanlı" demek değil, "model yetersiz karmaşıklıkta" demek.
- Variance (varyans): Modelin farklı veri setlerine ne kadar duyarlı olduğu. Çok karmaşık model — yüksek variance, overfitting. Gürültüyü de öğreniyor, genelleyemiyor.
Bias azaldıkça variance artar, variance azaldıkça bias artar. İkisini aynı anda minimize edemezsin — bu trade-off'tur. Hedef: her ikisinin toplamını minimize etmek.
Pratikte nasıl tanırsın?
from sklearn.model_selection import learning_curve
import numpy as np
import matplotlib.pyplot as plt
train_sizes, train_scores, val_scores = learning_curve(
model, X, y,
train_sizes=np.linspace(0.1, 1.0, 10),
cv=5, scoring='neg_mean_squared_error'
)
train_err = -train_scores.mean(axis=1)
val_err = -val_scores.mean(axis=1)
plt.plot(train_sizes, train_err, label='Train hatası')
plt.plot(train_sizes, val_err, label='Validation hatası')
plt.xlabel('Eğitim örnek sayısı')
plt.ylabel('MSE')
plt.legend()
plt.show()
# Underfitting: her iki hata da yüksek ve birbirine yakın
# Overfitting: train hatası düşük, val hatası çok yüksek
# İyi model: her ikisi de düşük ve birbirine yakınÇözümler
- Underfitting için: Daha karmaşık model seç, yeni özellikler ekle (feature engineering), regularizasyonu azalt.
- Overfitting için: Daha fazla veri topla, regularizasyon ekle (L1/L2), dropout kullan (derin öğrenmede), modeli basitleştir, cross-validation uygula.
from sklearn.linear_model import Ridge, Lasso
from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import Pipeline
# Yüksek dereceli polinom + Ridge regularizasyon
# Overfitting'i kontrol altında tutar
model = Pipeline([
('poly', PolynomialFeatures(degree=8)),
('ridge', Ridge(alpha=1.0)) # alpha arttıkça regularizasyon güçlenir
])
model.fit(X_train, y_train)
print(f"Train R²: {model.score(X_train, y_train):.3f}")
print(f"Test R²: {model.score(X_test, y_test):.3f}")Cross-validation: overfitting'i yakalamak için
Test setini bir kez kullanırsın ve model ona göre ayarlanmaya başlar. Cross-validation, veriyi birden fazla parçaya bölerek daha güvenilir bir performans tahmini verir.
from sklearn.model_selection import cross_val_score
scores = cross_val_score(model, X, y, cv=5, scoring='r2')
print(f"CV skorları: {scores}")
print(f"Ortalama: {scores.mean():.3f} ± {scores.std():.3f}")
# Düşük ortalama → underfitting
# Yüksek std → overfitting (kararsız model)
# İdeal: yüksek ortalama, düşük stdSıradaki yazıda zaman serisi analizi: trend, mevsimsellik ve Python'da Prophet ile basit tahmin.