CodeBlanks Logo Icon CodeBlanks

K-fold

K-fold, veriyi k eşit parçaya böler ve her parçayı bir kez test eder.

KFold

KFold veriyi K ardışık parçaya böler. Veride bir sıra varsa (önce tüm 0'lar, sonra tüm 1'ler) karıştırmadan bölmek katmanları dengesiz yapar; bu yüzden shuffle=True sık kullanılır:

from sklearn.model_selection import KFold
kf = KFold(n_splits=5, shuffle=True, random_state=0)
for egitim, dogrulama in kf.split(X):
    print(len(egitim), len(dogrulama))

split indeks dizileri üretir; veri kopyalanmaz.

K seçimi

K büyüdükçe her eğitim kümesi tüm veriye yaklaşır (daha az iyimser olmayan tahmin) ama eğitim sayısı ve süre artar. Yaygın seçimler 5 ve 10'dur. Uç durum leave-one-out: K = örnek sayısı.

from sklearn.model_selection import LeaveOneOut
print(LeaveOneOut().get_n_splits(X))   # örnek sayısı kadar eğitim

Büyük veri setlerinde 3 katman bile yeterli olabilir; küçüklerde 10 katman ya da tekrarlı CV tercih edilir.

Uygulama Elle CV döngüsü

KFold(n_splits=5, shuffle=True, random_state=0) ile katmanları gez. Her katmanda clone(model)'u eğitim indeksleriyle eğit, doğrulama doğruluğunu topla. Ortalamayı round(..., 3) ile yazdır.

Başlangıç kodu

model.py
import numpy as np
from sklearn.base import clone
from sklearn.model_selection import KFold
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())

# buraya yaz

Örnek çözüm

model.py
import numpy as np
from sklearn.base import clone
from sklearn.model_selection import KFold
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())

skor = []
for egitim, dogrulama in KFold(n_splits=5, shuffle=True, random_state=0).split(X):
    m = clone(model).fit(X[egitim], y[egitim])
    skor.append(m.score(X[dogrulama], y[dogrulama]))
print(round(np.mean(skor), 3))

Beklenen çıktı

0.972

Soru ve cevaplar

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

1 100 örnek ve <code>n_splits=4</code> ile her doğrulama katmanında kaç örnek olur?

  • 75
  • 4
  • 20
  • 25 Doğru cevap

Açıklama: 100 / 4 = 25 doğrulama, kalan 75 eğitim.

2 Katmanlara bölmeden önce karıştır.

Soru
kf = KFold(n_splits=5, ____=True, random_state=0)
Cevap
kf = KFold(n_splits=5, shuffle=True, random_state=0)

Açıklama: shuffle=True sıralı veride dengesiz katmanları önler.

3 Bölücüleri eşleştir.

Kavram Anlamı
KFold K ardışık parça
LeaveOneOut Her seferinde bir örnek
shuffle=True Önce karıştırır
split(X) İndeks üretir

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