CodeBlanks Logo Icon CodeBlanks

Dengesiz veri nedir?

Dengesiz veri, sınıfların eşit olmayan sayıda örneğe sahip olduğu veridir.

Dengesiz veri nedir?

Sınıflardan biri diğerlerinden çok daha az örneğe sahipse veri dengesizdir: sahte işlemler (%0.1), nadir hastalıklar (%1), makine arızaları. Model çoğunluk sınıfını tahmin ederek yüksek doğruluk alır ama asıl aranan azınlığı kaçırır.

print(np.bincount(y))            # [1900  100]
print(np.bincount(y) / len(y))   # [0.95 0.05]

Dengesizlik bir hata değil, problemin doğasıdır; çözüm doğru metrik ve doğru eğitim stratejisidir.

Dengesizliğin etkisi

Çoğu model toplam hatayı küçültmeye çalıştığından azınlığın hatalarını önemsemez. Sonuç: azınlık sınıfının duyarlılığı düşer, karar sınırı azınlığın içine kayar.

m = LogisticRegression().fit(X_train, y_train)
p = m.predict(X_test)
print(accuracy_score(y_test, p))   # yüksek
print(recall_score(y_test, p))     # azınlık: düşük

Bu grupta çözüm yollarını göreceksin: yeniden örnekleme, sınıf ağırlıkları, eşik ayarı ve doğru metrik.

Uygulama Sorunu gör

Sınıf dağılımını yazdır. LogisticRegression() eğit; test doğruluğunu ve azınlık duyarlılığını round(..., 3) ile aynı satırda yazdır.

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 accuracy_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 accuracy_score, recall_score

print(np.bincount(y))
m = LogisticRegression().fit(X_train, y_train)
p = m.predict(X_test)
print(round(accuracy_score(y_test, p), 3), round(recall_score(y_test, p), 3))

Beklenen çıktı

[1900  100]
0.95 0.033

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 %5 azınlıklı veride her şeye "çoğunluk" diyen modelin doğruluğu kaçtır?

  • 0
  • 0.95 Doğru cevap
  • 0.05
  • 0.5

Açıklama: Doğruluk yüksek görünür ama azınlık duyarlılığı 0'dır.

2 Sınıf oranlarını hesapla.

Soru
print(np.bincount(y) / ____)
Cevap
print(np.bincount(y) / len(y))

Açıklama: Sayımlar örnek sayısına bölünerek oranlar elde edilir.

3 Örnekleri eşleştir.

Kavram Anlamı
sahtekârlık Çok nadir azınlık
çoğunluk tahmini Yüksek doğruluk, sıfır duyarlılık
stratify Oranı korur
duyarlılık Azınlığı yakalama

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