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

Матрица ошибок: 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" — всю матрицу. Название режима стоит указывать рядом с графиком, чтобы проценты читались правильно.

Начать заново?

Помощник начнёт новый диалог по этой задаче. Текущая переписка останется в истории до конца срока хранения.

О переписке

Можно приложить до трёх фото PNG, JPEG или WebP по 5 МБ.

Переписка и фото хранятся 90 дней после последнего принятого сообщения и доступны преподавателям курса. Чтобы попросить преподавателя подключиться, отправьте обращение из диалога.

Проверка решения остаётся отдельным действием.