Veri setindeki sınıf dengesizliğini azaltmak için alt örnekleme (under-sampling) yöntemi uygulanarak model eğitimi dengeli hale getirilebilmektedir.
Bu ifadeyi en net şekilde Python’da alt örnekleme (under-sampling) ile göstermek için genellikle imbalanced-learn kütüphanesindeki RandomUnderSampler kullanılır.
Aşağıdaki örnek, sınıf dengesiz bir veri setini dengeleyip modeli eğitime hazır hale getirir:
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report
from imblearn.under_sampling import RandomUnderSampler
# X: özellikler, y: sınıf etiketleri (0 = sağlıklı, 1 = hasta gibi)
# 1. Veriyi train-test olarak ayır
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42, stratify=y
)
# 2. Alt örnekleme (under-sampling) uygula
rus = RandomUnderSampler(random_state=42)
X_train_resampled, y_train_resampled = rus.fit_resample(X_train, y_train)
# 3. Modeli dengelenmiş veri ile eğit
model = RandomForestClassifier(random_state=42)
model.fit(X_train_resampled, y_train_resampled)
# 4. Test et
y_pred = model.predict(X_test)
print(classification_report(y_test, y_pred))
Bu kod ne yapıyor?
- Orijinal veri: Dengesiz (örneğin 90% sınıf 0, 10% sınıf 1)
- RandomUnderSampler: Çoğunluk sınıfından rastgele örnekleri azaltır ve Azınlık sınıfına eşitler
- Sonuç: Model “çoğunluğu ezberlemek” yerine daha dengeli öğrenir
tezlerde genelde SMOTE (oversampling) versiyonu ile birlikte karşılaştırılır.
SMOTE (Synthetic Minority Over-sampling Technique)
SMOTE (Synthetic Minority Over-sampling Technique) kullanarak azınlık sınıfı "gerçek gibi yeni örneklerle" büyütüyoruz. Yani veri setine rastgele kopya eklemek yerine, aradaki boşluklardan sentetik veri üretir.
Aşağıdaki kod, under-sampling örneğinin SMOTE karşılığıdır:
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report
from imblearn.over_sampling import SMOTE
# X: özellikler, y: sınıf etiketleri
# 1. Train-test split
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42, stratify=y
)
# 2. SMOTE ile oversampling (azınlık sınıfı artırılır)
smote = SMOTE(random_state=42)
X_train_resampled, y_train_resampled = smote.fit_resample(X_train, y_train)
# 3. Model eğitimi (dengelenmiş veri ile)
model = RandomForestClassifier(random_state=42)
model.fit(X_train_resampled, y_train_resampled)
# 4. Tahmin ve değerlendirme
y_pred = model.predict(X_test)
print(classification_report(y_test, y_pred))
SMOTE burada ne yapıyor?
- Azınlık sınıfındaki örnekleri kopyalamaz
- Onların komşu örneklerine bakarak yeni sentetik noktalar üretir
- Böylece veri “yapay ama gerçekçi” şekilde dengelenir
Under-sampling vs SMOTE (kısa fark)
- Under-sampling → çoğunluğu azaltır (veri kaybı var)
- SMOTE → azınlığı artırır (veri kaybı yok, ama sentetik veri var)

