SMOTE tekniğini kullanarak veri kümesini dengelemede kullanılan en iyi performans metriği nedir?


8

Veri setimi fazla örneklemek için smote tekniği kullandım ve şimdi dengeli bir veri setim var. Karşılaştığım sorun performans metrikleri; dengesiz veri kümesinde hassasiyet, hatırlama, f1 ölçümü, doğruluk, dengeli veri kümesinden daha iyi performans gösterir.

Dengeleme veri kümesinin modelin performansını artırabileceğini göstermek için hangi ölçümü kullanabilirim?

Not: Dengeli veri kümesinde, dengesiz veri kümesiyle roc_auc_score'dan daha iyi: roc_auc_score iyi bir performans ölçümü olarak kabul edilebilir mi? açıklama sonra kodu uyguladı ve bu sonuçları aldım

import pandas as pd
import numpy as np
from sklearn import preprocessing
import matplotlib.pyplot as plt 
plt.rc("font", size=14)
from sklearn.svm import LinearSVC
from sklearn.svm import SVC
from sklearn.cross_validation import train_test_split,StratifiedShuffleSplit,cross_val_score
import seaborn as sns
from scipy import interp
from time import *
from sklearn import metrics
X=dataCAD.iloc[:,0:71]
y= dataCAD['Cardio1']
# Split the dataset in two equal parts
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.3, random_state=0)
print(y_test.value_counts())
model=SVC(C=0.001, kernel="rbf",gamma=0.01, probability=True)
t0 = time()
clf = model.fit(X_train,y_train)
y_pred = clf.predict(X_test)
t = time() - t0
print("=" * 52)
print("time cost: {}".format(t))
print()
print("confusion matrix\n", metrics.confusion_matrix( y_test, y_pred))
cf=metrics.confusion_matrix(y_test, y_pred)
accuracy=(cf.item((0,0))/50)+(cf.item((1,1))/14)
print("model accuracy \n",accuracy/2)
print()
print("\t\tprecision_score: {}".format(metrics.precision_score( y_test, y_pred, average='macro')))
print()
print("\t\trecall_score: {}".format(metrics.recall_score(y_test, y_pred, average='macro')))
print()
print("\t\tf1_score: {}".format(metrics.f1_score(y_test, y_pred, average='macro')))
print()
print("\t\troc_auc_score: {}".format(metrics.roc_auc_score( y_test, y_pred, average='macro')))

Sonuçlar:

Name: Cardio1, dtype: int64
====================================================
time cost: 0.012008905410766602

confusion matrix
 [[50  0]
 [14  0]]
model accuracy 
 0.5

        precision_score: 0.390625

        recall_score: 0.5

        f1_score: 0.43859649122807015

        roc_auc_score: 0.5

Dengeli veri kümesi için

X_train1,y_train1 = sm.fit_sample(X_train, y_train.ravel())
df= pd.DataFrame({'Cardio1': y_train1})
df.groupby('Cardio1').Cardio1.count().plot.bar(ylim=0)
plt.show()
print(X_train1.shape)
print(y_train1.shape)
#model=SVC(C=0.001, kernel="rbf",gamma=0.01, probability=True)
model=SVC(C=10, kernel="sigmoid",gamma=0.001, probability=True)
t0 = time()
clf = model.fit(X_train1,y_train1)
y_pred = clf.predict(X_test)
t = time() - t0
print("=" * 52)
print("time cost: {}".format(t))
print()
print("confusion matrix\n", metrics.confusion_matrix(y_test, y_pred))
cf=metrics.confusion_matrix(y_test, y_pred)
accuracy=(cf.item((0,0))/50)+(cf.item((1,1))/14)
print("model accuracy \n",accuracy/2)
print()
#print("\t\taccuracy: {}".format(metrics.accuracy_score( y_test, y_pred)))
print()
print("\t\tprecision_score: {}".format(metrics.precision_score( y_test, y_pred, average='macro')))
print()
print("\t\trecall_score: {}".format(metrics.recall_score(y_test, y_pred, average='macro')))
print()
print("\t\tf1_score: {}".format(metrics.f1_score(y_test, y_pred, average='macro')))
print()
print("\t\troc_auc_score: {}".format(metrics.roc_auc_score( y_test, y_pred, average='macro')))

Sonuçlar:

(246, 71)
(246,)
====================================================
time cost: 0.05353999137878418

confusion matrix
 [[ 0 50]
 [ 0 14]]
model accuracy 
 0.5


        precision_score: 0.109375

        recall_score: 0.5

        f1_score: 0.1794871794871795

        roc_auc_score: 0.5

Etkili bir sonuç bulamadım. Modeli çapraz doğrulama kullanarak mı uygulamalıyım?

Yanıtlar:


8

Her şeyden önce, net olmak gerekirse , modellerinizin dengeli veri setindeki performansını değerlendirmemelisiniz. Yapmanız gereken, veri kümenizi bir trene ve ideal olarak aynı dengesizlik derecesine sahip bir test setine bölmektir. Değerlendirme sadece test setinde yapılırken, eğitim setinde dengeleme yapılmalıdır .

Sorunuza gelince, makro ortalamalı herhangi bir metrik , dengeleme tekniğinizin etkili olduğunu kanıtlamak için gayet iyi olmalıdır. Böyle bir metriği hesaplamak için (basitlik için doğruluk diyelim), sadece her sınıfın doğruluklarını ayrı ayrı hesaplamanız ve sonra bunları ortalamanız gerekir.

Örnek :
İki model m1ve m2birincisi veri kümesini dengelemeden, ikincisi SMOTE'yi kullanarak veri kümesini dengelemek için eğittik.

Gerçek değerler: 0, 0, 0, 0, 0, 0, 0, 0, 1, 1
Öngörülen m1: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 <- yalnızca çoğunluk sınıfını
tahmin eder Öngörülen m2:1, 0, 0, 1, 0, 1, 0, 0, 1, 1

Normalde doğruluğu nasıl hesaplayabiliriz?

acc=correctpredictionstotalpredictions

İki modelimiz bu metrikte nasıl bir performans sergiliyor?

acc1=810=80%
acc2=710=70%

Bu performans ölçüsüne göre m2, daha iyidir m1. Ancak, m1çoğunluk sınıfını öngördüğü gibi, bu her zaman böyle değildir ! Nasıl m2daha iyi olduğunu göstermek m1için, iki sınıfı eşit olarak değerlendiren bir metriğe ihtiyacımız var.

Şimdi makro ortalamalı bir doğruluk hesaplamaya çalışacağız. Nasıl? İlk önce her bir sınıfın doğruluğunu ayrı ayrı hesaplayacağız ve sonra bunları ortalayacağız:

  • Çünkü m1: <- 'nin sınıftaki doğruluğu <- ' nin sınıftaki doğruluğu
    acc10=88=100%m10
    acc11=02=0%m11
    macro_acc1=acc10+acc112=100%+0%2=50%

  • Çünkü m2: <- 'nin sınıftaki doğruluğu <- ' nin sınıftaki doğruluğu
    acc20=58=62.5%m20
    acc21=22=100%m21
    macro_acc2=acc20+acc212=62.5%+100%2=81.25%

Notlar :

  • Makro ortalaması istediğiniz herhangi bir metriğe uygulanabilir, ancak en çok karışıklık matrisi metriklerinde (örn. Kesinlik, hatırlama, f1) yaygındır.

  • Tek başına bu uygulamaya gerek yoktur, birçok kütüphane zaten o (örn sklearn en f1_score adında bir parametresi vardır averageayarlanabilir, "macro")


Büyük açıklama için çok teşekkürler açık özlü Gerçek bazı bilimsel makaleler önerebilir misiniz?
Rawia Sammout

4
Konuyla ilgili birkaç makale: 1 , 2 , 3 . Bu makalelerin esasen gözden geçirilmesi, sınıf dengesizliği ile mücadele yöntemleri (aşırı / düşük örnekleme, sınıf ağırlıkları, vb.) Ve bu durumlarda kullanılabilecek ölçümler (ROC, g-mean, kuadratik kappa, vb.)
Cib2011

Paylaşılan koda bir göz atabilir miyim kafa karıştırıcı kullanarak model performansını iyileştirmek yerine kafa karıştırıcı sonuçlar buldum kontrast
Rawia Sammout

3
Karışıklık matrislerine göre değerlendirebileceğim kadarıyla, ilk modeliniz (dengeleme olmadan) sadece çoğunluk sınıfını, ikincisi (smote ile) diğer sınıfı öngörür. SVM'ler çok fazla hiper parametre ayarlaması gerektirdiğinden (başka bir sınıflandırıcıyı denemenizi tavsiye ederim) (en iyi C, gama, çekirdek türü vb.
Djib2011

senin için teşekkürler. Ben gridsearch ayarlama parametresini kullanmak ve ben gridsearch algoritması tarafından bulunan en iyi hiperparametreler üzerinde her iki modeli eğitti çünkü ben sınıflandırıcı değiştirmek daha iyi olduğunu düşünüyorum
Rawia Sammout
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.