อะไรคือตัวชี้วัดประสิทธิภาพที่ดีที่สุดที่ใช้ในการสร้างสมดุลของชุดข้อมูลโดยใช้เทคนิค SMOTE


8

ฉันใช้เทคนิค smote เพื่อสุ่มตัวอย่างชุดข้อมูลของฉันและตอนนี้ฉันมีชุดข้อมูลที่สมดุล ปัญหาที่ฉันเผชิญคือการวัดประสิทธิภาพ ความแม่นยำ, การเรียกคืน, การวัด f1, ความแม่นยำในชุดข้อมูลที่ไม่สมดุลนั้นทำได้ดีกว่าชุดข้อมูลที่มีความสมดุล

ฉันสามารถใช้การวัดใดเพื่อแสดงว่าชุดข้อมูลที่สมดุลอาจปรับปรุงประสิทธิภาพของโมเดลได้หรือไม่

หมายเหตุ: 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แรกโดยไม่ปรับสมดุลชุดข้อมูลและชุดที่สองหลังจากใช้ SMOTE เพื่อปรับสมดุลชุดข้อมูล

ค่าจริง: 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

ปกติแล้วเราจะคำนวณความแม่นยำอย่างไร

a=โอRRอีเสื้อพีRอีdผมเสื้อผมโอnsเสื้อโอเสื้อaล.พีRอีdผมเสื้อผมโอns

รุ่นสองรุ่นของเราทำงานอย่างไรกับตัวชี้วัดนี้

a1=810=80%
a2=710=70%

ตามตัวชี้วัดประสิทธิภาพการทำงานนี้จะดีกว่าm2 m1อย่างไรก็ตามนี่ไม่จำเป็นต้องเป็นกรณีที่เป็นm1เพียงการทำนายคนส่วนใหญ่! เพื่อแสดงให้เห็นว่าm2ดีกว่าm1เราต้องใช้เมตริกที่ปฏิบัติต่อทั้งสองส่วนอย่างเท่าเทียมกัน

ตอนนี้เราจะพยายามคำนวณความแม่นยำโดยเฉลี่ยของมาโคร อย่างไร? ก่อนอื่นเราจะคำนวณความแม่นยำสำหรับแต่ละชั้นแยกจากนั้นเราจะทำการเฉลี่ย:

  • m1
    a10=88=100%m10
    a11=02=0%m11
    ม.aRโอ_a1=a10+a112=100%+0%2=50%

  • m2
    a20=58=62.5%m20
    a21=22=100%m21
    ม.aRโอ_a2=a20+a212=62.5%+100%2=81.25%

หมายเหตุ :

  • การหาค่าเฉลี่ยของแมโครสามารถนำไปใช้กับการวัดใด ๆ ที่คุณต้องการอย่างไรก็ตามมันเป็นเรื่องธรรมดาที่สุดในเมตริกซ์ความสับสน (เช่นความแม่นยำการเรียกคืน f1)

  • คุณไม่จำเป็นต้องดำเนินการนี้ด้วยตัวเองห้องสมุดหลายแห่งมีอยู่แล้ว (เช่น f1_score ของsklearnมีพารามิเตอร์ที่เรียกว่าaverageซึ่งสามารถตั้งค่าเป็น"macro")


ขอบคุณมากสำหรับคำอธิบายที่ดีของคุณมันชัดเจนกระชับ
Rawia Sammout

4
ไม่กี่บทความเกี่ยวกับเรื่องนี้: 1 , 2 , 3 ภาพรวมของบทความเหล่านี้คือวิธีการในการต่อสู้กับความไม่สมดุลของคลาส (over / under-sampling, weights class, ฯลฯ ) และตัวชี้วัดที่สามารถใช้ในสถานการณ์เหล่านี้ (ROC, g-mean, kappa กำลังสอง ฯลฯ )
Djib2011

คุณช่วยดูรหัสที่ใช้ร่วมกันฉันพบผลลัพธ์ที่สับสนแทนการปรับปรุงประสิทธิภาพของแบบจำลองโดยใช้
smote

3
จากสิ่งที่ฉันสามารถบอกได้ว่าการตัดสินโดยเมทริกซ์ความสับสนโมเดลแรกของคุณ (ไม่สมดุล) ทำนายเฉพาะคนส่วนใหญ่ในขณะที่แบบที่สอง (มีสมาร์ท) ทำนายชั้นอื่น ฉันอยากจะแนะนำให้ลองใช้ตัวจําแนกอื่นเนื่องจาก SVM ต้องการการปรับแต่งพารามิเตอร์มากเกินไป (เช่นการเรียกใช้แบบจำลองของคุณอีกครั้งและอีกครั้งเพื่อที่จะหา C, แกมมา, ประเภทเคอร์เนลที่ดีที่สุด)
Djib2011

ขอบคุณสำหรับคุณ. ฉันคิดว่าการเปลี่ยนลักษณนามดีกว่าเพราะฉันใช้พารามิเตอร์การปรับค่าการค้นหากริดและฉันได้ทำการฝึกอบรมทั้งสองแบบเกี่ยวกับพารามิเตอร์ที่ดีที่สุดที่พบโดยอัลกอริทึมการ
ค้นหากริด
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.