Який найкращий показник ефективності, який використовується в балансуванні набору даних за допомогою технології 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перші без балансування набору даних , а другого після використання вражало , щоб збалансувати набір даних.

Фактичні значення: 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

Як ми зазвичай обчислюємо точність?

аcc=cоrrеcтprегicтiонстоталprегicтiонс

Як наші дві моделі працюють на цій метриці?

аcc1=810=80%
аcc2=710=70%

Відповідно до цієї метрики ефективності, m2краще ніж m1. Однак це не обов'язково так, як m1тільки прогнозує клас більшості! Для того, щоб показати, наскільки m2краще, ніж m1нам потрібна метрика, яка розглядає ці два фрази як рівні.

Зараз ми спробуємо обчислити середню макрос точність. Як? Спочатку ми обчислимо точність для кожного класу окремо, а потім будемо їх середнє:

  • Для m1: <- точність класу <- точність на класі
    аcc10=88=100%m10
    аcc11=02=0%m11
    маcrо_аcc1=аcc10+аcc112=100%+0%2=50%

  • Для m2: <- точність класу <- точність на класі
    аcc20=58=62.5%m20
    аcc21=22=100%m21
    маcrо_аcc2=аcc20+аcc212=62.5%+100%2=81,25%

Примітки :

  • Усереднення макросів може застосовуватися до будь-якої метрики, яку ви хочете, однак вона найчастіше зустрічається в матриці матриці плутанини (наприклад, точність, нагадування, f1).

  • Вам не потрібно реалізовувати це самостійно, у багатьох бібліотеках вже є (наприклад, у f1_score sklearn є параметр average, який називається , який можна встановити "macro")


Велике спасибі за ваше чудове пояснення, це чітко лаконічно. Чи можете ви запропонувати деякі наукові статті справжні ??
Равія Саммут

4
Кілька статей з цього питання: 1 , 2 , 3 . Основні огляди цих статей - це методи боротьби з невмінням класів (над / недостатньою вибіркою, вагою класів тощо) та метриками, які можуть бути використані в таких ситуаціях (ROC, g-середня, квадратична каппа тощо)
Djib2011,

Ви можете подивитися на загальний код, я знайшов заплутані результати замість поліпшення продуктивності моделі за допомогою
смот,

3
З того, що я можу сказати, судячи з матриць плутанини, ваша перша модель (без врівноваження) передбачає лише мажоритарний клас, тоді як друга (зі смаком) передбачає інший клас. Я рекомендую, можливо, спробувати інший класифікатор, оскільки для SVM потрібна велика настройка гіперпараметрів (тобто запуск вашої моделі знову і знову для того, щоб визначити найкращі C, гаму, тип ядра тощо).
Djib2011

Спасибі вам за. Я думаю, що змінити класифікатор краще, тому що я використовую параметр настроювання gridsearch і я навчив обидві моделі на найкращих гіперпараметрах, знайдених алгоритмом
gridsearch
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.