Dengesiz Veri Setinde Oversampling Yöntemleri

Tugrulyilmaz
4 min readJul 28, 2021

Dengesiz veriseti sınıflandırılacak sınıflardan birinin diğerine oranla yetersiz olması durumunda model performasını doğrudan etkileyen problemlerden birisidir.

Bu çalışmada dengesiz veri setinde oversampling yöntemlerini ve etkileri gözlemlenecektir.
Çalışmanın özeti şöyledir:

  • 1-Veri Setinin Yüklenmesi
  • 2-EDA
  • 3-Feature Engineering
  • 4-Model ve Skorlama
  • 5-OverSampling Yöntemleri
  • * 5.1. Random OverSampling
  • * 5.2. SMOTE OverSampling
  • * 5.3. Borderline SMOTE
  • * 5.4. Bordelerline-SMOTE SVM
  • *5.5. Adaptive Synthetic Sampling (ADASYN)

1-Veri Setinin Yüklenmesi

# Veri seti yükleniyor

df=pd.read_csv("/kaggle/input/pima-indians-diabetes-database/diabetes.csv")

2-EDA

Veri seti ABD’deki Arizona Eyaleti’nin en büyük 5. şehri olan Phoenix şehrinde yaşayan 21 yaş ve üzerinde olan Pima Indian kadınları üzerinde yapılan diyabet araştırması için kullanılan verileri içeriyor.

Veri setinde 768 örnek 8 değişken vardır.Bu değişkenler:

  • Pregnancies — Hamilelik sayısı
  • Glucose — Glikoz değeri
  • Blood Pressure — Kan Basıncı (Küçük tansiyon) (mm Hg)
  • SkinThickness — Cilt Kalınlığı
  • Insulin — 2 saatlik serum insülini (mu U/ml)
  • DiabetesPedigreeFunction -
  • Age — Yaş (yıl)
  • Outcome: Hastalığa sahip (1) ya da değil (0)
#0 sınıfına ait 500 örnek var iken 1 sınıfına ait 268 örnek var.
#Bu dengesiz dağılımı gidermek için kullanılan yöntemlerden bazıları üzerinde duracağız
df["Outcome"].value_counts()
#Veri setinin genel özellikleri
#kategorik verilerin ve nümerik verilerin değişkenlere atanması

cat_cols,num_cols=control_df(df,18)

3-Feature Engineering

Diyabet hastalığı hakkında ufak bir literatür çalışması ya da değişkenlere istatiksel bir bakış açısıyla yaklaşılarak feature engineering kısmı çok daha zenginleştirilebilir.Ancak bu çalışmada asıl amaç bu olmadığı için üzerinde fazla durmayacağım. Sadece önemli olduğunu düşündüğüm bir kaç küçük değişken eklemesi yapacağım.

# Insülin değeri yetersiz mi? 
# BMI değeri yüksek mi?

df["Is_Insufficent_Insulin"] = ["1" if val <126 else "0" for val in df["Insulin"]]

df["Is_BMI_Over"] = ["1" if val >30 else "0" for val in df["BMI"]]

Ardından Scaling ve Encoding işlemlerini yapacağım.

#Scaling
for col in num_cols:
ss = df[col].values.reshape(-1,1)
transformer= MinMaxScaler().fit(ss)
df[col] = transformer.transform(ss)
#Encoding
df["Pregnancies"] = df["Pregnancies"].astype("O")
df.info()
df = pd.get_dummies(df,drop_first=True)

4-Model ve Skorlama

Dengesiz veri seti ile çalışırken en önemli karar noktalarından birisi skorlamak için seçtiğimiz metriktir. Bu yüzden Accuracy,Recall,Precision,F1 Score,Auc skorlarını kendi önem sıranıza göre değerlendirmelisiniz.

y=df["Outcome"]
x=df.drop(["Outcome"],axis=1)

x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.2,random_state=42)
log_model = LogisticRegression().fit(x_train, y_train)
scores=scoring(log_model,x_train,y_train,x_test,y_test)
pca_plot(x_train,y_train

5-OverSampling Yöntemleri

Dengesiz veri setiyle başa çıkmada en yaygın kullanılan yöntemlerden birisidir. Azınlık olan sınıfa yeni örnekler ekleyerek dengeli bir dağılım oluşturmayı hedefler. Bu çalışmada farklı varyasyonlarını inceleyip PCA ile 2 boyuta indirgeyip görselleştirmesini gösterilecek.

5.1.Random Oversampling

  • Azınlık sınıfından rastgele örneklerin verisetine yeniden eklenmesi ile oluşur.
  • Rastgele örnekler kopyalanarak elde edildiğinden duplicate örnekler oluşur.
  • Büyük oranlarda yapılması gerekirse veriler tekrar edeceğinden dolayı genellemeyi ortadan kalıdırıp,ezbere yol açabilir.
oversample=RandomOverSampler(sampling_strategy="minority")
x_randomover,y_randomover = oversample.fit_resample(x_train,y_train)
y_randomover.value_counts()
log_model.fit(x_randomover,y_randomover)
random_scores=scoring(log_model,x_randomover,y_randomover,x_test,y_test)
pca_plot(x_randomover,y_randomover)

5.2.SMOTE Oversampling

  • Veri setinden rastgele örneklerin kopyalanması yerine o örneklere benzer sentetik örnekler üretilmesini amaçlar.
  • Veri setinden rastgele olarak bir örnek seçilir.Daha sonra bu örneğin en yakın komşularından k tanesi (default=5) belirlenir.
  • Bu komşular arasından bir tanesi rastgele seçilir ve bu iki örnek arasından rasgtele olarak seçilen bir noktada sentetik örnek oluşturulur
oversample=SMOTE()
x_smote,y_smote = oversample.fit_resample(x_train,y_train)
y_smote.value_counts()
log_model.fit(x_smote,y_smote)
smote_scores=scoring(log_model,x_smote,y_smote,x_test,y_test)
pca_plot(x_smote,y_smote)

5.3.BorderlineSMOTE

  • Klasik SMOTE yaklaşımındaki rastgele örnekler üretmek yerine iki sınıf arasındaki karar sınırına yakın yerlerde örnekler üretir
oversample = BorderlineSMOTE()
x_border,y_border = oversample.fit_resample(x_train,y_train)
y_border.value_counts()
log_model.fit(x_border,y_border)
border_scores = scoring(log_model,x_border,y_border,x_test,y_test)
pca_plot(x_border,y_border)

5.4.Borderline-SMOTE SVM

  • Borderline SMOTE yaklaşımından farkı karar sınırını belirlerken KNN yerine SVM algoritmasını kullanmasıdır
  • Buna ek olarak azınlık sınıfının örneklerinin az olduğu bölgelerden örnek üretmeye çalışır
oversample=BorderlineSMOTE()
x_svm,y_svm = oversample.fit_resample(x_train,y_train)
y_svm.value_counts()
log_model.fit(x_svm,y_svm)
svm_scores = scoring(log_model,x_svm,y_svm,x_test,y_test)
pca_plot(x_svm,y_svm)

5.5 Adaptive Synthetic Sampling (ADASYN)

  • Temel olarak sınıfların örnek yoğunluğuna göre bölgesel olarak örnek üretmeye çalışır.
oversample=ADASYN()
x_ada,y_ada = oversample.fit_resample(x_train,y_train)
y_ada.value_counts()
log_model.fit(x_ada,y_ada)
ada_scores = scoring(log_model,x_ada,y_ada,x_test,y_test)
pca_plot(x_ada,y_ada)

Kaynakça:

https://machinelearningmastery.com/smote-oversampling-for-imbalanced-classification/

--

--