Oversampling
- Makine Öğrenmesi kursu
- Orta seviye
- Ders 90/112
- 5 dk
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
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
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.
ek = rng.choice(az, size=n, replace=____)
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 |