Class weight
- Makine Öğrenmesi kursu
- Orta seviye
- Ders 89/112
- 5 dk
class_weight parametresi, azınlık sınıfına daha fazla ağırlık verir.
class_weight
Veriyi değiştirmek yerine modelin kayıp fonksiyonunda azınlık hatalarına daha büyük ağırlık verilebilir. class_weight="balanced" her sınıfı n / (k · n_sınıf) ile ağırlıklandırır:
m = LogisticRegression(class_weight="balanced").fit(X_train, y_train)
from sklearn.utils.class_weight import compute_class_weight
print(compute_class_weight("balanced", classes=np.array([0, 1]), y=y_train))
# [0.526 10.] azınlık hatası ~19 kat pahalıYeni örnek üretmediği için hızlıdır ve çoğu scikit-learn modelinde (lojistik, SVM, ağaçlar, orman) doğrudan bulunur.
Elle ağırlık
Ağırlık bir sözlükle elle de verilebilir; böylece hataların gerçek iş maliyeti modele yansıtılır. Örneğin bir sahtekârlığı kaçırmak yanlış alarmdan 50 kat pahalıysa:
m = LogisticRegression(class_weight={0: 1, 1: 50})
# ya da fit sırasında örnek ağırlığı:
w = np.where(y_train == 1, 50, 1)
m.fit(X_train, y_train, sample_weight=w)Ağırlık arttıkça duyarlılık artar, kesinlik düşer; en iyi değer doğrulamayla seçilir.
Uygulama Ağırlıklı model
Ağırlıksız ve class_weight="balanced" lojistik regresyon eğit. Her biri için test kesinliğini ve duyarlılığını round(..., 3) ile aynı satırda yazdır (önce ağırlıksız).
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=2000, n_features=10, n_informative=4, weights=[0.95, 0.05], flip_y=0, random_state=1)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0, stratify=y)
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import precision_score, recall_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=2000, n_features=10, n_informative=4, weights=[0.95, 0.05], flip_y=0, random_state=1)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0, stratify=y)
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import precision_score, recall_score
for cw in [None, "balanced"]:
p = LogisticRegression(class_weight=cw).fit(X_train, y_train).predict(X_test)
print(round(precision_score(y_test, p), 3), round(recall_score(y_test, p), 3))Beklenen çıktı
0.5 0.033 0.19 0.9
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 1000 örnekte 900 çoğunluk, 100 azınlık varsa balanced ağırlıklar nedir?
- 1 ve 9
- 0.9 ve 0.1
- 1 ve 1
- 0.556 ve 5.0 Doğru cevap
Açıklama: 1000 / (2 · 900) ≈ 0.556; 1000 / (2 · 100) = 5.
2 Azınlık sınıfına 20 kat ağırlık ver.
m = LogisticRegression(class_weight=____)
m = LogisticRegression(class_weight={0: 1, 1: 20})
Açıklama: Sözlük her sınıfın ağırlığını ayrı verir.
3 Ağırlık biçimlerini eşleştir.
| Kavram | Anlamı |
|---|---|
"balanced" |
n / (k · n_sınıf) |
{0: 1, 1: 50} |
Elle maliyet |
sample_weight |
Örnek başına ağırlık |
compute_class_weight |
Ağırlıkları hesaplar |