Precision / Recall / F1
Метрика Accuracy показывает качество модели в целом: какая доля всех объектов была классифицирована правильно.
Но иногда этого недостаточно. Бывает важно понять, насколько хорошо модель находит один конкретный класс.
Например, в задаче с породами собак нас может интересовать класс спаниель. В нашем наборе данных всего два класса — спаниель и бульдог. Задачу с двумя классами называют бинарной классификацией.
Тогда мы временно считаем:
- спаниель — положительный класс
- бульдог — отрицательный класс (не спаниель)
Положительный класс — это не «хороший» класс и не обязательно класс с меткой 1. Это просто класс, который мы сейчас анализируем. Отрицательный класс — противоположный ему: в бинарной классификации это всегда второй, оставшийся класс.
Именно от слов Positive/Negative («положительный»/«отрицательный») и образованы названия TP, FP, FN, TN, которые мы сейчас разберём.
Что означают TP, FP, FN и TN
Заголовок раздела «Что означают TP, FP, FN и TN»Когда выбран положительный класс, все ответы модели можно разложить на четыре группы.
TP, FP, FN и TN — это четыре величины в матрице ошибок. Каждая величина показывает, сколько объектов попало в один из случаев сравнения реального класса и предсказания модели.
Для класса спаниель матрицу можно записать так:
Предсказано →Реально ↓ спаниель не спаниельспаниель TP FNне спаниель FP TNЗдесь каждая ячейка содержит количество объектов:
TP(True Positive) — сколько настоящих спаниелей модель правильно назвала спаниелями (то есть верно распознала положительный класс);FP(False Positive) — сколько не-спаниелей модель ошибочно назвала спаниелями (неверно распознала положительный класс);FN(False Negative) — сколько настоящих спаниелей модель пропустила и назвала не спаниелями (неверно распознала отрицательный класс);TN(True Negative) — сколько не-спаниелей модель правильно не отнесла к спаниелям (верно распознала отрицательный класс).
В примере со спаниелями выбор положительного класса условный: мы могли бы выбрать и бульдог. Но в некоторых задачах положительный класс выбирают не произвольно, а по смыслу задачи.
Например, в задаче диагностики:
болен — положительный классздоров — отрицательный классВ такой задаче обычно важно найти людей, которым нужно дополнительное обследование. Поэтому положительным классом часто выбирают болен.
Тогда ошибки имеют разный смысл:
FP— здорового человека ошибочно отнесли к больным;FN— больного человека ошибочно отнесли к здоровым.
Положительный класс выбирают не по номеру метки, а по смыслу задачи. Обычно это класс, который нужно обнаружить, найти или проконтролировать.
Метрика Precision
Заголовок раздела «Метрика Precision»Метрика Precision показывает, насколько можно доверять предсказаниям выбранного класса. Если модель сказала спаниель, Precision показывает, как часто это действительно спаниель.
Precision отвечает на вопрос:
Если модель назвала объект спаниелем, как часто она оказывается права?Формула:
Precision = TP / (TP + FP)То есть среди всех объектов, которые модель назвала спаниелями, вычисляется доля настоящих спаниелей.
Высокий Precision означает, что модель редко ошибается, когда предсказывает положительный класс.
Метрика Recall
Заголовок раздела «Метрика Recall»Метрика Recall — доля найденных объектов положительного класса. Она показывает, какую часть всех объектов, действительно относящихся к положительному классу, модель смогла обнаружить.
Recall отвечает на вопрос:
Какую долю настоящих спаниелей модель смогла найти?Формула:
Recall = TP / (TP + FN)То есть среди всех настоящих спаниелей вычисляется доля тех, которых модель правильно распознала.
Высокий Recall означает, что модель редко пропускает объекты положительного класса.
Сравнение Precision и Recall
Заголовок раздела «Сравнение Precision и Recall»Эти метрики оценивают качество предсказаний положительного класса с разных сторон:
| Метрика | Главный вопрос |
|---|---|
Precision | Среди объектов, отнесённых моделью к положительному классу, какая доля действительно к нему относится? |
Recall | Среди всех объектов положительного класса какую долю модель смогла найти? |
В задаче диагностики высокий Precision означает меньше ложноположительных результатов, а высокий Recall — меньше пропущенных случаев заболевания.
Метрика F1
Заголовок раздела «Метрика F1»F1 объединяет Precision и Recall одну метрику.
F1 = 2 * Precision * Recall / (Precision + Recall)Она учитывает и ошибочные предсказания выбранного класса, и пропущенные объекты этого класса. Значение F1 будет высоким только тогда, когда одновременно высоки и Precision, и Recall.
Пример вычисления
Заголовок раздела «Пример вычисления»Возьмём тот же пример с бульдогами и спаниелями. После обучения модели и предсказания на тестовой выборке посчитаем метрики для класса спаниель, а затем разберём результат через матрицу ошибок.
uses MLABC;
begin var df := DataFrame.FromCsvText(''' Вес,ВысотаВХолке,Порода 20,33,бульдог 17,43,спаниель 16,41,спаниель 25,36,бульдог 26,34,бульдог 21,35,бульдог 24,35,бульдог 20,36,бульдог 14,39,спаниель 15,40,спаниель 19,39,бульдог 18,42,спаниель 22,34,бульдог 15,38,спаниель 19,40,спаниель 16,40,спаниель ''');
var X := df.ToMatrix(['Вес', 'ВысотаВХолке']); var target := df.EncodeTarget('Порода'); var y := target.Labels;
var (Xtrain, Xtest, ytrain, ytest) := Validation.TrainTestSplit(X, y, testRatio := 0.25, seed := 42);
var model := new KNNClassifier(3); model.Fit(Xtrain, ytrain);
var ypred := model.Predict(Xtest);
Println('Precision:', Metrics.Precision(ytest, ypred):0:3); Println('Recall:', Metrics.Recall(ytest, ypred):0:3); Println('F1:', Metrics.F1(ytest, ypred):0:3);end.Вывод программы:
Precision: 1.000Recall: 0.500F1: 0.667Для этих значений матрица ошибок относительно положительного класса спаниель выглядит так:
Предсказано →Реально ↓ спаниель не спаниельспаниель 1 1не спаниель 0 2Разберём результат для класса спаниель:
Precision = 1.000: если модель сказаласпаниель, она не ошиблась;Recall = 0.500: модель нашла только половину настоящих спаниелей;F1 = 0.667: итоговая оценка, учитывающая одновременноPrecisionиRecall.
Что выбрать
Заголовок раздела «Что выбрать»| Метрика | Когда особенно полезна |
|---|---|
Accuracy | Важна общая доля правильных ответов |
Precision | Важно сократить число ошибочных предсказаний выбранного класса |
Recall | Важно не пропустить объекты положительного класса |
F1 | Нужен баланс между Precision и Recall |
Precision, Recall и F1 особенно полезны при несбалансированных классах, а также когда ошибочные предсказания и пропуски имеют разную цену.