"Enter"a basıp içeriğe geçin

Veri Dengeleme

Data Balancing

Sınıflandırma problemlerine ait veri setlerinde hedef değerin (target, label) kategorik dağılımında yüksek oranda dengesizlik olduğunda bazı öğrenme algoritmalarının performansında düşüş gözlenebiliyor. Bu gibi durumlarda ilk tercih olmasa da veri dengeleme yolu tercih edilebilir.

Veri dengelemek için iki temel yoldan söz edilebilinir:,

  • Over Sampling
  • Under Sampling

Düşük oranda bulunan kategoriye ait gözlemlerin özelliklerinden yararlanarak çeşitli yöntemler ile yeni veri üreterek denge sağlama işlemine over sampling denir. Tersi şekilde yüksek oranda bulunan kategoriye ait gözlemlerin dengelemeye yetecek kadar kısmını yine çeşitli algoritmalarla silme işlemine ise under sampling adı verilmektedir. Sentetik veri üretimi içermediğinden yeterli veri setine sahip olduğuna kanaat getirilen durumlarda under sampling tercih etmek özellikle ezberleme’ye (overfitting) engel olmak adına daha sağlıklı bir tercih olacaktır.

Veri dengeleme işlemi başlangıçta da belirtildiği gibi ilk tercih olmamalıdır. Bunun yerine dengesiz dağılmış veri setlerine (imbalanced datasets) daha dayanıklı öğrenme yöntemleri (ensemble yöntemler bu anlamda tercih edilebilmektedir) kullanma yoluna gitmek daha doğru bir tercih olabilmektedir.

Diğer yandan dengeleme yöntemleri uygulanacaksa test ve doğrulama (validation) setlerinin dengeleme işlemi öncesinde ayrıştırılması gerekmektedir.

Sağlıklı bir dengeleme (data balance) yapmak üzere farklı oranlarda dengeleme yapılarak denemek de sayılabilecek diğer önemli bir noktadır.

Python ile bir uygulama yapmak üzere dengesiz dağılmış bir veri seti üretelim:

from sklearn.datasets import make_classification
import matplotlib.pyplot as plt
import pandas as pd
%matplotlib inline
import warnings
warnings.filterwarnings('ignore')

dataset = make_classification(n_samples = 1000, n_classes = 2, 
                              n_clusters_per_class = 2, n_features = 2, 
                              n_informative = 2, n_redundant = 0, 
                              n_repeated = 0, weights = [0.9,0.1], 
                              class_sep = 1.5, random_state=6)

features = pd.DataFrame(dataset[0], columns = ['feature1','feature2'])
labels = pd.DataFrame(dataset[1], columns = ['label'])

fig, ax = plt.subplots(nrows = 1, ncols = 1, figsize=(10, 5))
ax.scatter(features['feature1'], features['feature2'], c = labels['label'])
ax.set_xlabel('feature1')
ax.set_ylabel('feature2')
ax.set_title('2 class with imbalanced samples');
plt.show()
scatter plot

Veri setine ait etiketlerin dağılımını görmek için:

plt.bar([0,1],labels.label.value_counts(), tick_label = [0,1])
dengesiz dağılım histogramı

Over Sampling

Over sampling uygulamak üzere çeşitli algoritmalar sunan imblearn.over_sampling kütüphanesinden faydalanabiliriz ancak öncelikle eğitim ve test set ayrıştırması yapmak gerektiğinden söz etmiştik:

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(features, labels, test_size=0.2, shuffle=False)

Ayrıştırma adımından sonra eğitim setine SMOTE ile over sampling uygulanabilir. SMOTE dışında da bir çok yöntem olduğunu belirtmek gerekir.

from imblearn.over_sampling import SMOTE
import numpy as np

smt = SMOTE()
X_train, y_train = smt.fit_sample(X_train, y_train)
y_train = y_train.astype(int)

Over sampling sonrası scatter plot aşağıdaki şekilde oluşur. Görüleceği üzere algoritma veri dağılımında önemli bir değişiklik yaratmamıştır.

Veri setlerinde uygulanan over sampling ya da under sampling algoritmalarının her bir öz nitelik için veri nitelikleri kontrol edilerek kullanılan over sampling metodunun veriye uygun olup olmadığı kontrol edilmelidir. pandas.DataFrame.desc() metodu ile bu kontrol hızlıca sağlanabilir.

fig, ax = plt.subplots(nrows = 1, ncols = 1, figsize=(10, 5))
ax.scatter(X_train['feature1'], X_train['feature2'], c = y_train['label'])
ax.set_xlabel('feature1')
ax.set_ylabel('feature2')
ax.set_title('2 class with balanced samples');
plt.show()
over sampling sonrası scatter plot
plt.bar([0,1],y_train.label.value_counts(), tick_label = [0,1])
over sampling sonrası histogram

Görüldüğü üzere eğitim setindeki veri dağılımı dengelenmiş durumda.

Under Sampling

Over Sampling yönteminin aksine yüksek oranda bulunan hedef değere ait gözlemleri (satırları) silme işlemine ise under sampling denir. Under sampling uygularken de yine her bir nitelik için standart sapma, varyans, mean gibi değerlerde önemli bir değişim yaratmayan yöntemler kullanmak gerekmektedir.

Başlangıçtaki örneğe dönmek üzere aşağıdaki kod parçasını tekrar çalıştıralım:

X_train, X_test, y_train, y_test = train_test_split(features, labels, test_size=0.2, shuffle=False)

Under sampling yine imblearn ile basitçe aşağıdaki şekilde uygulanabilir:

from imblearn.under_sampling import NearMiss

nm = NearMiss()
X_train, y_train = nm.fit_sample(X_train, y_train)
y_train = y_train.astype(int)

Under sampling sonrası scatter plot aşağıdaki şekilde. Görüleceği üzere bu defa mor noktaların sayısı ilk duruma göre azalmış durumda.

under sampling sonrası scatter plot
plt.bar([0,1],y_train.label.value_counts(), tick_label = [0,1])
under sampling sonrası histogram

Veri dengeleme ile farklı oranlar ile dengeleme yapılabilmektedir. Varsayılan olarak eşit oranda dengeleme stratejileri uygulanırken oranlar değiştirilerek dengeleme yumuşatılabilir. Eşit oranda dengelemeler model performansına olumsuz etki ederse dengeleme yumuşatmak iyi bir seçenek olabilir.

Github repo’suna erişmek için tıklayın.

Keyifli öğrenmeler 🙂

İlk Yorumu Siz Yapın

Bir Cevap Yazın

Translate »
%d blogcu bunu beğendi: