Перейти к содержимому

Precision / Recall / F1

Метрика Accuracy показывает качество модели в целом: какая доля всех объектов была классифицирована правильно.

Но иногда этого недостаточно. Бывает важно понять, насколько хорошо модель находит один конкретный класс.

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

Тогда мы временно считаем:

  • спаниель — положительный класс
  • бульдог — отрицательный класс (не спаниель)

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

Именно от слов Positive/Negative («положительный»/«отрицательный») и образованы названия 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 = TP / (TP + FP)

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

Высокий Precision означает, что модель редко ошибается, когда предсказывает положительный класс.

Метрика Recall — доля найденных объектов положительного класса. Она показывает, какую часть всех объектов, действительно относящихся к положительному классу, модель смогла обнаружить.

Recall отвечает на вопрос:

Какую долю настоящих спаниелей модель смогла найти?

Формула:

Recall = TP / (TP + FN)

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

Высокий Recall означает, что модель редко пропускает объекты положительного класса.

Эти метрики оценивают качество предсказаний положительного класса с разных сторон:

МетрикаГлавный вопрос
PrecisionСреди объектов, отнесённых моделью к положительному классу, какая доля действительно к нему относится?
RecallСреди всех объектов положительного класса какую долю модель смогла найти?

В задаче диагностики высокий Precision означает меньше ложноположительных результатов, а высокий Recall — меньше пропущенных случаев заболевания.

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.000
Recall: 0.500
F1: 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 особенно полезны при несбалансированных классах, а также когда ошибочные предсказания и пропуски имеют разную цену.