Матрица ошибок: TP, FP, TN, FN
Содержание курса
Ошибка перепутанных строк и столбцов: как различить FP и FN в массиве
Самая частая ошибка при чтении матрицы — перепутать cm[0,1] и cm[1,0]. Логика кажется симметричной: оба индекса «не на главной диагонали», оба — ошибки. Но смысл у них разный.
Разберём по определению индекса: первый индекс — строка — это истинный класс, второй индекс — столбец — это предсказанный класс.
cm[0, 1]: истинный класс 0, предсказан класс 1 → FP (ложная тревога).cm[1, 0]: истинный класс 1, предсказан класс 0 → FN (пропуск).
Если перепутать и написать fn = cm[0, 1], счётчик пропусков окажется неверным — и все метрики, которые строятся на FN, дадут неправильный результат.
Как проверить присвоение. Прежде всего убедитесь, что каждая переменная ссылается на правильную пару (истинный класс, предсказанный класс). Для наших данных:
# На этих данных: y_true=[0,0,1,1,0,1,0,1,1,0], y_pred=[0,1,1,0,0,1,0,1,0,0]
# cm = [[4 1]
# [2 3]]
tn = cm[0, 0] # истинный 0, предсказан 0 → TN = 4
fp = cm[0, 1] # истинный 0, предсказан 1 → FP = 1
fn = cm[1, 0] # истинный 1, предсказан 0 → FN = 2
tp = cm[1, 1] # истинный 1, предсказан 1 → TP = 3
Комментарий к каждой строке — это и есть первичная проверка: он буквально читается как «строка соответствует истинному классу X, столбец — предсказанному классу Y». Если комментарий совпадает с определением FP или FN — присвоение верно.
Проверка суммы строки как дополнительный контроль. После того как переменные назначены, полезно убедиться, что строка 1 суммируется в число реальных положительных объектов:
# строка 1 содержит все объекты с истинным классом 1
assert fn + tp == sum(1 for y in y_true if y == 1) # 2 + 3 == 5
Эта проверка подтверждает, что матрица построена корректно и строки не перепутаны местами. Она не гарантирует, что именно fn получила ячейку cm[1,0], а не cm[1,1]: если переставить имена fn и tp между собой, сумма не изменится. Поэтому правило индекса («строка = истинный класс, столбец = предсказанный класс») остаётся основным — проверка суммы лишь подкрепляет его.
Аналогично строка 0 должна суммироваться в число реальных отрицательных объектов: tn + fp == 5.
