
Матрица ошибок: как вручную проверить precision и recall


Если в отчете по классификатору вы видите только два числа — precision и recall — их полезно хотя бы один раз проверить вручную. Так быстрее становится понятно, где именно ошибается модель: она слишком часто кричит «спам» или, наоборот, пропускает нежелательные сообщения. На маленьком наборе это делается без формул на полстраницы: нужно заранее выбрать положительный класс, разложить ответы по четырем ячейкам матрицы ошибок и только потом считать доли.
Сначала задайте положительный класс
В бинарной классификации метрики precision и recall считаются не «вообще», а относительно положительного класса. В задаче фильтрации писем им обычно делают спам. Это удобно: тогда обе метрики отвечают на вопрос, насколько хорошо модель находит именно спам, а не обычные сообщения.
Это не формальность. Если поменять положительный класс на «не спам», те же восемь ответов дадут другие TP, FP, FN и TN. Формулы не изменятся, но смысл чисел станет другим. Поэтому первое действие перед ручной проверкой простое: на листе или в таблице явно записать положительный класс = спам. Если вы пользуетесь библиотекой, там тоже важно понимать, какой класс она считает положительным по умолчанию.
Подготовьте восемь ответов для сверки
Учебный пример. Возьмем восемь коротких сообщений. У каждого есть истинная метка от человека и предсказание модели. Нам не нужны вероятности, только итоговый ответ: «спам» или «не спам».
| № | Сообщение | Истинная метка | Предсказание модели |
|---|---|---|---|
| 1 | Купон на скидку, только сегодня | спам | спам |
| 2 | Созвон перенесен на 16:00 | не спам | не спам |
| 3 | Вы выиграли подарок, подтвердите номер | спам | спам |
| 4 | Счет за март готов | не спам | спам |
| 5 | Фото с командной встречи | не спам | не спам |
| 6 | Последний день акции, откройте ссылку | спам | не спам |
| 7 | Бесплатная доставка без условий | спам | не спам |
| 8 | Заберите приз до полуночи | спам | спам |
Здесь уже видно, что модель ошибается в обе стороны. Она один раз назвала обычное письмо спамом и дважды пропустила реальный спам. Но для метрик этого наблюдения мало: нужно точно разнести все восемь сообщений по четырем категориям.
Заполните матрицу ошибок вручную
У матрицы ошибок всего четыре ячейки. Так как положительный класс у нас — спам, читаем каждое сообщение так:
- TP — реальный спам, и модель сказала «спам».
- FP — на самом деле не спам, но модель сказала «спам».
- FN — на самом деле спам, но модель сказала «не спам».
- TN — на самом деле не спам, и модель сказала «не спам».
Теперь пройдемся по примеру. Сообщения 1, 3 и 8 — это TP. Сообщение 4 — FP. Сообщения 6 и 7 — FN. Сообщения 2 и 5 — TN. Получаем такую матрицу:
| Предсказано: спам | Предсказано: не спам | |
|---|---|---|
| На самом деле: спам | TP = 3 | FN = 2 |
| На самом деле: не спам | FP = 1 | TN = 2 |
Полезная проверка: сумма всех ячеек должна совпасть с числом объектов. Здесь 3 + 2 + 1 + 2 = 8, значит, мы никого не потеряли. Еще одна практическая мелочь: в разных инструментах строки и столбцы матрицы могут идти в разном порядке. При ручной проверке смотрите не на позицию ячейки, а на подписи осей.
Посчитайте precision и recall без путаницы
Когда TP, FP, FN и TN готовы, сами формулы короткие:
- precision =
TP / (TP + FP) - recall =
TP / (TP + FN)
Подставим наши числа. Precision = 3 / (3 + 1) = 3 / 4 = 0,75. Recall = 3 / (3 + 2) = 3 / 5 = 0,6. Эти доли похожи по виду, поэтому их часто путают, но знаменатели у них разные.
Проще запомнить смысл, а не форму записи. Precision отвечает на вопрос: «Из всех сообщений, которые модель назвала спамом, какая доля действительно была спамом?» У нас модель пометила спамом 4 сообщения: 1, 3, 4 и 8. Из них настоящего спама было 3, значит точность срабатывания на положительном классе — 0,75.
Recall отвечает на другой вопрос: «Из всех реальных спам-сообщений какую долю модель вообще нашла?» Настоящего спама здесь 5 сообщений: 1, 3, 6, 7 и 8. Модель поймала только 3 из них, поэтому полнота — 0,6. Полезная шпаргалка такая: precision смотрит на предсказанные “плюсы”, recall — на реальные “плюсы”.
Отдельно важно понять случаи деления на ноль. Если модель вообще ни разу не предсказала спам, то TP + FP = 0, и precision на этой выборке не определяется. Если в проверочном наборе не было ни одного реального спама, то TP + FN = 0, и уже recall не определяется. Некоторые библиотеки в таких ситуациях возвращают 0 или предупреждение по настройкам, но для ручной проверки полезнее писать словами: «метрика не определяется на этой выборке», а рядом оставлять сами счетчики.
Почему эти числа не обещают качество на новых данных
Матрица ошибок честно описывает только то, что произошло на этих восьми сообщениях. Она не обещает, что на следующей неделе модель даст те же 0,75 и 0,6. Выборка маленькая, поэтому одна-две записи заметно меняют итог. Например, если бы сообщение 6 модель распознала как спам, получилось бы TP = 4, FN = 1, и recall вырос бы с 0,6 до 0,8. А если бы сообщение 4 не было ложной тревогой, precision стал бы 3 / 3 = 1,0.
Есть и вторая причина не переоценивать метрики: состав данных меняется. На одном наборе может быть много рекламных сообщений, на другом — почти одни обычные письма. Тогда даже похожее поведение модели даст другие доли. Поэтому ручной расчет полезен не как «финальная правда о модели», а как способ проверить логику оценки: правильно ли выбран положительный класс, не перепутаны ли знаменатели, есть ли у вас вообще достаточный и отдельно проверочный набор.
Практический вывод простой. Если вы хотите проверить precision и recall без калькулятора ошибок, действуйте в одном порядке: сначала задайте положительный класс, затем вручную соберите TP/FP/FN/TN, проверьте сумму объектов и только после этого считайте доли. На маленьком примере это занимает несколько минут и быстро показывает, где именно вы перепутали смысл метрик.
Если хотите потренировать этот навык на задачах обработки текста, в карточке курса по NLP указано, что программа включает валидацию данных, оценку качества алгоритмов, метрики качества, разделение набора данных и задачи классификации текстов со Scikit-learn. При выборе обучения полезно проверить для себя три вещи: есть ли в программе отдельный блок про метрики, будет ли самостоятельная практика на размеченных текстах и сможете ли вы по итогам сами объяснить расхождение между precision и recall на конкретном наборе.





















