Матрица ошибок: TP, FP, TN, FN
Содержание курса
Accuracy, которую мы считали в предыдущих уроках, — это одно число: доля верных ответов среди всех. Она не различает, какие именно ошибки делает модель. Матрица ошибок вскрывает эту структуру: вместо одной цифры — четыре счётчика, каждый со своим смыслом.
Структура матрицы ошибок и четыре вида исходов (TP, FP, TN, FN)
Матрица ошибок — таблица 2×2. Строки в ней — истинные классы объекта, столбцы — то, что предсказала модель. Каждая ячейка просто считает, сколько объектов попало в конкретную комбинацию (истинный класс, предсказанный класс).
Чтобы читать таблицу без путаницы, зафиксируем соглашение: 0 — отрицательный класс, 1 — положительный. Тогда четыре ячейки расшифровываются так:
Предсказан 0 Предсказан 1 Истинный 0 TN FP Истинный 1 FN TP
TP (True Positive) — модель сказала «1», и это правда. Объект действительно положительный.
TN (True Negative) — модель сказала «0», и это правда. Объект действительно отрицательный.
FP (False Positive) — модель сказала «1», но объект на самом деле 0. Это «ложная тревога»: сработал сигнал там, где ничего нет. Классический пример — спам-фильтр, который отправил важное письмо в спам.
FN (False Negative) — модель сказала «0», но объект на самом деле 1. Это «пропуск»: угроза прошла незамеченной. В медицинском контексте — больной, которого модель признала здоровым.
FP и FN — разные по природе ошибки с разными последствиями. Это именно то, что accuracy скрывает: она штрафует FP и FN одинаково, хотя в большинстве реальных задач цена пропуска и цена ложной тревоги принципиально разная.
Важно: сумма всех четырёх счётчиков равна числу объектов в выборке — TP + FP + TN + FN = N. Ни один объект не теряется и не считается дважды.
Матрица ошибок в долях: normalize="true"
Когда классы отличаются по размеру, одни абсолютные числа трудно сравнивать. normalize="true" делит каждую строку на количество объектов её истинного класса:
from sklearn.metrics import confusion_matrix
y_true = [0, 0, 1, 1, 0, 1, 0, 1, 1, 0]
y_pred = [0, 1, 1, 0, 0, 1, 0, 1, 0, 0]
print(confusion_matrix(y_true, y_pred, labels=[0, 1], normalize="true"))
Результат — [[0.8, 0.2], [0.4, 0.6]]: из реальных объектов класса 1 найдены 60%, пропущены 40%. Это не доля всех ошибок в датасете, а доля внутри второй строки. normalize="pred" нормализует столбцы, normalize="all" — всю матрицу. Название режима стоит указывать рядом с графиком, чтобы проценты читались правильно.
