Makine Öğrenmesi
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.
Ö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.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))
Kendini test et
-
Rastgele oversampling'in ana riski nedir?
- Daha az veri
- Risk yoktur
- Aynı azınlık örneklerini ezberlemek
- Bilgi kaybı
Cevabı göster
Aynı azınlık örneklerini ezberlemek — Kopyalanan noktalar model için aynı bilgiyi tekrar tekrar sunar.
-
Azınlıktan yerine koyarak örnek çek.
ek = rng.choice(az, size=n, replace=____)
Cevabı göster
ek = rng.choice(az, size=n, replace=True)
-
Stratejileri eşleştir.
- oversampling
- Azınlığı çoğalt
- undersampling
- Çoğunluğu azalt
- SMOTE
- Yapay ara örnekler
- class_weight
- Veriyi değiştirmeden
Sıradaki ders: Metrik seçimi