Confusion Matrix
Матрица ошибок подсчитывает предсказания модели в сравнении с истинными метками для каждого класса. Разбираем, как её читать, какие метрики она позволяет получить и как она выглядит для детекции.
Матрица ошибок — это таблица, которая показывает, насколько предсказания модели классификации совпадают с истинными метками. На одной оси указаны фактические классы, на другой — предсказанные, а в каждой ячейке подсчитываются примеры, попавшие в соответствующую пару. Верные предсказания находятся на диагонали, а все ошибки — вне ее, в ячейках, точно показывающих, какой класс с каким перепутан. Поэтому матрица ошибок — стандартный первый способ изучить ошибки модели и источник показателей точности, точности положительных предсказаний, полноты и F1-меры.
Как читать матрицу ошибок для бинарной классификации#
Для двух классов матрица состоит из четырех ячеек:
- Истинно положительные (TP): положительные примеры, предсказанные как положительные, например неисправная деталь, отмеченная как неисправная.
- Ложноположительные (FP): отрицательные примеры, предсказанные как положительные; также называются ошибками I рода или ложными срабатываниями.
- Ложноотрицательные (FN): положительные примеры, предсказанные как отрицательные; также называются ошибками II рода или пропусками.
- Истинно отрицательные (TN): отрицательные примеры, предсказанные как отрицательные.
Большинство бинарных метрик — это отношения этих четырех значений. Точность положительных предсказаний равна TP / (TP + FP), полнота — TP / (TP + FN), а точность — (TP + TN), деленное на сумму всех четырех значений. Важность каждой ячейки вне диагонали зависит от приложения: для скрининга рака настраивают низкую долю ложноотрицательных результатов, а для спам-фильтра — низкую долю ложноположительных.
Матрицы ошибок для нескольких классов#
Для N классов матрица имеет размер N × N. В ориентации, принятой в scikit-learn's confusion_matrix, каждая строка соответствует истинному классу, а каждый столбец — предсказанному. Просмотр строки показывает, куда попали примеры этого класса, поэтому отношение диагональной ячейки к сумме по строке равно полноте для класса. Просмотр столбца показывает, чем на самом деле были примеры, предсказанные моделью как этот класс, поэтому отношение диагональной ячейки к сумме по столбцу равно точности положительных предсказаний для класса. Некоторые инструменты отображают транспонированную матрицу, поэтому при чтении графика нужно ориентироваться на подписи осей.
from sklearn.metrics import confusion_matrix
# Истинные и предсказанные метки для 10 изображений
y_true = ["cat", "cat", "cat", "dog", "dog", "dog", "dog", "fox", "fox", "fox"]
y_pred = ["cat", "cat", "dog", "dog", "dog", "dog", "cat", "fox", "dog", "fox"]
# Строки соответствуют истинным классам, а столбцы — предсказанным; порядок меток указан здесь
labels = ["cat", "dog", "fox"]
matrix = confusion_matrix(y_true, y_pred, labels=labels)
print(matrix)Выведенные строки для классов cat, dog и fox — это [2 1 0], [1 3 0] и [0 1 2]. На диагонали находятся 7 из 10 изображений, поэтому точность равна 0.7. В столбце dog находятся одна кошка и одна лиса, поэтому точность положительных предсказаний для dog равна 3 / 5 = 0.6; из строки dog одно изображение попало в cat, поэтому полнота для dog равна 3 / 4 = 0.75. Нормализованная матрица делит каждую ячейку на общее число примеров истинного класса, поэтому диагональ показывает полноту для каждого класса, а классы с сильно различающимся числом примеров становятся сопоставимыми.
Матрицы ошибок для обнаружения объектов#
Обнаружение объектов добавляет класс «фон», поскольку детектор может выдать рамку там, где ничего нет, или вовсе пропустить объект. Сначала предсказания сопоставляются с метками по пересечению над объединением (IoU), а затем подсчитываются: сопоставленные пары попадают в ячейки классов, несопоставленные предсказания считаются ложноположительными относительно фона, а несопоставленные метки — ложноотрицательными, предсказанными как фон. Ячейка «фон — фон» остается пустой, поскольку пустые области изображения нельзя подсчитать, поэтому в матрице обнаружения нет истинно отрицательных результатов. Валидация YOLO26 строит такую матрицу с дополнительными строкой и столбцом для фона, сопоставляя предсказания с метками при IoU выше 0.45, и сохраняет ее как confusion_matrix.png; предсказанные классы расположены на вертикальной оси, а истинные — на горизонтальной.
from ultralytics import YOLO
# Load a pretrained YOLO26 nano detector
model = YOLO("yolo26n.pt")
# Validation builds the confusion matrix and saves it as confusion_matrix.png
metrics = model.val(data="coco8.yaml")
matrix = metrics.confusion_matrix.matrix # rows: predicted class, columns: true class
# 80 COCO classes plus one background row and column
print(matrix.shape)
# Class 0 is "person": correct detections and people the model missed
print(f"Person TP: {matrix[0, 0]:.0f}, missed: {matrix[-1, 0]:.0f}")Размерность — (81, 81), а в последней строке подсчитываются размеченные люди, которым не соответствует ни одно предсказание.
Матрица ошибок и связанные инструменты#
- ROC-кривая: по одной точке для каждого порога принятия решения; каждая точка суммирует матрицу ошибок этого порога в виде доли истинно положительных и доли ложноположительных результатов.
- Средняя точность (mAP): основной показатель качества обнаружения, вычисляемый по тем же решениям TP и FP при всех уровнях уверенности, но не показывающий, какие классы перепутаны.
- Точность: матрица, сведенная к одному числу, — сумма значений на диагонали, деленная на общее число примеров. На наборе данных, где 95% примеров отрицательные, модель, всегда предсказывающая «отрицательный», покажет точность 95%, хотя матрица покажет ноль истинно положительных результатов.










