Model eğitimi
- Makine Öğrenmesi kursu
- Orta seviye
- Ders 32/112
- 7 dk
SVM modelini eğitirsin.
Hat ve arama
Model hattı: medyanla doldurma → ölçekleme → SVM. Dengesizliğe karşı class_weight="balanced", azınlık sınıfının hatalarını sınıf oranının tersiyle ağırlıklandırır. Ayarlar F1'e göre aranır:
pipe = make_pipeline(SimpleImputer(strategy="median"), StandardScaler(),
SVC(class_weight="balanced"))
izgara = {"svc__C": [0.1, 1, 10], "svc__gamma": ["scale", 0.1]}
gs = GridSearchCV(pipe, izgara, cv=5, scoring="f1").fit(X_train, y_train)Medyan, eksik değer doldurmada aykırı değerlere ortalamadan daha dayanıklıdır.
Temel çizgi
Arama sonucunu yorumlamak için önce ayarsız bir temel çizgi kurarız: aynı hat, class_weight olmadan ve varsayılan ayarlarla. Projenin her adımı bu temele göre ne kazandırdığıyla değerlendirilir:
temel = make_pipeline(SimpleImputer(strategy="median"), StandardScaler(), SVC())
print(cross_val_score(temel, X_train, y_train, cv=5, scoring="f1").mean())
print(gs.best_score_)Karşılaştırma eğitim kümesindeki CV ile yapılır; test kümesine hâlâ dokunulmaz.
Uygulama Temel ve arama
Ayarsız temel hattın eğitim kümesinde 5 katlı F1 ortalamasını hesapla. Ardından class_weight="balanced" hattını {"svc__C": [0.1, 1, 10], "svc__gamma": ["scale", 0.1]} ızgarasıyla scoring="f1" kullanarak ara. Temel skoru, best_score_'u (ikisi de round(..., 3)) ve best_params_'ı alt alta yazdır.
Başlangıç kodu
import numpy as np
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
X, y = make_classification(n_samples=600, n_features=8, n_informative=4, weights=[0.8, 0.2], random_state=7)
rng = np.random.default_rng(7)
X[rng.random(X.shape) < 0.05] = np.nan
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=0, stratify=y)
from sklearn.pipeline import make_pipeline
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.model_selection import GridSearchCV, cross_val_score
# buraya yazÖrnek çözüm
import numpy as np
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
X, y = make_classification(n_samples=600, n_features=8, n_informative=4, weights=[0.8, 0.2], random_state=7)
rng = np.random.default_rng(7)
X[rng.random(X.shape) < 0.05] = np.nan
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=0, stratify=y)
from sklearn.pipeline import make_pipeline
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.model_selection import GridSearchCV, cross_val_score
temel = make_pipeline(SimpleImputer(strategy="median"), StandardScaler(), SVC())
print(round(cross_val_score(temel, X_train, y_train, cv=5, scoring="f1").mean(), 3))
pipe = make_pipeline(SimpleImputer(strategy="median"), StandardScaler(), SVC(class_weight="balanced"))
gs = GridSearchCV(pipe, {"svc__C": [0.1, 1, 10], "svc__gamma": ["scale", 0.1]}, cv=5, scoring="f1").fit(X_train, y_train)
print(round(gs.best_score_, 3))
print(gs.best_params_)Beklenen çıktı
0.753
0.772
{'svc__C': 1, 'svc__gamma': 'scale'}
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 <code>class_weight="balanced"</code> %20 azınlık sınıfı için ağırlığı yaklaşık kaç yapar (çoğunluğa göre)?
- Eşit
- 0.25 kat
- 20 kat
- 4 kat Doğru cevap
Açıklama: Ağırlık sınıf oranının tersiyle orantılıdır: 0.8 / 0.2 = 4.
2 Sınıf ağırlıklarını otomatik dengele.
SVC(class_weight=____)
SVC(class_weight="balanced")
Açıklama: "balanced" ağırlıkları n / (k · sınıf_sayımı) ile hesaplar.
3 Hat adımlarını eşleştir.
| Kavram | Anlamı |
|---|---|
SimpleImputer(median) |
Eksikleri doldurur |
StandardScaler |
Ölçekler |
SVC(class_weight) |
Dengeli sınıflandırır |
scoring="f1" |
Seçim ölçütü |