CodeBlanks Logo Icon CodeBlanks

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).

Başlangıç kodu

model.py
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

model.py
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.

Soru
m = LogisticRegression(class_weight=____)
Cevap
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

Orta seviye bölümündeki tüm dersler