Meydan okuma 3
- Makine Öğrenmesi kursu
- Başlangıç
- Ders 111/112
- 8 dk
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
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
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
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
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.
model = make_pipeline(____, LogisticRegression())
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 |