Makine Öğrenmesi
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.
Ö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.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))
Kendini test et
-
SMOTE yeni örneği nereye koyar?
- İki azınlık örneği arasındaki doğru üzerine
- Rastgele bir yere
- Çoğunluk sınıfının merkezine
- Mevcut örneğin üstüne
Cevabı göster
İki azınlık örneği arasındaki doğru üzerine — Ara noktalar azınlık bölgesinin içini doldurur.
-
Azınlık örneği ile komşusu arasında bir nokta üret.
yeni = a + rng.random() * (____)
Cevabı göster
yeni = a + rng.random() * (komsu - a)
-
Kavramları eşleştir.
- SMOTE
- Yapay azınlık örnekleri
- fit_resample
- Yeniden örnekleme
- imblearn Pipeline
- CV içinde örnekleme
- test verisi
- Asla örneklenmez
Sıradaki ders: Class weight