← Modül 4

Eğitim & Doğrulama: Modelin Gerçek Sınavı

Modelinizin gerçek dünyada ne kadar iyi çalışacağını test etmek için doğru veri ayrımını öğrenin. Train/Validation/Test üçlüsü ve Cross-Validation'ın gücünü keşfedin.

⚡ Hızlı Özet: Neden Ayrım Yapıyoruz?

Eğitim Seti
Modeli öğretmek için
Doğrulama Seti
Hiperparametre ayarı için
Test Seti
Final performans için

Eğitim Seti (Train)

Modelin öğrendiği veri. %60-70'lik kısım. Model burada "ders çalışır".

Doğrulama Seti (Validation)

Model ayarlarını test ettiğimiz veri. %15-20'lik kısım. "Ara sınav" gibi.

Test Seti (Test)

Final performansı ölçtüğümüz veri. %15-20'lik kısım. "Final sınavı" gibi.

📊 Veri Ayrımı Görselleştirmesi

EĞİTİM (%60) DOĞRULAMA (%20) TEST (%20)

🎯 Neden Bu Ayrım?

Veri sızıntısını önlemek için! Model test verisini görmemeli, yoksa "kopya çekmiş" gibi olur ve gerçek performansını ölçemeyiz.

📈 Cross-Validation (Çapraz Doğrulama)

Tüm veriyi daha verimli kullanmak için. Veriyi parçalara böler, her parçayı test için kullanırız. Daha güvenilir performans tahmini sağlar.

💡 Kritik Kural

  • Test setine asla bakma
  • Hiperparametre ayarı için validation seti kullan
  • Final modeli tüm train + validation ile eğit
  • Test seti sadece final değerlendirme için

🔧 Train/Validation/Test Ayrımı

Manuel Ayrım (train_test_split)

from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error

# Önce Train/Test ayrımı
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42
)

# Sonra Train'i Train/Validation'a ayır
X_train, X_val, y_train, y_val = train_test_split(
    X_train, y_train, test_size=0.25, random_state=42  # 0.25 * 0.8 = 0.2
)

# Modeli eğit
model = LinearRegression()
model.fit(X_train, y_train)

# Validation'da değerlendir
val_pred = model.predict(X_val)
val_score = mean_squared_error(y_val, val_pred)
print(f"Validation MSE: {val_score:.2f}")

# Hiperparametre ayarı yap...

# Final modeli tüm train + validation ile eğit
X_train_full = np.vstack([X_train, X_val])
y_train_full = np.concatenate([y_train, y_val])
final_model = LinearRegression()
final_model.fit(X_train_full, y_train_full)

# Test setinde final değerlendirme
test_pred = final_model.predict(X_test)
test_score = mean_squared_error(y_test, test_pred)
print(f"Test MSE: {test_score:.2f}")

Cross-Validation ile

from sklearn.model_selection import cross_val_score, GridSearchCV
from sklearn.ensemble import RandomForestRegressor
from sklearn.pipeline import Pipeline

# Pipeline oluştur
pipeline = Pipeline([
    ('scaler', StandardScaler()),
    ('model', RandomForestRegressor(random_state=42))
])

# Hiperparametre grid'i
param_grid = {
    'model__n_estimators': [100, 200],
    'model__max_depth': [None, 10, 20]
}

# GridSearchCV ile hem CV hem hiperparametre optimizasyonu
grid_search = GridSearchCV(
    pipeline, 
    param_grid, 
    cv=5,  # 5-fold cross-validation
    scoring='neg_mean_squared_error',
    n_jobs=-1
)

# Sadece train setinde eğit
grid_search.fit(X_train, y_train)

# En iyi parametreler ve skor
print("En iyi parametreler:", grid_search.best_params_)
print("En iyi CV skoru:", -grid_search.best_score_)

# Test setinde final değerlendirme
best_model = grid_search.best_estimator_
test_score = best_model.score(X_test, y_test)
print(f"Test R²: {test_score:.3f}")

🔄 Cross-Validation Nasıl Çalışır?

5-Fold Cross Validation

Veriyi 5 eşit parçaya böleriz. Her seferinde 4'ü ile eğitip 1'i ile test ederiz. Bu işlemi 5 kez tekrarlayıp ortalamasını alırız.

Fold 1 Performans: -
Fold 2 Performans: -
Fold 3 Performans: -
Fold 4 Performans: -
Fold 5 Performans: -
Ortalama: -

🏠 Gerçek Hayat Senaryoları

Küçük Veri Seti (<1,000 satır)

60/20/20 ayrımı veya 5-fold CV kullanın. Cross-validation daha güvenilir sonuç verir.

Orta Büyüklükte Veri (1,000-10,000 satır)

70/15/15 ayrımı idealdir. Hem yeterli eğitim verisi hem de güvenilir test sonuçları.

Büyük Veri Seti (>10,000 satır)

80/10/10 ayrımı yeterlidir. Çok fazla test verisine ihtiyaç yok.

🚀 En İyi Uygulamalar

Random State Sabit Tutun: Sonuçların tekrarlanabilir olması için
Stratified Split: Sınıflandırma problemlerinde sınıf dağılımını koruyun
Zaman Serileri: TimeSeriesSplit kullanın, rastgele bölmeyin
Pipeline Kullanın: Veri sızıntısını önlemek için
Çok Fazla CV Fold'u: 10'dan fazla fold gereksiz hesaplama yükü getirir

✅ ÖĞRENDİKLERİMİZ

Train/Validation/Test ayrımı şarttır
Cross-validation daha güvenilir sonuç verir
Test setine asla bakılmaz
Pipeline kullanımı veri sızıntısını önler
Veri büyüklüğüne göre ayrım oranı değişir
Random state sabit tutulmalıdır