CodeBlanks Logo Icon CodeBlanks

Oversampling

Oversampling, azınlık sınıfının örneklerini çoğaltır.

Oversampling ve undersampling

İki temel yeniden örnekleme yönü vardır:

  • Oversampling: azınlığı çoğaltır (rastgele kopyalama ya da SMOTE). Bilgi kaybı yoktur ama aşırı öğrenme riski artar.
  • Undersampling: çoğunluğu azaltır. Hızlıdır ama çoğunluğun bilgisinin bir kısmı atılır.
az = np.where(y_train == 1)[0]
cok = np.where(y_train == 0)[0]
# oversampling: azınlıktan yerine koyarak çek
ek = rng.choice(az, size=len(cok) - len(az), replace=True)
# undersampling: çoğunluktan azınlık kadar çek
sec = rng.choice(cok, size=len(az), replace=False)

Karşılaştırma CV içinde

Hangi stratejinin daha iyi olduğu veriye göre değişir; adil karşılaştırma için örnekleme her katmanın eğitim kısmında yapılmalı, doğrulama kısmına dokunulmamalıdır. Ölçüt olarak F1 ya da ortalama kesinlik (average_precision) kullanılır:

for egitim, dogrulama in StratifiedKFold(5).split(X, y):
    Xr, yr = yeniden_ornekle(X[egitim], y[egitim])
    m.fit(Xr, yr)
    skor.append(f1_score(y[dogrulama], m.predict(X[dogrulama])))

Çoğu durumda sınıf ağırlığı ve eşik ayarı, örneklemeden daha basit ve yeterince iyidir.

Uygulama Undersampling

Çoğunluk sınıfından azınlık sayısı kadar örneği yerine koymadan rastgele seç ve azınlıkla birleştir. Dengelenmiş eğitim kümesinin sınıf dağılımını, ardından bu kümeyle eğitilmiş lojistik regresyonun test duyarlılığını round(..., 3) ile 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 recall_score

rng = np.random.default_rng(0)

# 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 recall_score

rng = np.random.default_rng(0)

az = np.where(y_train == 1)[0]
cok = np.where(y_train == 0)[0]
sec = np.concatenate([az, rng.choice(cok, size=len(az), replace=False)])
print(np.bincount(y_train[sec]))
m = LogisticRegression().fit(X_train[sec], y_train[sec])
print(round(recall_score(y_test, m.predict(X_test)), 3))

Beklenen çıktı

[70 70]
0.9

Soru ve cevaplar

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

1 Rastgele oversampling'in ana riski nedir?

  • Daha az veri
  • Risk yoktur
  • Aynı azınlık örneklerini ezberlemek Doğru cevap
  • Bilgi kaybı

Açıklama: Kopyalanan noktalar model için aynı bilgiyi tekrar tekrar sunar.

2 Azınlıktan yerine koyarak örnek çek.

Soru
ek = rng.choice(az, size=n, replace=____)
Cevap
ek = rng.choice(az, size=n, replace=True)

Açıklama: replace=True aynı indeksin birden çok kez seçilmesine izin verir.

3 Stratejileri eşleştir.

Kavram Anlamı
oversampling Azınlığı çoğalt
undersampling Çoğunluğu azalt
SMOTE Yapay ara örnekler
class_weight Veriyi değiştirmeden

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