Метрики классификации: accuracy, precision, recall, F1 и ROC-AUC

Одна доля правильных ответов редко описывает классификатор полностью. Accuracy, precision, recall, F1 и ROC-AUC по-разному учитывают ошибки и пороги. Чтобы выбрать метрику, сначала определяют положительный класс и последствия ложного срабатывания и пропуска.

Матрица ошибок как основа

Для бинарной задачи прогнозы образуют четыре группы:

РезультатЧто произошло
TPположительный объект найден
FPотрицательный объект ошибочно отмечен
FNположительный объект пропущен
TNотрицательный объект правильно отклонён

Слова «положительный» и «отрицательный» не означают хороший и плохой. Положительным называют класс, обнаружение которого анализируется, например дефект или нужное письмо.

Accuracy

Accuracy — доля всех правильных прогнозов. Она понятна при сопоставимых классах и примерно одинаковой цене ошибок. Если дефекты составляют 1%, правило «дефектов нет» получает 99% accuracy, хотя не находит ни одного важного случая.

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

Precision и recall

Precision отвечает: «Какая доля отмеченных моделью положительных объектов действительно положительна?» Высокая precision важна, когда ложная тревога дорога.

Recall отвечает: «Какую долю всех настоящих положительных объектов модель нашла?» Высокая полнота нужна, когда пропуск опасен. Снижение порога обычно повышает recall, но может уменьшить precision.

F1 — гармоническое среднее precision и recall. Оно становится высоким, только если обе величины достаточно велики, однако скрывает выбранный компромисс и не учитывает TN напрямую.

ROC-AUC и пороги

ROC-кривая рассматривает пары true positive rate и false positive rate при разных порогах. Площадь ROC-AUC измеряет способность ранжировать случайный положительный объект выше случайного отрицательного. Она не выбирает рабочий порог и может выглядеть оптимистично при сильном дисбалансе.

Для редкого положительного класса дополнительно полезна precision-recall кривая: она показывает именно качество положительных решений при изменении порога.

Расчёт в коде

import numpy as np

from sklearn.metrics import (
    accuracy_score,
    confusion_matrix,
    f1_score,
    precision_score,
    recall_score,
    roc_auc_score,
)

y_test = np.array([0, 0, 1, 1, 1, 0, 1, 0])
probabilities = np.array([0.10, 0.45, 0.80, 0.34, 0.75, 0.20, 0.60, 0.55])
predictions = probabilities >= 0.35

print('accuracy', accuracy_score(y_test, predictions))
print('precision', precision_score(y_test, predictions))
print('recall', recall_score(y_test, predictions))
print('f1', f1_score(y_test, predictions))
print('roc_auc', roc_auc_score(y_test, probabilities))
print(confusion_matrix(y_test, predictions))

ROC-AUC получает непрерывные оценки, а пороговые метрики — готовые классы. Перед вычислением проверьте, какой класс закодирован единицей.

Практика: выберите метрику по последствиям

Рассмотрите фильтр спама, поиск опасного дефекта и отбор ста заявок для ручной проверки. Для каждого случая назовите более дорогую ошибку, основную метрику и возможное ограничение второй метрики. Затем объясните, почему одинаковый F1 не гарантирует одинакового пользовательского результата.

Что важно запомнить

Источники