SMOTE 기술을 사용하여 데이터 세트를 밸런싱하는 데 사용되는 최상의 성능 지표는 무엇입니까


8

스 모트 기술을 사용하여 데이터 세트를 오버 샘플링했으며 이제 균형 잡힌 데이터 세트가 있습니다. 내가 직면 한 문제는 성능 지표입니다. 불균형 데이터 세트의 정밀도, 리콜, f1 측정, 정확도는 밸런스 데이터 세트보다 더 잘 수행됩니다.

밸런싱 데이터 세트가 모델의 성능을 향상시킬 수 있음을 보여주기 위해 어떤 측정을 사용할 수 있습니까?

주의 : roc_auc_score는 불균형 데이터 셋을 가진 roc_auc_score보다 밸런싱 된 datset에서 더 좋습니다. 우수한 성능 측정으로 간주 될 수 있습니까? 설명 후 코드를 구현 하고이 결과를 얻었습니다.

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

결과 :

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

균형 잡힌 데이터 셋

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

결과 :

(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

효율적인 결과를 찾지 못했습니다. 교차 검증을 사용하여 모델을 구현해야합니까?

답변:


8

우선, 명확하게 말하면 균형 잡힌 데이터 세트에서 모델의 성능을 평가 해서는 안됩니다 . 데이터 셋을 기차와 테스트 세트로 나누는 것이 이상적입니다. 평가는 테스트 세트 에서만 수행해야하며 훈련 세트에서는 균형을 유지해야합니다.

귀하의 질문에 관해서는, 매크로 평균 메트릭 은 균형 조정 기술이 효과적이라는 것을 입증하기 위해 잘 작동해야합니다. 이러한 메트릭을 계산하려면 (간단 성을 위해 정확도를 말하십시오) 각 클래스의 정확도를 개별적 으로 계산 한 다음 평균화 하면됩니다.

:
우리는 두 가지 모델을 훈련 시켰 m1으며 m2, 첫 번째는 데이터 세트를 밸런싱하지 않고, 두 번째는 SMOTE를 사용하여 데이터 세트를 밸런싱했습니다.

실제 값 : 0, 0, 0, 0, 0, 0, 0, 0, 1, 1
Predicted m1: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 <-대다수 클래스 만 예측
Predicted m2:1, 0, 0, 1, 0, 1, 0, 0, 1, 1

일반적으로 정확도는 어떻게 계산합니까?

acc=correctpredictionstotalpredictions

이 측정 항목에서 두 모델이 어떻게 작동합니까?

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

이 성능 지표에 따르면 m2보다 좋습니다 m1. 그러나 m1대다수 클래스를 예측할 때 반드시 그런 것은 아닙니다 ! m2보다 나은 방법을 보여 주려면 m1두 개의 clases를 동일하게 취급하는 메트릭이 필요합니다.

이제 매크로 평균 정확도를 계산하려고합니다. 어떻게? 먼저 각 클래스의 정확도를 개별적으로 계산 한 다음 평균을 계산합니다.

  • 옵션 m1: - < '클래스에서의 정확성 <- '클래스의 정확도
    acc10=88=100%m10
    acc11=02=0%m11
    macro_acc1=acc10+acc112=100%+0%2=50%

  • 옵션 m2: - < '클래스에서의 정확성 <- '클래스의 정확도
    acc20=58=62.5%m20
    acc21=22=100%m21
    macro_acc2=acc20+acc212=62.5%+100%2=81.25%

참고 사항 :

  • 매크로 평균은 원하는 모든 메트릭에 적용 할 수 있지만 혼동 매트릭스 메트릭 (예 : 정밀도, 리콜, f1)에서 가장 일반적입니다.

  • 직접 구현할 필요는 없습니다. 많은 라이브러리에 이미 있습니다 (예 : sklearn의 f1_score 에는이라는 매개 변수 average가 있으며로 설정할 수 있음 "macro").


훌륭한 설명을 주셔서 감사합니다. 간결합니다. 과학 관련 기사를 실제로 제안 해 주시겠습니까?
Rawia Sammout

4
문제에 대한 몇 가지 기사 : 1 , 2 , 3 . 이 글들이 본질적으로 개괄 한 것은 클래스 임 벌레 스 (오버 샘플 / 언더 샘플링, 클래스 웨이트 등)와 이러한 상황에서 사용될 수있는 메트릭 (ROC, g-mean, 2 차 카파 등)과
싸우는 방법

공유 코드를 살펴보면 혼란스런 결과 대신 스
모트를

3
혼동 행렬로 판단 할 수 있듯이 첫 번째 모델 (밸런싱 제외)은 대다수 클래스 만 예측하고 두 번째 모델 (스 모트 포함)은 다른 클래스를 예측합니다. SVM에는 많은 하이퍼 매개 변수 조정이 필요하므로 다른 분류자를 사용해 보는 것이 좋습니다 (예 : 최고의 C, 감마, 커널 유형 등을 파악하기 위해 모델을 반복해서 실행).
Djib2011

감사합니다. 나는 그리드 검색 튜닝 매개 변수를 사용하고 그리드 검색 알고리즘에 의해 발견 된 최고의 하이퍼 파라메터에 대한 두 모델을 훈련했기 때문에 분류자를 변경하는 것이 더 좋다고 생각합니다
Rawia Sammout
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.