CodeBlanks Logo Icon CodeBlanks

Meydan okuma 3

Regresyon modeli eğitir ve tahmin yaparsın.

Meydan okuma 3: sızıntıyı yakala

Bir ekip arkadaşın şu kodla %100'e yakın doğruluk bildiriyor. Sorun ölçeklemenin bölmeden önce tüm veride yapılması ve daha da kötüsü, etiketten türetilmiş bir özelliğin X'e eklenmesi:

X2 = np.column_stack([X, y + rng.normal(0, 0.1, len(y))])   # etiket sızıyor!
X2 = StandardScaler().fit_transform(X2)                   # tüm veride fit
X_tr, X_te, y_tr, y_te = train_test_split(X2, y, ...)

Gerçek hayatta sızıntı genellikle bu kadar açık değildir: "işlem iptal tarihi", "kontrol sonucu" gibi hedefi dolaylı bilen sütunlar.

Uygulama Sızıntıyı göster

Sızıntılı X2 ile ve özgün X ile aynı bölmede make_pipeline(StandardScaler(), LogisticRegression(max_iter=1000)) eğit. İki test doğruluğunu round(..., 3) ile alt alta yazdır (önce sızıntılı).

Başlangıç kodu

model.py
import numpy as np
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression

X, y = load_wine(return_X_y=True)
rng = np.random.default_rng(0)
X = X[:, :2]
X2 = np.column_stack([X, y + rng.normal(0, 0.1, len(y))])

# buraya yaz

Örnek çözüm

model.py
import numpy as np
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression

X, y = load_wine(return_X_y=True)
rng = np.random.default_rng(0)
X = X[:, :2]
X2 = np.column_stack([X, y + rng.normal(0, 0.1, len(y))])

for veri in [X2, X]:
    X_tr, X_te, y_tr, y_te = train_test_split(veri, y, test_size=0.3, random_state=0, stratify=y)
    m = make_pipeline(StandardScaler(), LogisticRegression(max_iter=1000)).fit(X_tr, y_tr)
    print(round(m.score(X_te, y_te), 3))

Beklenen çıktı

1.0
0.778

Uygulama Şüpheli sütunu bul

X2'nin her sütununu tek başına kullanan bir DecisionTreeClassifier(max_depth=3, random_state=0) için 5 katlı CV ortalamasını hesapla. Skorları np.round(..., 2) ile, ardından en yüksek skorlu sütunun indeksini yazdır.

Başlangıç kodu

model.py
import numpy as np
from sklearn.datasets import load_wine
from sklearn.model_selection import cross_val_score
from sklearn.tree import DecisionTreeClassifier

X, y = load_wine(return_X_y=True)
rng = np.random.default_rng(0)
X2 = np.column_stack([X[:, :2], y + rng.normal(0, 0.1, len(y))])

# buraya yaz

Örnek çözüm

model.py
import numpy as np
from sklearn.datasets import load_wine
from sklearn.model_selection import cross_val_score
from sklearn.tree import DecisionTreeClassifier

X, y = load_wine(return_X_y=True)
rng = np.random.default_rng(0)
X2 = np.column_stack([X[:, :2], y + rng.normal(0, 0.1, len(y))])

skor = [cross_val_score(DecisionTreeClassifier(max_depth=3, random_state=0), X2[:, [j]], y, cv=5).mean() for j in range(X2.shape[1])]
print(np.round(skor, 2))
print(int(np.argmax(skor)))

Beklenen çıktı

[0.64 0.62 1.  ]
2

Soru ve cevaplar

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

1 Bir özelliğin sızıntı olduğundan şüphelenmenin en güçlü işareti nedir?

  • Eksik değer içermesi
  • Kategorik olması
  • Ölçeklenmemiş olması
  • Tek başına neredeyse kusursuz tahmin vermesi Doğru cevap

Açıklama: Gerçek problemler nadiren tek bir özellikle çözülür; kusursuz sonuç genellikle hedefin sızdığını gösterir.

2 Ölçeklemeyi pipeline içine al.

Soru
model = make_pipeline(____, LogisticRegression())
Cevap
model = make_pipeline(StandardScaler(), LogisticRegression())

Açıklama: Pipeline içindeki ölçekleyici yalnızca eğitim verisinde fit edilir.

3 Hataları çözümleriyle eşleştir.

Kavram Anlamı
Tüm veride ölçekleme Pipeline kullan
Etiketten türetilmiş sütun Sütunu çıkar
Testte model seçme CV ile seç
Zaman serisini karıştırma shuffle=False

Başlangıç bölümündeki tüm dersler