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 (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
🎯 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.
🏠 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.