Gökçen Cangüven
6 min readSep 20, 2019

DENGESİZ VERİ KÜMELERİ İLE MAKİNE ÖĞRENMESİ

Bir veri kümesi üzerinde çalışıyorsunuz ve geliştirdiğiniz sınıflandırıcı %90-%99 doğruluk (accuracy) / çapraz doğrulama (cross-validation) oranı veriyor. Her şeyin yolunda olduğunu düşünürken, hata matrisini (confusion matrix) daha detaylı incelediğinizde, yüksek çıkan doğruluk oranın büyük bir kısmının sadece bir sınıftan kaynaklandığını fark ediyorsunuz. Yani çıkan sonuçlar güvenilir olmaktan uzak!

Makine öğrenmesiyle çalışmaya yeni başlayanların karşılaştığı bu duruma, dengesiz veri kümeleriyle (imbalanced datasets) çalışırken dikkat edilmesi gereken noktalara ve algoritmaların performansını arttırmak için neler yapılabileceği konularına daha detaylı değinelim.

Dengesiz Veri Kümesi Nedir?

Sınıflandırma yaparken, sınıfların eşit dağılmadığı, yani her sınıf için yaklaşık olarak aynı sayıda verinin olmadığı veri kümesidir. Mesela, ikili sınıflandırma (binary classification) durumunda, 500 verinin olduğu bir veri kümesindeki 40 verinin azınlık sınıfa (Sınıf-1), 460 verinin ise diğer sınıfa (Sınıf-0) ait olması durumudur.

import pandas as pd#y-hedef değişken(target variable)dict_values=dict(pd.Series(y).value_counts())
print("Sınıf-0 :",dict_values[0])
print("Sınıf-1 :",dict_values[1])
Çıktı :Sınıf-0 : 460
Sınıf-1 : 40

Dengesiz veri kümeleriyle karşılaştığımız durumlarda birçok makine öğrenmesi algoritması, sınıflardaki eşit olmayan dağılımı dikkate almayarak güvenilir sonuçlar vermeyebiliyor. Yani elde edilen sınıflandırıcılar (classifiers), genel hata oranını minimize etmeye çalışırken ağırlıklı olan sınıfı (Sınıf-0) kategorize ederek, azınlık sınıfını (Sınıf-1) göz ardı edebiliyor. Örneğin kredi kartlarıyla yapılan ödemelerdeki dolandırıcılık vakalarını, network saldırılarını belirlemede ve az rastlanır hastalıkların teşhis edilmesinde, algoritmaların tahmin gücü azalıyor. Bu durumlarda asıl hedef genellikle azınlık olan sınıfı (Sınıf-1) doğru sınıflandırabilmek olduğu için, dengesiz veri kümeleriyle çalışırken dikkat etmemiz gereken noktalar önem kazanıyor.

  1. DOĞRU METRİK SEÇİMİ

Öncelikle, birçok sınıflandırmada kullanılan ve eğitilen algoritmaların performansını ölçmek için kullanılan doğruluk (accuracy), dengesiz veri kümesiyle çalışılan durumlarda, model performansını ölçmek için güvenilir bir metrik değil!!

Doğruluk Formülü
Hata Matrisi
from sklearn.model_selection import train_test_split
import sklearn.linear_model as skl_lm
from sklearn.metrics import confusion_matrix, accuracy_score
X_train, X_test, y_train, y_test = train_test_split(X,y, test_size=0.3, random_state=1, stratify=y)classifier=skl_lm.LogisticRegression()
classifier.fit(X_train,y_train)
y_pred=classifier.predict(X_test)
accuracy=accuracy_score(y_test,y_pred)print("Doğruluk : ", accuracy)print("Hata Matrisi : ","\n",confusion_matrix(y_test,y_pred))Çıktı:Doğruluk : 0.92
Hata Matrisi :
[[137 1]
[ 11 1]]

Yukarıdaki çıktıyı incelediğimiz zaman, oluşturduğumuz modelde doğruluk oranının %92 çıkmasına karşılık, test veri kümesindeki azınlık sınıfa (Sınıf-1) ait 12 veriden sadece 1 tanesini doğru sınıflandırdığını gözlemleyebilirsiniz. Yani, elde edilen (yanlı) model TP oranını arttırıp, doğruluk oranınında artmasına sebep olduğundan, “doğruluk” oranını modelin performansını ölçmek için uygun metrik olarak almamız yanlış olacaktır. Sınıflandırmada asıl hedefimiz, sınıfları ayırıcı gücü fazla olan sınıflandırıcılar elde etmeye çalışmaktır. Dolayısıyla oluşturduğumuz modelin performansını ölçmek için ;

*Duyarlılık (Precision)

Duyarlılık Formülü

*Hassasiyet (Recall)

Hassasiyet Formülü

*f1 ölçümü (f1-score) — duyarlılık ve hassasiyetin harmonik ortalaması

f1 ölçümü

*ROC Eğrisi (ROC Curve)

*Duyarlılık-Hassasiyet Eğrisi (Precision-Recall Curve)

*Hata Matrisi (Confusion Matrix)

metriklerini baz almak daha doğru olacaktır.

2)KATMANLAMA (STRATIFICATION)

Dengesiz veri kümelerini, eğitim veri kümesi (training dataset) ve test veri kümesi (test dataset) olarak ikiye ayırırken, verilerin dengesizlik oranında, eğitim ve test kümelerine eşit dağılması gerekir. Yani her iki kümede sınıfların oranının aynı olması, modelin performansının istikrarlı (consistency) olması açısından önemli.

Dolayısıyla, veri kümesini eğitim ve test veri kümelerine ayırırken, train_test_split() fonksiyonundaki “stratify” parametresiyle, çapraz doğrulama skorunu (cross-validation score) hesaplarken ve hiper parametreleri (hyper-parameters) GridSearchCV veya RandomizedSearchCV ile belirlerken katmanlama durumu dikkate almamız gerekir.

#Eğitim ve test veri kümelerini ayırırken ;from sklearn.model_selection import train_test_splitX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0,stratify=y) #y-hedef değişken
....
-----------
#Çapraz-doğrulama skorunu hesaplarken ;
from sklearn.model_selection import StratifiedKFold, cross_val_scoreskf = StratifiedKFold(n_splits=10)
score = cross_val_score(classifier, X, y, cv=cv=skf.split(X,y))
....
-----------
#RandomizedSearchCV /GridSearchCV uygularken ;
cv = StratifiedShuffleSplit(n_splits=5, random_state=1)classifier = RandomizedSearchCV(classifier,parameter=parameters,
cv=cv)
....

3) YENİDEN ÖRNEKLEME (RESAMPLING)

Yeniden örnekleme yaparak, dengesiz veri kümelerini daha dengeli hale getirebiliriz. Bunu yapmak için ilk yöntem azınlık sınıfına (Sınıf-1) ait verileri çeşitli yöntemlerle arttırarak eşit sayıda veriye sahip sınıflar elde etmek (oversampling). Mesela, Naive rastgele yeniden örnekleme yöntemiyle (Naive Random Over-Sampling) azınlık sınıfa ait var olan veriyi rastgele seçip yerine koymak (replacement) suretiyle kopyalayarak dengeyi sağlamak. Ayrıca SMOTE (Synthetic Minority Oversampling Technique) ve ADASYN (Adaptive Synthetic Sampling Method) algoritmalarında interpolasyon yöntemiyle sentetik veriler üreterek denge sağlanabilir.

Diğer yöntem ise ağırlıklı sınıfa (Sınıf-0) ait verileri veri kümesinden çıkararak dengeli bir veri kümesi elde etmek (undersampling). Random undersampling, ClusterCentroids ve NearMiss teknikleri veri kümesini dengeye getirmek için kullanılabilir. Eğer çalıştığınız veri kümesi yeterince büyük değilse bu yöntem, bilgi kaybına sebep olacağından diğer yöntemler tercih edilmelidir.

Bunlarla birlikte oversampling ve undersampling kombinasyonu olan SMOTEENN ve SMOTETomek teknikleriyle de denge sağlanabilir.

Burada dikkat edilmesi gereken nokta,yukarıda bahsettiğim yöntemleri makine öğrenmesi agoritmalarını eğitmeden önce eğitim verisini (training data) dengelemek için uygulamak. Yani, modelin performansını test etmek için kullandığımız test verisinin (test data) orijinal dataya ait olması önemli.

from sklearn.model_selection import train_test_split
from imblearn.over_sampling import SMOTE
x_train, x_test, y_train, y_test = train_test_split(X, y,test_size = 0.2, random_state=1)smote_over_sampling = SMOTE(random_state=1)
x_train_resampled, y_train_resampled = smote_over_sampling.fit_sample(x_train, y_train)
classifier.fit(x_train_resampled, y_train_resampled)
classifier.predict(x_test)
...

4) SINIF AĞIRLIKLARINI AYARLAMAK (ADJUSTING CLASS WEIGHTS)

Daha önce makine öğrenmesi algoritmalarını eğitmek için scikit-learn gibi kütüphaleri kullandıysanız, birçok sınıflandırıcının (Lojistik regresyon, SVM, random forest vs.) “class_weight” parametresi olduğunu görmüşsünüzdür. Eğer elinizde dengesiz bir veri kümesi varsa, “class_weight” parametresi yardımıyla azınlık sınıfına atanan ağırlığı dengesizlik oranında arttırarak, algoritmanın azınlık verisini yanlış sınıflandırmasından kaynaklanan hata oranını arttırabilirsiniz. Dolayısıyla, modeli oluştururken genel hata oranını (overall error rate) azaltmaya çalışan algoritma bu dengesizliği, yani azınlık sınıfı dikkate alacak ve performansı artacaktır.

import sklearn.linear_model as skl_lm
from sklearn.utils import class_weight
class_weights = class_weight.compute_class_weight("balanced",
np.unique(y), y) #y-hedef değişken
#"class_weights" objesi veri kümesindeki sınıfların dengesizlik oranında ağırlık ataması yapıyor.classifier=skl_lm.LogisticRegression(class_weight=class_weights)#veya ağırlıkları kendimiz belirlemek istersek;classifier= skl_lm.LogisticRegression(class_weight={1:10, 0:1})

5) PENALIZED MODELLER

Penalized Sınıflandırma yöntemleri (penalized-SVM and penalized-LDA, logistik regresyon vs.) modele, algoritmaları eğitirken, yanlış sınıflandırılan azınlık sınıfı verileri için fazladan cost yüklediği için, modelin azınlık sınıfına verdiği ağırlığı arttırıyor.

6) ANOMALİ TESPİTİ (ANOMALY DETECTION)

Anomali tespiti, az rastlanır durumların tespiti demektir. Dengesiz veri kümelerinin olduğu durumlarda azınlık sınıfı verilerini, anomali sınıfına aitmiş gibi düşünerek, anomali tespiti yaparak sınıfları ayırabiliriz. Burada yapılan, anomalileri yani azınlık sınıf verilerini belirlemeye çalışmaktır. Makine öğrenmesi temelli anomali tepsit yöntemleri:

*DBSCAN (Density-based Spatial Clustering)

*Kümeleme tabanlı algoritmalar (Clustering-Based Anomaly Detection)

*Isolation Forest Anomali Tespit Algoritması

*Local Outlier Factor Algoritması

*Destekçi Vektör Makinesi Anomali Tespit Algoritması (Support Vector Machine Anomaly Detection Algorithm)

Son olarak belirtmek isterim ki; makine öğrenmesi algoritmalarını eğitirken farklı yöntemler uygulayarak yüksek çapraz doğrulama oranıyla birlikte, güvenilir, stabil sonuçlar elde etmek önemli. Hangi algoritmanın daha iyi performans göstereceğini deneme yapmadan, algoritmaları eğitmeden önceden görmek mümkün değil. Ayrıca, algortimalarla çalışırken, özellik çıkarımı (feature extraction), özellik seçimi (feature selection), veriyi dönüştürme (data transformation) vs. gibi modelin performansını etkileyecek diğer hususları da göz önünde bulundurmak gerekir.

“If you torture the data long enough, it will confess.” -Ronald H. Coase

Faydalı olması dileğiyle…

Referanslar

-https://imbalanced-learn.readthedocs.io/en/stable/under_sampling.html

-https://imbalanced-learn.readthedocs.io/en/stable/over_sampling.html