CodeBlanks Logo Icon CodeBlanks

SMOTE

SMOTE, azınlık sınıfı için sentetik örnekler üretir.

SMOTE

SMOTE (Synthetic Minority Over-sampling Technique), azınlık örnekleri arasında yapay yeni örnekler üretir: bir azınlık örneği ile rastgele seçilmiş azınlık komşusu arasındaki doğru üzerinde bir nokta alınır.

# imbalanced-learn kitaplığı
from imblearn.over_sampling import SMOTE
X_yeni, y_yeni = SMOTE(random_state=0).fit_resample(X_train, y_train)
# elle mantık:
yeni = a + rng.random() * (komsu - a)

Basit kopyalamadan farkı, modelin aynı noktaları ezberlemesi yerine azınlık bölgesini daha geniş görmesidir.

Yalnızca eğitim verisine

Yeniden örnekleme yalnızca eğitim verisine uygulanır. Test verisinde yapay örnek olursa ölçülen başarı gerçeği yansıtmaz; CV'de de her katmanın içinde yapılmalıdır. imbalanced-learn bunun için kendi Pipeline'ını sunar:

from imblearn.pipeline import make_pipeline as imb_pipeline
pipe = imb_pipeline(StandardScaler(), SMOTE(random_state=0), LogisticRegression())
cross_val_score(pipe, X, y, cv=5, scoring="f1")

scikit-learn'ün kendi Pipeline'ı fit_resample adımlarını desteklemez.

Uygulama Elle SMOTE

Eğitim kümesindeki azınlık örneklerinden (X_train[y_train == 1]) çoğunlukla eşit sayıya ulaşacak kadar yapay örnek üret: her yeni örnek için rastgele bir azınlık örneği ve en yakın 5 azınlık komşusundan biri seçilsin. Yeni eğitim kümesinin sınıf dağılımını np.bincount 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.neighbors import NearestNeighbors

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.neighbors import NearestNeighbors

rng = np.random.default_rng(0)

az = X_train[y_train == 1]
gerek = (y_train == 0).sum() - len(az)
_, komsu = NearestNeighbors(n_neighbors=6).fit(az).kneighbors(az)
yeni = []
for _ in range(gerek):
    i = rng.integers(len(az))
    j = komsu[i, rng.integers(1, 6)]
    yeni.append(az[i] + rng.random() * (az[j] - az[i]))
X_yeni = np.vstack([X_train, yeni])
y_yeni = np.concatenate([y_train, np.ones(gerek, dtype=int)])
print(np.bincount(y_yeni))

Beklenen çıktı

[1330 1330]

Soru ve cevaplar

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

1 SMOTE yeni örneği nereye koyar?

  • İki azınlık örneği arasındaki doğru üzerine Doğru cevap
  • Rastgele bir yere
  • Çoğunluk sınıfının merkezine
  • Mevcut örneğin üstüne

Açıklama: Ara noktalar azınlık bölgesinin içini doldurur.

2 Azınlık örneği ile komşusu arasında bir nokta üret.

Soru
yeni = a + rng.random() * (____)
Cevap
yeni = a + rng.random() * (komsu - a)

Açıklama: Rastgele bir oranla a'dan komşuya doğru ilerlenir.

3 Kavramları eşleştir.

Kavram Anlamı
SMOTE Yapay azınlık örnekleri
fit_resample Yeniden örnekleme
imblearn Pipeline CV içinde örnekleme
test verisi Asla örneklenmez

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