Makine Öğrenmesi
Class weight
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).
Örnek çözümü göster
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))
Kendini test et
-
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
Cevabı göster
0.556 ve 5.0 — 1000 / (2 · 900) ≈ 0.556; 1000 / (2 · 100) = 5.
-
Azınlık sınıfına 20 kat ağırlık ver.
m = LogisticRegression(class_weight=____)
Cevabı göster
m = LogisticRegression(class_weight={0: 1, 1: 20})
-
Ağırlık biçimlerini eşleştir.
- "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
Sıradaki ders: Oversampling