SMOTE
- Makine Öğrenmesi kursu
- Orta seviye
- Ders 88/112
- 5 dk
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
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
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.
yeni = a + rng.random() * (____)
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 |