Матрица ошибок (confusion matrix): формула и пример

Матрица ошибок, она же confusion matrix, - это таблица, в которую сводят предсказания классификатора против реальных меток класса. Она устроена просто: строки - фактический класс объекта, столбцы - то, что предсказала модель (или наоборот, в зависимости от источника). На пересечении строк и столбцов оказываются четыре числа: верно найденные положительные объекты, верно найденные отрицательные, и два вида ошибок - ложные тревоги и пропуски. Из этих четырёх чисел выводятся почти все метрики качества классификации, которые встречаются в курсах машинного обучения: accuracy, precision, recall, специфичность и F1-score. Ниже разберём саму таблицу, формулы метрик и то, где студенты чаще всего путаются. Чтобы сразу увидеть, как числа матрицы превращаются в проценты качества, покрутите калькулятор ниже - он пересчитывает все метрики и перерисовывает саму матрицу.
Что стоит в клетках матрицы ошибок
Для задачи бинарной классификации (два класса: «положительный» и «отрицательный») матрица ошибок - это таблица 2×2 из четырёх величин:
- True Positive () - модель предсказала «положительный», и объект действительно положительный;
- True Negative () - модель предсказала «отрицательный», и объект действительно отрицательный;
- False Positive () - модель предсказала «положительный», а объект на самом деле отрицательный (ложная тревога, ошибка I рода);
- False Negative () - модель предсказала «отрицательный», а объект на самом деле положительный (пропуск, ошибка II рода).
Первая буква в названии ( или ) говорит, угадала модель или ошиблась; вторая буква ( или ) - что именно она предсказала. Общее число объектов в выборке - это сумма всех четырёх клеток: . Если сложить и , получится реальное число положительных объектов в выборке; если сложить и - реальное число отрицательных.
Accuracy, precision и recall через матрицу
Самая грубая метрика - accuracy (доля верных ответов среди всех предсказаний):
Она интуитивна, но обманчива при дисбалансе классов: если положительных объектов всего 1% выборки, модель, которая вообще ничего не находит и всегда отвечает «отрицательный», получит accuracy 99%, оставаясь при этом бесполезной. Поэтому для несбалансированных задач (спам, редкие заболевания, брак на производстве) accuracy почти никогда не используют в одиночку - вместе с ней смотрят precision и recall.
Precision (точность) отвечает на вопрос «из всех объектов, которые модель назвала положительными, сколько действительно положительные»:
Recall (полнота, чувствительность) отвечает на другой вопрос - «из всех реально положительных объектов сколько модель нашла»:
Precision наказывает модель за ложные тревоги ( в знаменателе), recall - за пропуски ( в знаменателе). Эти два показателя обычно конфликтуют: если сдвинуть модель в сторону «находить как можно больше», она начнёт чаще ошибаться ложными срабатываниями, и наоборот.

F1-score: как объединить precision и recall в одно число
Когда нужен единственный показатель, а не пара конфликтующих чисел, считают F1-score - гармоническое среднее precision и recall:
Гармоническое среднее выбрано не случайно: в отличие от обычного среднего арифметического, оно резко штрафует ситуацию, когда один из показателей близок к нулю. Модель с precision = 1 и recall = 0,01 получит арифметическое среднее около 0,5, что выглядит неплохо, но F1 в этом случае окажется около 0,02 - почти ноль, и это куда честнее описывает бесполезную модель. Если точность и полнота важны не в равной степени, используют обобщение - -меру, где параметр задаёт, во сколько раз recall весомее precision.
Порог классификации и как он меняет матрицу
Большинство классификаторов на выходе выдают не метку класса, а число - вероятность или «уверенность» принадлежности к положительному классу. Метку получают, сравнивая это число с порогом отсечения (обычно 0,5): выше порога - «положительный», ниже - «отрицательный». Порог не задан природой задачи, это настраиваемый параметр, и от него напрямую зависит вся матрица ошибок.
Если сдвинуть порог вверх (модель должна быть увереннее, чтобы назвать объект положительным), уменьшается, но вместе с ним растёт - часть настоящих положительных объектов больше не проходит порог. Значит, precision растёт, а recall падает. Если сдвинуть порог вниз - эффект обратный: recall растёт, precision падает. Именно поэтому precision и recall нельзя увеличивать одновременно простым сдвигом порога - компромисс всегда есть, и место, где его остановить, зависит от цены ошибок в конкретной задаче.
Чувствительность и специфичность в медицинских тестах
В медицинской и биологической литературе те же величины часто называют другими именами. Recall в этом контексте - это чувствительность теста (sensitivity): доля больных, которых тест правильно определил как больных. Ему в пару идёт специфичность (specificity) - доля здоровых, которых тест правильно определил как здоровых:
Специфичность - это, по сути, recall для отрицательного класса. Чем выше специфичность, тем меньше здоровых людей тест пугает ложноположительным результатом. Скрининговые тесты на опасные заболевания обычно настраивают на высокую чувствительность даже ценой специфичности - пропустить больного человека дороже, чем один раз перепроверить здорового.
Матрица ошибок для многоклассовой задачи
Если классов больше двух, матрица ошибок превращается в таблицу , где - число классов: строка , столбец показывает, сколько объектов истинного класса модель отнесла к классу . Диагональ таблицы - верные предсказания, всё, что вне диагонали, - ошибки, причём видно не только сам факт ошибки, но и то, с каким классом объект чаще всего путают. Precision и recall для многоклассовой задачи считают отдельно для каждого класса по схеме «один против всех» (one-vs-rest): для класса его - это диагональный элемент, - сумма остальных элементов его столбца, - сумма остальных элементов его строки. Получившиеся значения по классам затем усредняют - как простое среднее (macro-average) или взвешенное по размеру класса (weighted-average).
Частые ошибки
- Перепутать строки и столбцы. В одних источниках строки - это факт, столбцы - предсказание, в других наоборот. Перед тем как считать TP/FP/FN/TN по чужой таблице, явно проверяйте подпись осей.
- Судить о модели только по accuracy при дисбалансе классов. Классификатор, который всегда отвечает «отрицательный», может дать accuracy 95% и выше на редком положительном классе, оставаясь бесполезным.
- Путать precision и recall местами. Precision - про качество положительных ответов модели ( в знаменателе), recall - про полноту охвата реальных положительных объектов ( в знаменателе). Перепутанные формулы - самая частая ошибка в задачах.
- Забыть, что F1 - гармоническое, а не арифметическое среднее. Подстановка обычного среднего вместо формулы через произведение даёт завышенный и неверный результат.
- Считать специфичность через recall положительного класса. Специфичность - это recall для отрицательного класса (), а не то же самое число, что и обычный recall.
FAQ
Что означает True Positive в матрице ошибок? Это объект, который модель верно отнесла к положительному классу: предсказание «положительный» совпало с реальной меткой. Такие объекты стоят в числителе и precision, и recall.
Чем матрица ошибок отличается от accuracy? Accuracy - это одно число, доля верных ответов. Матрица ошибок - таблица из четырёх (или больше, для многоклассовой задачи) чисел, из которой accuracy можно получить, но которая дополнительно показывает, какого рода ошибки совершает модель - ложные тревоги или пропуски.
Как посчитать precision и recall, если известна только матрица ошибок? Найдите в таблице , и : precision = (доля верных среди предсказанных положительными), recall = (доля найденных среди всех реально положительных).
Коротко
Матрица ошибок сводит предсказания классификатора в четыре числа - , , , , - из которых считаются все ключевые метрики: accuracy = , precision = , recall = , специфичность = и F1 = . Порог классификации сдвигает баланс между precision и recall в противоположные стороны, а для многоклассовых задач те же формулы применяют отдельно к каждому классу по схеме «один против всех».
Читайте также

Алгоритм AdaBoost: как слабые классификаторы дают сильный
Алгоритм AdaBoost простыми словами: адаптивный бустинг, перевзвешивание объектов, формула веса классификатора, итоговый ансамбль и разбор шага на примере с формулами.

Алгоритм CatBoost: бустинг с обработкой категорий
Алгоритм CatBoost простыми словами: упорядоченный бустинг против сдвига прогноза, кодирование категориальных признаков через ordered target statistics, симметричные деревья и разбор типовых задач.

Алгоритм LightGBM: быстрый градиентный бустинг
Алгоритм LightGBM простыми словами: рост дерева по листьям против роста по уровням, гистограммы признаков, GOSS и EFB, настройка num_leaves и learning rate, борьба с переобучением и разбор задач.

Алгоритм policy gradient: как обучают стратегию напрямую
Разбираем алгоритм policy gradient: теорема о градиенте, формула REINFORCE, роль baseline и log-производной. С примерами вывода, типовыми ошибками и интерактивным расчётом сходимости.

Алгоритм UMAP: как работает снижение размерности
Алгоритм UMAP простыми словами: как метод строит граф ближайших соседей, оптимизирует низкоразмерное вложение, чем отличается от t-SNE и как подобрать n_neighbors и min_dist для визуализации данных.

Алгоритм XGBoost: как работает градиентный бустинг
Алгоритм XGBoost простыми словами: градиентный бустинг над деревьями решений, формула аддитивной модели, learning rate, регуляризация, ранняя остановка и разбор типовых задач.