Makine öğrenmesinde aşırı öğrenme (overfitting): nasıl anlaşılır, nasıl önlenir?
Modelin eğitim verisinde neredeyse kusursuz, yeni veride ise kötü sonuç veriyorsa büyük ihtimalle aşırı öğrenme (overfitting) yaşıyorsun. Model genel kuralı öğrenmek yerine eğitim örneklerini ezberlemiş demektir.
Nasıl anlaşılır?
Veriyi en az üçe ayır:
- Eğitim (train): Model bununla öğrenir.
- Doğrulama (validation): Ayar yaparken başarıyı buna bakarak ölçersin.
- Test: En sonda, bir kez, gerçek başarıyı görmek için.
from sklearn.model_selection import train_test_split
X_tmp, X_test, y_tmp, y_test = train_test_split(X, y, test_size=0.15, random_state=42)
X_train, X_val, y_train, y_val = train_test_split(X_tmp, y_tmp, test_size=0.15, random_state=42)
Eğitim başarısı yükselirken doğrulama başarısı düşmeye başlıyorsa (ya da kayıp artıyorsa) aşırı öğrenme başlamıştır. Eğitim süresince iki eğriyi birlikte çizmek bunu görmenin en kolay yolu.
Tersi de mümkün: Model iki veri setinde de kötüyse yetersiz öğrenme (underfitting) vardır; model ya çok basittir ya da veri yetersizdir.
Nasıl önlenir?
- Daha fazla veri: En etkili çözüm. Görüntüde döndürme, kırpma gibi veri çoğaltma (augmentation) da işe yarar.
- Daha basit model: Karar ağacında derinliği sınırla, sinir ağında katman veya nöron sayısını azalt.
- Düzenlileştirme (regularization): L1/L2 cezası ağırlıkların aşırı büyümesini engeller. Sinir ağlarında dropout yaygın bir yöntemdir.
- Erken durdurma (early stopping): Doğrulama kaybı belirli sayıda tur boyunca iyileşmiyorsa eğitimi durdur.
- Çapraz doğrulama (cross-validation): Az veriyle çalışırken sonucun şansa bağlı olmadığından emin olmanı sağlar.
from sklearn.model_selection import cross_val_score
skorlar = cross_val_score(model, X_train, y_train, cv=5)
print(skorlar.mean(), skorlar.std())
Sık yapılan hata: veri sızıntısı (data leakage)
Model test verisinde şüphe uyandıracak kadar iyiyse sızıntıdan şüphelen:
- Ölçekleme veya eksik değer doldurma işlemini veriyi bölmeden önce tüm veriye uygulamak. Bu işlemler yalnızca eğitim verisinden öğrenilmeli; scikit-learn'de
Pipelinebunu kendiliğinden doğru yapar. - Hedef değişkeni dolaylı yoldan içeren bir özellik bırakmak (örneğin "iade tarihi" sütunuyla iade tahmini yapmak).
- Zaman serisinde veriyi rastgele bölmek. Gelecekteki veriyle geçmişi tahmin etmiş olursun; zamana göre böl.
Test setine ayar yaparken bakmamak da önemli. Bakarsan test seti de bir doğrulama setine dönüşür ve gerçek başarıyı ölçemezsin.