Матрица ошибок по строкам и столбцам отвечает на разные вопросы

На тепловой карте диагональ равна 90%. Команда считает, что девять из десяти отправленных на проверку заявок действительно проблемные. Но карта нормирована по истинным классам: число говорит о найденных проблемах, а не о качестве очереди.

Сначала подписать знаменатель

В confusion_matrix scikit-learn строки соответствуют истинным меткам, столбцы — предсказанным. normalize="true" делит каждую строку на число истинных объектов класса. Диагональ показывает долю правильно найденных объектов среди этого класса — recall.

normalize="pred" делит столбцы на число соответствующих решений. Диагональ отвечает, какая доля предсказанного класса оказалась правильной — precision. normalize="all" показывает долю ячейки от всех объектов. Подпись «процент ошибок» без знаменателя недостаточна.

Проверить на неравных классах

В примере сто обычных заявок и десять нарушений. Модель находит девять нарушений, но отправляет на проверку ещё десять обычных заявок. Полнота нарушений равна 90%, а доля настоящих нарушений в очереди — 9 из 19.

Сохраняем counts и обе нормировки. labels=[0, 1] фиксирует порядок, иначе перестановка имён классов способна изменить чтение подписей.

import numpy as np
from sklearn.metrics import confusion_matrix
y = np.array([0] * 100 + [1] * 10)
pred = np.array([0] * 90 + [1] * 10 + [0] + [1] * 9)
counts = confusion_matrix(y, pred, labels=[0, 1])
by_true = confusion_matrix(y, pred, labels=[0, 1], normalize="true")
by_pred = confusion_matrix(y, pred, labels=[0, 1], normalize="pred")
print("counts:", counts, "recall view:", by_true, "precision view:", by_pred, sep=" | ")
assert counts.tolist() == [[90, 10], [1, 9]]
assert np.isclose(by_true[1, 1], 0.9)
assert np.isclose(by_pred[1, 1], 9/19)

Обе карты правильны, но отвечают на разные вопросы. Для поиска пропущенных нарушений полезны строки. Для оценки ручной очереди полезен предсказанный положительный столбец. Исходные количества позволяют восстановить оба знаменателя.

Сделать карту пригодной для решения

Укажите названия классов на осях, тип нормировки и число объектов. На маленьком классе один случай меняет процент сильно. Если класс отсутствует в срезе или модель ни разу его не предсказала, отдельная доля не имеет обычного наблюдаемого знаменателя; покажите это вместе с количеством.

При сравнении моделей используйте одну выборку, одинаковые labels и одно правило порога. Иначе разница карты может объясняться другим составом потока. Для разных периодов показывайте обе версии: количества описывают нагрузку, нормировка помогает сравнивать структуру ошибок.

Не выбирайте красивую нормировку после просмотра результата. Сначала сформулируйте вопрос: сколько нарушений пропущено или сколько лишних проверок получит команда. Затем выберите знаменатель и подпись, которые позволяют принять именно это решение.

Для многоклассовой задачи сохраняется та же логика. Внедиагональная ячейка строки показывает, с каким другим классом перепутали истинную категорию. Это помогает выбрать примеры для анализа признаков или разметки.

Закрепить на практике

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

Продолжить на практике