В этой статье представлены часто используемые показатели производительности в глубоком и машинном обучении. Использование соответствующих показателей производительности было бы важно для сравнения и определения лучшей модели машинного обучения для любой конкретной проблемы. Чтобы понять популярные метрики — точность, точность, полнота, f1 и т. д., давайте сначала рассмотрим матрицу путаницы.

Матрица путаницы

Матрица путаницы – это таблица, которая часто используется для описания эффективности модели классификации (или "классификатора") на наборе тестовых данных. В матрице путаницы есть четыре элемента: истинно положительный, ложноположительный, ложноотрицательный и истинно отрицательный. Истинный положительный результат — это результат, при котором модель правильно предсказывает положительный класс. Точно так же истинно отрицательный результат — это результат, когда модель правильно предсказывает отрицательный класс. Ложное срабатывание — это результат, когда модель неправильно предсказывает положительный класс. Ложноотрицательный результат — это результат, когда модель неправильно предсказывает отрицательный класс.

Точность, аккуратность

Точность измеряет количество данных, правильно предсказанных моделью (истинно положительное + истинно отрицательное) по отношению к общему количеству данных.

Точность измеряет количество истинно положительных результатов по сумме классов, предсказанных моделью как положительные (истинно положительные + ложноположительные). Его можно рассматривать как вероятность того, что модель правильно предсказала положительное значение, которое на самом деле было положительным.

Вспомнить

Отзыв измеряет количество истинных положительных результатов по сумме положительных классов. Его можно рассматривать как долю положительных классов, которую модель правильно предсказала.

Точность и отзыв не учитывают истинного негатива. Чтобы получить высокую точность, модель должна уменьшить количество ложных срабатываний (т. е. когда модель неправильно предсказывает положительный результат, который на самом деле был отрицательным классом). Хорошим примером приложения, где точность может быть подходящей метрикой, может быть сканер электронной почты для спама. Чтобы получить высокий отзыв, модель должна уменьшить количество ложноотрицательных результатов (т. е. когда модель неправильно предсказывает отрицательное значение, которое на самом деле было положительным). Достижение высокого отзыва будет важно в приложениях, где ложноотрицательное значение должно быть низким, например, при диагностике заболеваний.

Оценка F1

Оценка F1 сочетает в себе точность и полноту и определяется их средним гармоническим значением. Оценка F1 также не учитывает ложноотрицательные результаты и обычно используется при обработке естественного языка, системах поиска информации и т. д.

Теперь давайте рассмотрим дополнительные показатели, такие как ROC и PR, которые являются распространенными способами сравнения моделей, предсказывающих вероятности для задач с двумя классами.

Кривая ROC (рабочая характеристика приемника) представляет соотношение между истинно положительными показателями (ось Y) и ложноположительными показателями (ось X), где истинно положительные показатели = истинно положительные / (истинно положительные + ложноотрицательные ) и ложноположительный результат = ложноположительный / (ложноположительный + истинно отрицательный). Хорошая ROC-кривая будет иметь относительно высокую долю истинных положительных результатов и показывать крутую кривую, где значение по оси X мало.

Кривая PR(Precision and Recall) представляет соотношение между точностью и полнотой, где точность – это ось Y, а полнота – ось X. Следовательно, хорошая кривая PR будет иметь относительно высокую точность и высокую полноту, очерчивая широкую кривую вокруг начала координат.

Давайте сравним два бинарных классификатора, Adaboost и логистическую регрессию, используя набор данных OpenML и кривые ROC/PR для каждого из них.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import AdaBoostClassifier
from sklearn.model_selection import train_test_split
from sklearn import metrics
from sklearn.metrics import roc_curve
from sklearn.metrics import precision_recall_curve
diabets = pd.read_csv("dataset_37_diabetes.csv")
diabets_x = diabets.drop("class", axis=1)
diabets_y = diabets["class"]
diabets_x_train, diabets_x_test, diabets_y_train, diabets_y_test = train_test_split(diabets_x, diabets_y, test_size=0.3, random_state=42)
#train logistic regression classifier
lrmodel = LogisticRegression(max_iter=1000)
lrmodel.fit(diabets_x_train, diabets_y_train)
lr_yhat = lrmodel.predict_proba(diabets_x_test)
#train adaboost classifier
abmodel = AdaBoostClassifier()
abmodel.fit(diabets_x_train, diabets_y_train)
ab_yhat = abmodel.predict_proba(diabets_x_test)
#plot roc curves
lr_pos_probs = lr_yhat[:, 1]
ab_pos_probs = ab_yhat[:, 1]
fpr_lr, tpr_lr, _ = roc_curve(diabets_y_test, lr_pos_probs, pos_label='tested_positive')
plt.plot(fpr_lr, tpr_lr, label='Logistic')
fpr_ab, tpr_ab, _ = roc_curve(diabets_y_test, ab_pos_probs, pos_label='tested_positive')
plt.plot(fpr_ab, tpr_ab, label='Adaboost')
plt.scatter([1], [1], label='all positive classifier', color='red')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.legend()
plt.show()

#plot PR curve
precision_lr, recall_lr, _ = precision_recall_curve(diabets_y_test, lr_pos_probs, pos_label='tested_positive')
plt.plot(recall_lr, precision_lr, label='Logistic')
precision_ab, recall_ab, _ = precision_recall_curve(diabets_y_test, ab_pos_probs, pos_label='tested_positive')
plt.plot(recall_ab, precision_ab, label='Adaboost')
plt.scatter([1., 1.], [precision_lr[0], precision_ab[0]], label='all positive classifier')
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.legend().
plt.show()

PRG(прирост PR)

Недавно была введена новая метрика PRG («кривая усиления PR»). Питер и др. утверждали, что кривая PR Gain обеспечивает лучшее сравнение между различными моделями и позволяет идентифицировать худшие. Чтобы эмпирически проверить это утверждение, давайте сравним AUROC (площадь под ROC), AUPR (площадь под PR) и AUPRG (площадь под PRG) для двух классификаторов.

from prg import prg
from sklearn.metrics import auc
from sklearn.metrics import roc_auc_score
#AUROC
roc_auc_lr = roc_auc_score(diabets_y_test, lr_pos_probs)
roc_auc_ab = roc_auc_score(diabets_y_test, ab_pos_probs)
#AUPR
pr_auc_lr = auc(recall_lr, precision_lr)
pr_auc_ab = auc(recall_ab, precision_ab)
#convert label dtype to int
binarylabel = []
for label in diabets_y_test:
    if label == "tested_positive":
        binarylabel.append(1)
    else:
        binarylabel.append(0)
binarylabel = np.array(binarylabel)
#AUPRG
prg_curve_lr = prg.create_prg_curve(binarylabel, lr_pos_probs)
prg_curve_ab = prg.create_prg_curve(binarylabel, ab_pos_probs)
auprg_lr = prg.calc_auprg(prg_curve_lr)
auprg_ab = prg.calc_auprg(prg_curve_ab)
print("AUROC for logistic regression : " + str(roc_auc_lr))
print("AUROC for adaboost : " + str(roc_auc_ab))
print("AUPR for logistic regression : " + str(pr_auc_lr))
print("AUPR for adaboost : " + str(pr_auc_ab))
print("AUPRG for logistic regression : " + str(auprg_lr))
print("AUPRG for adaboost : " + str(auprg_ab))
AUROC for logistic regression : 0.7963576158940396
AUROC for adaboost : 0.7551738410596026
AUPR for logistic regression : 0.6608411274115765
AUPR for adaboost : 0.633429143930323
AUPRG for logistic regression : 0.7054493093059626
AUPRG for adaboost : 0.6422446878807431

Из оценок AUPR видно, что AUPR отдает предпочтение модели с более низким ожидаемым показателем F1 (Adaboost), чем другая модель (логистическая регрессия). Результат логистической регрессии и Adaboost показал схожую оценку AUPR, и было бы трудно выбрать лучшую модель, сравнивая только оценки AUPR между двумя классификаторами. AUPRG показывает лучшее сравнение между двумя классификаторами, и это подтверждает, что было бы лучше использовать кривые PRG на практике.

Ссылки