Матрица ошибок

Матрица ошибок и связанные с ней метрики на примере бинарной классификации.

Матрица ошибок, она же матрица несоответствий или confusion matrix представляет собой матрицу размером 2×2, в ячейках которой находятся параметры оценки качества модели. Такая оценка важна при решении задач классификации и обнаружения объектов. Перейдем от общих слов к делу и:

Составляем матрицу ошибок!

Предположим, что модель бинарной классификации определяет, присутствуют ли на фото люди. На вход модели были поданы 7 изображений, после небольших преобразований, выходной вектор с предсказаниями для этих 7ми изображений выглядит как y_pred = [1, 0, 0, 1, 0, 1, 1]. Если y_pred[i] = 1, значит модель считает, что на i-м фото присутствуют люди, если y_pred[i] = 0, то модель полагает, что людей на фото нет (0<i<8). Сравним предсказанные моделью значения y_pred с истинными значениями target:

y_pred  = [1,     0,     0,     1,     0,     1,     1]
target  = [1,     1,     0,     0,     0,     1,     1]
compare = [true, false, true, false,  true,  true,  true]

Посчитаем, сколько раз модель:

  • верно определила категорию 1 (назовем это значение true positive или TP). TP = 3;
  • неверно определила категорию 1 (false positive). FP = 1;
  • верно определила категорию 0 (true negative). TN=2;
  • неверно определила категорию 0 (false negative). FN=1.

Подробнее о подсчете TP и FP:

Условимся называть позитивным значением категорию 1, негативным — категорию 0. Глядя на вектор y_pred мы видим, что модель нашла людей на 4-х изображениях. Однако, при сравнении с вектором target понимаем, что только на трех из них действительно есть люди. Это значит, что в 3-х случаях модель верно определила позитивное значение, и только один раз ошибочно выдала первую категорию. Значит true positive = 3, а false positive = 1. Аналогичным образом подсчитываются TN и FN для нулевой категории.

Используя вычисленные значения true positive, true negative, false positive, false negative, сформируем матрицу несоответствий или confusion matrix:

Матрица ошибок
Матрица ошибок (рис. 1)

Матрица ошибок в коде на Python

Для нахождения матрицы ошибок будем использовать функционал Scikit-learn:

from sklearn.metrics import confusion_matrix
import numpy as np

y_pred   =  [1, 0, 0, 1, 0, 1, 1]
target   =  [1, 1, 0, 0, 0, 1, 1]

CM = confusion_matrix(target, y_pred)
CM = np.flip(CM)
print(CM)

Вывод на экран:

 [[3 1]
 [1 2]] 

Важно отметить, что функция confusion_matrix() в scikit-learn возвращает матрицу, аналогичную вычисленной нами матрице на рис.1, но в развернутом виде. Поэтому мы дополнительно вызвали метод flip() из библиотеки numpy для инвертирования матрицы к привычному виду.

Матрица ошибок содержит значения, необходимые для вычисления ряда метрик

Значения, хранящиеся в ячейках матрицы ошибок: TP (true positive), FP (false positive), TN (true negative) и FN (false nagative) используются для вычисления метрик:

1. Precision (точность)— показывает долю верных положительных прогнозов для выбранного класса среди всех положительных прогнозов, сделанных моделью. Таким образом, precision демонстрирует способность модели отличать выбранный класс от других классов.

2. Recall (полнота) — показывает долю верных положительных прогнозов для выбранного класса среди всех положительных случаев в наборе данных.Таким образом recall демонстрирует способность модели обнаруживать выбранный класс.

3. Рассмотренные выше метрики Precision и Recall лежат в основе вычисления метрики F1-score:

F1-score принимает значения от 0 до 1. Чем больше верных предсказаний дает модель, тем ближе к единице значение F1-score.


Фанаты BIG DATЫ — наш Телеграм-канал для всех увлеченных изучением Python, Data Science, ML, нейросетями и т.д. Присоединяйтесь, вместе веселее! 😉


Код для нахождения метрик Precision, Recall, F1-score:

from sklearn.metrics import ( 
    precision_score,
    recall_score,
    f1_score
)

y_pred   =  [1, 0, 0, 1, 0, 1, 1]
target   =  [1, 1, 0, 0, 0, 1, 1]

precision = precision_score(target, y_pred)
recall = recall_score(target, y_pred)
f1_score = f1_score(target, y_pred)

print("Точность = ", precision)
print("Полнота = ", recall)
print("f1 score = ", f1_score)

Вывод на экран:

 Точность =  0.75
 Полнота =  0.75
 f1 score =  0.75