SMOTE तकनीक का उपयोग करके डेटासेट को संतुलित करने में उपयोग किया जाने वाला सबसे अच्छा प्रदर्शन मीट्रिक क्या है


8

मैंने अपने डेटासेट का निरीक्षण करने के लिए smote तकनीक का उपयोग किया और अब मेरे पास एक संतुलित डेटासेट है। मेरे सामने समस्या यह है कि प्रदर्शन मेट्रिक्स; सटीक, याद, एफ 1 माप, असंतुलित डेटासेट में सटीकता संतुलित डेटासेट की तुलना में बेहतर प्रदर्शन किया जाता है।

माप को दिखाने के लिए मैं किस मापक का उपयोग कर सकता हूं कि मॉडल के प्रदर्शन में सुधार हो सकता है?

नायब: roc_auc_score संतुलित डेटासेट में roc_auc_score से बेहतर है असंतुलित डेटासेट के साथ इसे एक अच्छा प्रदर्शन माप माना जा सकता है? स्पष्टीकरण के बाद मैंने कोड लागू किया और मुझे यह परिणाम मिला

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डाटासेट और डाटासेट संतुलन के लिए पीट-पीटकर उपयोग करने के बाद दूसरे नंबर पर संतुलन के बिना पहले।

वास्तविक मूल्य: 0, 0, 0, 0, 0, 0, 0, 0, 1, 1
अनुमानितm1 : 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 <- केवल बहुसंख्यक वर्ग
भविष्यवाणी करता है m2:1, 0, 0, 1, 0, 1, 0, 0, 1, 1

हम आम तौर पर सटीकता की गणना कैसे करेंगे?

सीसी=सीआरआरसीटीपीआरमैंसीटीमैंnरोंटीटीएलपीआरमैंसीटीमैंnरों

इस मीट्रिक पर हमारे दो मॉडल कैसे प्रदर्शन करते हैं?

सीसी1=810=80%
सीसी2=710=70%

इस प्रदर्शन के अनुसार मीट्रिक, m2से बेहतर है m1। हालांकि, यह जरूरी नहीं है कि मामला m1बहुसंख्यक वर्ग की भविष्यवाणी करता है! यह दिखाने के लिए कि किस तरह m2से बेहतर है m1, हमें एक मीट्रिक की आवश्यकता है जो दो clases को समान मानती है।

अब हम एक मैक्रो-औसत सटीकता की गणना करने का प्रयास करेंगे। कैसे? पहले हम प्रत्येक वर्ग के लिए अलग-अलग सटीकता की गणना करेंगे, और फिर हम उन्हें औसत करेंगे:

  • m1
    सीसी10=88=100%m10
    सीसी11=02=0%m11
    सीआर_सीसी1=सीसी10+सीसी112=100%+0%2=50%

  • m2
    सीसी20=58=62.5%m20
    सीसी21=22=100%m21
    सीआर_सीसी2=सीसी20+सीसी212=62.5%+100%2=81.25%

टिप्पणियाँ :

  • मैक्रो औसत आप चाहते हैं किसी भी मीट्रिक के लिए लागू किया जा सकता है, हालांकि यह भ्रम मैट्रिक्स मैट्रिक्स (जैसे सटीक, याद, f1) में सबसे आम है।

  • आपको इसे स्वयं लागू करने की आवश्यकता नहीं है, कई पुस्तकालयों में पहले से ही है (जैसे कि स्केलेर के f1_score के पास एक पैरामीटर है average, जिसे सेट किया जा सकता है "macro")


आपके महान स्पष्टीकरण के लिए बहुत बहुत धन्यवाद यह स्पष्ट है कि क्या आप कुछ वैज्ञानिक लेखों को वास्तविक बनाने का प्रस्ताव कर सकते हैं ??
राविया सैममुट

4
इस मामले पर कुछ लेख: 1 , 2 , 3 । इन लेखों का अनिवार्य रूप से अवलोकन कक्षा के असंतुलन (ओवर / अंडर-सैंपलिंग, क्लास वेट आदि) और मेट्रिक्स का मुकाबला करने के तरीके हैं जो इन स्थितियों में उपयोग किए जा सकते हैं (ROC, g-mean, quadratic kappa, आदि)
Dj22011

क्या आप साझा किए गए कोड पर एक नज़र डाल सकते हैं, मुझे एक भ्रामक परिणाम मिला जिसके बजाय smote का उपयोग करके मॉडल के प्रदर्शन में सुधार हुआ, मुझे इसके विपरीत मिला
Rawia Sammout

3
भ्रम की स्थिति से मैं क्या बता सकता हूं, आपका पहला मॉडल (बिना संतुलन के) केवल बहुसंख्यक वर्ग की भविष्यवाणी करता है, जबकि दूसरा (smote के साथ) दूसरे वर्ग की भविष्यवाणी करता है। मैं शायद एक और क्लासिफायर की कोशिश करने की सलाह दूंगा, क्योंकि एसवीएम को हाइपर-पैरामीटर ट्यूनिंग (यानी अपने मॉडल को बार-बार चलाने के लिए सबसे अच्छा सी, गामा, कर्नेल प्रकार, आदि) का पता लगाने की आवश्यकता होती है।
जिब २०११

आप के लिए धन्यवाद। मुझे लगता है कि क्लासिफायर को बदलना बेहतर है क्योंकि मैं ग्रिडसर्च ट्यूनिंग पैरामीटर का उपयोग करता हूं और मैंने ग्रिड मॉडल एल्गोरिथ्म द्वारा पाए जाने वाले सर्वश्रेष्ठ हाइपरपैरामीटर पर दोनों मॉडल को प्रशिक्षित किया
राविया सेमाउट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.