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()

Veri setine ait etiketlerin dağılımını görmek için:
plt.bar([0,1],labels.label.value_counts(), tick_label = [0,1])

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()

plt.bar([0,1],y_train.label.value_counts(), tick_label = [0,1])

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.

plt.bar([0,1],y_train.label.value_counts(), tick_label = [0,1])

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