Số liệu hiệu suất tốt nhất được sử dụng trong dữ liệu cân bằng sử dụng kỹ thuật SMOTE là gì


8

Tôi đã sử dụng kỹ thuật smote để ghi đè lên tập dữ liệu của mình và bây giờ tôi có một tập dữ liệu cân bằng. Vấn đề tôi gặp phải là các số liệu hiệu suất; độ chính xác, thu hồi, số đo F1, độ chính xác trong tập dữ liệu không cân bằng được thực hiện tốt hơn so với tập dữ liệu cân bằng.

Phép đo nào tôi có thể sử dụng để chỉ ra rằng tập dữ liệu cân bằng có thể cải thiện hiệu suất của mô hình?

NB: roc_auc_score tốt hơn trong datset cân bằng so với roc_auc_score với bộ dữ liệu không cân bằng Nó có thể được coi là một phép đo hiệu suất tốt? Sau khi giải thích tôi đã triển khai mã và tôi đã nhận được kết quả này

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

Các kết quả:

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

Đối với tập dữ liệu cân bằng

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

Các kết quả:

(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

Tôi không tìm thấy kết quả hiệu quả. Tôi có nên thực hiện mô hình bằng cách sử dụng xác nhận chéo?

Câu trả lời:


8

Trước hết, để rõ ràng, bạn không nên đánh giá hiệu suất của các mô hình của mình trên tập dữ liệu cân bằng. Những gì bạn nên làm là chia dữ liệu của bạn thành một đoàn tàu và một bộ kiểm tra với mức độ mất cân bằng lý tưởng. Việc đánh giá nên được thực hiện riêng trên bộ kiểm tra, trong khi cân bằng trên tập huấn luyện.

Đối với câu hỏi của bạn, bất kỳ số liệu trung bình vĩ mô nào cũng nên làm tốt để chứng minh rằng kỹ thuật cân bằng của bạn có hiệu quả. Để tính toán một thước đo như vậy (giả sử chính xác cho đơn giản), bạn chỉ cần để tính toán độ chính xác của từng loại riêng biệt và sau đó trung bình họ.

Ví dụ :
Chúng tôi đã đào tạo hai mô hình m1m2, mô hình đầu tiên mà không cân bằng tập dữ liệu và mô hình thứ hai sau khi sử dụng SMOTE để cân bằng tập dữ liệu.

Giá trị thực tế: 0, 0, 0, 0, 0, 0, 0, 0, 1, 1
Dự đoán m1: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 <- chỉ dự đoán lớp đa số
Dự đoán m2:1, 0, 0, 1, 0, 1, 0, 0, 1, 1

Làm thế nào chúng ta thường tính toán chính xác?

mộtcc= =correctpredTôictTôionStotmộttôipredTôictTôionS

Làm thế nào để hai mô hình của chúng tôi thực hiện trên số liệu này?

mộtcc1= =số 810= =80%
mộtcc2= =710= =70%

Theo số liệu hiệu suất này, m2là tốt hơn m1. Tuy nhiên, điều này không nhất thiết là trường hợp như m1chỉ dự đoán lớp đa số! Để hiển thị cách m2tốt hơn m1, chúng tôi cần một số liệu coi hai phân số là bằng nhau.

Bây giờ chúng ta sẽ thử tính độ chính xác trung bình vĩ mô. Làm sao? Trước tiên, chúng tôi sẽ tính toán độ chính xác cho từng lớp một cách riêng biệt và sau đó chúng tôi sẽ tính trung bình cho chúng:

  • m1
    mộtcc10= =số 8số 8= =100%m10
    mộtcc11= =02= =0%m11
    mmộtcro_mộtcc1= =mộtcc10+mộtcc112= =100%+0%2= =50%

  • m2
    mộtcc20= =5số 8= =62,5%m20
    mộtcc21= =22= =100%m21
    mmộtcro_mộtcc2= =mộtcc20+mộtcc212= =62,5%+100%2= =81,25%

Ghi chú :

  • Tính trung bình vĩ mô có thể được áp dụng cho bất kỳ số liệu nào bạn muốn, tuy nhiên, phổ biến nhất trong các số liệu ma trận nhầm lẫn (ví dụ: độ chính xác, thu hồi, F1).

  • Bạn không cần phải tự mình thực hiện điều này, nhiều thư viện đã có nó (ví dụ: F1_score của sklearn có một tham số được gọi average, có thể được đặt thành "macro")


Cảm ơn rất nhiều vì lời giải thích tuyệt vời của bạn. Nó rõ ràng súc tích. Bạn có thể đề xuất một số bài báo khoa học thực sự không ??
Rawia Sammout

4
Một vài bài viết về vấn đề này: 1 , 2 , 3 . Những gì các bài viết này về cơ bản là các phương pháp để chống lại sự mất cân bằng của lớp (lấy mẫu trên / dưới, trọng số lớp, v.v.) và các số liệu có thể được sử dụng trong các tình huống này (ROC, g-mean, quadratic kappa, v.v.)
Djib2011

bạn có thể xem mã được chia sẻ không, tôi thấy kết quả khó hiểu thay vì cải thiện hiệu suất của mô hình bằng smote tôi có sự tương phản
Rawia Sammout

3
Từ những gì tôi có thể nói đánh giá bằng các ma trận nhầm lẫn, mô hình đầu tiên của bạn (không cân bằng) chỉ dự đoán lớp đa số, trong khi mô hình thứ hai (với smote) dự đoán lớp khác. Tôi khuyên bạn nên thử một trình phân loại khác, vì các SVM yêu cầu rất nhiều điều chỉnh siêu tham số (nghĩa là chạy mô hình của bạn nhiều lần để tìm ra C, gamma, loại nhân tốt nhất, v.v.).
Djib2011

cảm ơn bạn Tôi nghĩ rằng việc thay đổi trình phân loại là tốt hơn bởi vì tôi sử dụng tham số điều chỉnh gridsearch và tôi đã đào tạo cả hai mô hình trên các siêu đường kính tốt nhất được tìm thấy bởi thuật toán gridsearch
Rawia Sammout
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.