Качество классификации и второй проект

Precision, recall и F1

Содержание курса

В прошлом уроке вы извлекли из матрицы ошибок четыре числа — TP, FP, TN, FN — и научились правильно раскладывать confusion_matrix по индексам. Теперь эти четыре числа перестают быть просто ячейками: из них собираются метрики, которые говорят о качестве модели на языке конкретных инженерных компромиссов.

TP, FP, FN как знаменатели precision и recall

Матрица ошибок хранит четыре числа, но accuracy сводит их к одному отношению: (TP + TN) / (TP + TN + FP + FN) — доля верных предсказаний среди всех. Precision и recall смотрят на более узкие срезы — и каждый срез отвечает ровно на один вопрос.

Precision спрашивает: «Из всего, что модель назвала положительным, сколько действительно положительных?» Множество «всего названного положительным» — это TP плюс FP. Отсюда:

Precision = TP / (TP + FP)

Знаменатель — вертикальный срез по предсказанным положительным (столбец 1 в матрице). Ложные тревоги (FP) тянут его вниз, потому что они увеличивают знаменатель без изменения числителя.

Recall спрашивает другое: «Из всех реальных положительных сколько модель нашла?» Теперь берём все реальные положительные — это TP плюс FN (те, кого модель пропустила):

Recall = TP / (TP + FN)

Знаменатель — горизонтальный срез по реальным положительным (строка 1 в матрице). Пропуски (FN) снижают recall: каждый пропущенный положительный объект увеличивает знаменатель, не трогая числитель.

Заметьте, что TN не входит ни в одну из этих формул. Это значит: если к данным добавить только новые истинно отрицательные объекты, не меняя TP и FP, ни precision, ни recall не изменятся — TN просто не участвует в расчёте. Однако это не означает устойчивости к любым изменениям состава данных: если вместе с новыми отрицательными объектами растёт и число FP (модель ошибочно относит часть из них к положительному классу), precision упадёт, несмотря на неизменный TP.

Чтобы связать формулы с конкретными ячейками матрицы: при вызове confusion_matrix(y_true, y_pred, labels=[0, 1]) строки соответствуют реальным классам, столбцы — предсказанным. Тогда:

  • cm[1, 1] = TP
  • cm[0, 1] = FP
  • cm[1, 0] = FN

Precision берёт столбец 1 (предсказано «1»): cm[1,1] / (cm[1,1] + cm[0,1]). Recall берёт строку 1 (реально «1»): cm[1,1] / (cm[1,1] + cm[1,0]).

Из формул напрямую следует, как менять поведение модели при прочих равных: если зафиксировать TP и снизить только FP — precision вырастет; если зафиксировать TP и снизить только FN — вырастет recall. Это и есть инженерный компромисс между двумя метриками: FP «стоит» precision, FN «стоит» recall.

Однако на практике прочие равные не сохраняются: при сдвиге порога классификации вместе с FP меняется и TP, поэтому precision может как вырасти, так и упасть. Предсказать направление изменений без пересчёта нельзя — нужно смотреть на конкретные числа. Взаимозависимость precision и recall при изменении порога разбирается подробнее в следующем уроке.