CodeBlanks Logo Icon CodeBlanks

Cross-validation nedir?

Cross-validation, veriyi k katmana bölerek modeli k kez değerlendirir.

Çapraz doğrulama ne çözer?

Tek bir eğitim/test bölmesinin skoru, hangi örneklerin teste düştüğüne bağlıdır. Çapraz doğrulama (CV) bu şansı ortadan kaldırır: veri katmanlara bölünür ve her katman sırayla doğrulama olur. Sonuç bir skor dağılımıdır.

for rs in range(5):
    X_tr, X_te, y_tr, y_te = train_test_split(X, y, test_size=0.2, random_state=rs)
    print(rs, round(model.fit(X_tr, y_tr).score(X_te, y_te), 3))
# skor bölmeden bölmeye birkaç puan oynar

CV ayrıca veriyi verimli kullanır: her örnek hem eğitimde hem doğrulamada yer alır.

Bölmeye bağlı oynaklık

Bölme oynaklığını ölçmek için skorların standart sapmasına bakılır. Küçük veri setlerinde oynaklık büyüktür ve tek bölmeye dayanan kararlar yanıltıcı olur:

skorlar = cross_val_score(model, X, y, cv=10)
print(f"{skorlar.mean():.3f} ± {skorlar.std():.3f}")
print(skorlar.min(), skorlar.max())   # en kötü ve en iyi katman

İki modelin farkı, skorların standart sapmasından küçükse "eşit" kabul etmek daha güvenlidir.

Uygulama Bölme oynaklığı

5 farklı random_state (0-4) ile test_size=0.2 bölmeleri yap ve her birinde modeli eğitip test doğruluğunu topla. En küçük ve en büyük skoru round(..., 3) ile aynı satırda yazdır.

Başlangıç kodu

model.py
from sklearn.datasets import load_breast_cancer
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression

X, y = load_breast_cancer(return_X_y=True)
model = make_pipeline(StandardScaler(), LogisticRegression())
from sklearn.model_selection import train_test_split

# buraya yaz

Örnek çözüm

model.py
from sklearn.datasets import load_breast_cancer
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression

X, y = load_breast_cancer(return_X_y=True)
model = make_pipeline(StandardScaler(), LogisticRegression())
from sklearn.model_selection import train_test_split

skorlar = []
for rs in range(5):
    X_tr, X_te, y_tr, y_te = train_test_split(X, y, test_size=0.2, random_state=rs)
    skorlar.append(model.fit(X_tr, y_tr).score(X_te, y_te))
print(round(min(skorlar), 3), round(max(skorlar), 3))

Beklenen çıktı

0.965 0.974

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Çapraz doğrulama test kümesinin yerini tutar mı?

  • Hayır; model seçimi CV ile, son ölçüm ayrı test kümesiyle yapılır Doğru cevap
  • Evet, her zaman
  • Yalnızca regresyonda
  • Test kümesi gereksizdir

Açıklama: CV skoru seçim için kullanıldıkça iyimserleşir; bağımsız bir test hâlâ gerekir.

2 Tek bölmenin skorunu farklı tohumlarla tekrarla.

Soru
for rs in ____(5):
Cevap
for rs in range(5):

Açıklama: range(5) 0'dan 4'e tohumlar üretir.

3 Kavramları eşleştir.

Kavram Anlamı
katman (fold) Verinin bir parçası
skorlar.std() Bölme oynaklığı
test kümesi Son bağımsız ölçüm
CV ortalaması Seçim ölçütü

Orta seviye bölümündeki tüm dersler