сеньорчикОткрыть в Telegram
← вся теориятеория к собесу · Классический ML

Метрики классификации

Зачем это спрашивают

Метрики классификации - дежурный блок DS-собеса, и валят на нём чаще, чем на любой математике. Причина в том, что спрашивают не определения, а связь метрики с ценой ошибки в продукте: формула precision гуглится за секунду, а вот выбор порога под живой бизнес - нет.

Типовые формулировки: «почему accuracy плохая метрика?», «precision или recall - что важнее?», «у модели ROC-AUC 0.95, это хорошо?».

// Заведи себе один пример со своими цифрами - антифрод, спам-фильтр, отток - и половина вопросов темы закроется им одним. Абстрактные ответы тут звучат заученно, ответ на числах звучит как опыт.

Четыре клетки, из которых собрано всё

Модель отвечает «да» или «нет». Реальность тоже «да» или «нет». Значит, возможных исходов ровно четыре, и их складывают в табличку 2×2 - её называют матрицей ошибок (confusion matrix).

TP (true positive) - сказали «да», и правда да. FP (false positive) - сказали «да», а на самом деле нет: ложная тревога. FN (false negative) - сказали «нет», а на самом деле да: пропуск. TN (true negative) - сказали «нет», и правда нет.

Читаются буквы так: вторая говорит, что ответила модель (P - позитив, N - негатив), первая - угадала она или нет (T - true, F - false). FN это «модель сказала негатив, и это была ошибка».

// Любая метрика классификации - арифметика этих четырёх чисел, больше в ней ничего нет. Если на собесе поплыл в формуле, рисуй квадрат из четырёх клеток и собирай метрику заново, это всегда работает.

позитивный класс
то, что мы ищем: фрод, спам, отток. Обычно он редкий, и почти все ловушки темы растут из этого

Precision и recall на живых числах

Антифрод, 10 000 транзакций за день, мошеннических среди них 100. Модель пометила подозрительными 200 штук, и настоящих мошенников в этой сотне с лишним оказалось 80.

Precision = 80/200 = 0.4: из помеченных реально фрод только четыре из десяти, остальные 120 - честные люди, которых мы дёрнули зря. Recall = 80/100 = 0.8: из настоящих мошенников поймали восемь из десяти, двадцать ушли с деньгами. Precision отвечает «насколько чист улов», recall - «какую долю рыбы вытащили из пруда».

Ручка, которая крутит обе цифры, одна - порог. Опусти его, модель пометит уже 500 транзакций и поймает 95 мошенников: recall вырос до 0.95, зато precision упал до 95/500 = 0.19, и оператор теперь разбирает четыреста честных платежей вместо ста двадцати.

// Поэтому метрики смотрят парой. Поодиночке каждая ломается тривиально: пометь все транзакции подряд - recall станет 1.0; пометь одну самую подозрительную и попади - precision станет 1.0.

порог
число, выше которого скор модели считается ответом «да». Модель выдаёт непрерывный скор, а «да/нет» из него делает уже порог

Почему accuracy обманывает и что такое F1

Accuracy - доля верных ответов среди всех, (TP + TN) / всего. Звучит как самая честная метрика, а в том же антифроде ведёт себя так: модель, которая всегда отвечает «всё чисто», права 9900 раз из 10 000. Accuracy 0.99, пользы ноль.

Отсюда привычка, которая спасает на собесе и в работе: любую метрику сравнивай с тривиальным бейзлайном - константой или случайным ответом. Цифра сама по себе не значит ничего, значение имеет только отрыв от бейзлайна.

F1 - гармоническое среднее precision и recall. Гармоническое взяли не для красоты: обычное среднее из 0.9 и 0.1 даёт спокойные 0.5, а F1 = 2·0.9·0.1/(0.9+0.1) = 0.18. Одна проваленная половина тянет F1 на дно, и перекос не спрячешь. Если одна из метрик важнее, берут Fβ: F2 весит recall выше precision, F0.5 наоборот.

// В мультиклассе усредняют тремя способами: macro - каждый класс весит одинаково, weighted - пропорционально числу примеров, micro - по объектам. На дисбалансе эти три цифры разъезжаются сильно, так что всегда уточняй, какая из них перед тобой.

бейзлайн
простейшее решение, с которым сравнивают модель: константа, случайность, правило в одну строчку
дисбаланс классов
позитивов сильно меньше негативов. 1:100 - обычное дело для фрода, оттока, редких болезней

ROC-AUC: метрика, которой порог не нужен

Все метрики выше зависят от порога, а порог часто ещё не выбран - хочется сравнить сами модели. Для этого есть ROC-AUC (receiver operating characteristic, area under the curve), и у него есть человеческое прочтение: возьми случайного мошенника и случайного честного клиента; ROC-AUC - вероятность, что модель дала мошеннику скор выше. 0.5 - монетка, 1.0 - идеальная сортировка.

Сама кривая строится так: гоняешь порог от максимума к минимуму и на каждом шаге отмечаешь точку TPR (true positive rate, он же recall) против FPR (false positive rate - какую долю честных записали в мошенники). AUC - площадь под получившейся кривой.

Подвох живёт в знаменателе FPR. Пятьсот ложных срабатываний на 9900 честных клиентов дают FPR всего 5 процентов, кривая выглядит красиво, а precision при этом 80/580 ≈ 0.14 и оператор тонет. Чем реже позитив, тем сильнее ROC-AUC льстит - на редком классе честнее PR-AUC, площадь под кривой precision-recall.

// Порог из ROC-AUC не следует никак, это отдельное продуктовое решение. Дефолтные 0.5 - число из ниоткуда: его никто не выбирал, оно просто стоит в библиотеке.

скор
непрерывный выход модели, обычно от 0 до 1: насколько она склоняется к позитивному классу
PR-AUC
площадь под кривой precision-recall. На редком позитивном классе показывает реальную картину, в отличие от ROC-AUC

Как отвечать: «Precision или recall - что важнее?»

Зависит от того, что дороже стоит, и это не уход от ответа, а сам ответ. В антифроде пропустить мошенника дороже, чем лишний раз дёрнуть честного клиента, значит двигаю порог в сторону recall. В спам-фильтре наоборот: потерянное письмо от заказчика хуже, чем спам во входящих, значит важнее precision. На практике я либо фиксирую одну метрику на приемлемом уровне и максимизирую вторую, либо прямо собираю функцию из цен ложной тревоги и пропуска и подбираю порог по её минимуму. Ответить «беру F1» без вопроса о ценах - значит спрятаться от продуктового решения, которое всё равно придётся принять.

Два конкретных кейса с противоположным выбором и рабочий приём «зафиксируй одну, максимизируй другую». Так отвечает человек, который правда подбирал порог под живой продукт, а не читал про метрики.

На чём валят

  • Хвалить accuracy 0.99 при дисбалансе 1:100 - ровно столько же выдаёт константа «всё чисто».
  • Сравнивать F1 двух моделей, посчитанные при разных порогах: сначала фиксируется процедура выбора порога, потом сравниваются числа.
  • Верить ROC-AUC 0.95 при доле позитивов 0.1 процента - в координатах precision-recall модель может оказаться почти бесполезной.
  • Гнаться за одной метрикой без цены ошибок: recall 100 процентов достигается ответом «все объекты позитивные».
  • Оставлять порог 0.5 по умолчанию и называть это выбором.

Проверьте себя

Пять вопросов из банка по этой подтеме. Всего их 19, остальные разбираются в тренажёре.

  1. #classification_metrics1 / 5
    Precision и recall тянут в разные стороны. Что делает F1 и когда его использовать некорректно?
    A)F1 — это среднее арифметическое precision и recall, оно корректно
    B)F1 — это просто максимум из значений precision и recall модели
    C)F1 — гармоническое среднее; некорректен, когда цены FP и FN разные
    D)F1 применим к задачам многоклассовой классификации
    показать ответ и разбор
    +C)F1 — гармоническое среднее; некорректен, когда цены FP и FN разные

    // разбор: Гармоническое среднее близко к минимуму: precision 0.9 при recall 0.1 даёт F1 ≈ 0.18 — «читерить» одной стороной не выйдет. Но F1 неявно ставит FP и FN равноценными: в скрининге болезни пропуск в разы дороже ложной тревоги — берут F2 или подбирают порог по ожидаемой стоимости. И помнить: F1 зависит от порога, в отличие от AUC.

  2. #classification_metrics2 / 5
    Модель для выдачи кредитов оценивают по log-loss, а решение принимается порогом по вероятности. Бизнес просит «поднять одобрение без роста дефолтов». Что крутить в первую очередь?
    A)Заново переобучить ту же модель с другим случайным сидом инициализации
    B)Сменить функцию потерь с log-loss на accuracy на этапе обучения модели
    C)Просто увеличить размер обучающей выборки примерно в два раза
    D)Порог: двигаем по кривой одобрение–дефолт, модель пока не трогаем
    показать ответ и разбор
    +D)Порог: двигаем по кривой одобрение–дефолт, модель пока не трогаем

    // разбор: Обучение и принятие решения — разные слои: модель даёт скор, порог превращает его в действие. Кривая approval-vs-default (аналог ROC в бизнес-осях) показывает достижимые точки; сдвиг порога — мгновенный, бесплатный и обратимый ход. Отдельные пороги по сегментам и честная калибровка часто дают больше, чем «ещё одна модель».

  3. #classification_metrics3 / 5
    Что такое precision и recall?
    A)Precision — это доля всех пойманных из числа настоящих позитивов, а recall — доля верных из пойманных
    B)Precision — верных среди предсказанных позитивов; recall — пойманных из всех настоящих
    C)Precision и recall — это два разных названия обычной accuracy
    D)Precision — скорость работы модели, recall — объём занятой ею памяти
    показать ответ и разбор
    +B)Precision — верных среди предсказанных позитивов; recall — пойманных из всех настоящих

    // разбор: Precision = TP/(TP+FP) — насколько чисты срабатывания («из тех, кого назвали позитивом, сколько реально позитивы»). Recall = TP/(TP+FN) — насколько полно пойманы настоящие позитивы. Они тянут в разные стороны: агрессивный порог поднимает recall ценой precision. Выбор диктует цена FP против FN.

  4. #classification_metrics4 / 5
    Что такое accuracy (доля правильных ответов)?
    A)Доля правильно предсказанных примеров среди всех примеров
    B)Доля верных среди предсказанных позитивов (это precision)
    C)Средняя абсолютная ошибка регрессионного прогноза модели
    D)Общая площадь под построенной ROC-кривой классификатора на тестовой выборке
    показать ответ и разбор
    +A)Доля правильно предсказанных примеров среди всех примеров

    // разбор: Accuracy = (TP+TN)/всего — доля совпавших предсказаний по всем классам. Метрика проста, но обманчива на дисбалансе: модель, всегда предсказывающая мажоритарный класс, получает высокую accuracy, будучи бесполезной. Там смотрят precision/recall/F1 и PR-AUC.

  5. #classification_metrics5 / 5
    Что показывает матрица ошибок (confusion matrix)?
    A)Общее суммарное число правильных ответов, сведённое к одному итоговому числу
    B)Разбивку на TP, FP, FN, TN — основу precision и recall
    C)Матрицу корреляций между всеми входными признаками модели
    D)Пошаговую динамику лосса классификатора по эпохам обучения
    показать ответ и разбор
    +B)Разбивку на TP, FP, FN, TN — основу precision и recall

    // разбор: Confusion matrix раскладывает предсказания по четырём ячейкам: истинно-положительные (TP), ложно-положительные (FP), ложно-отрицательные (FN), истинно-отрицательные (TN). Из них считаются все метрики классификации (precision, recall, F1) и видно, какого типа ошибки модель делает чаще.

дальше

Теорию прочитали. Навык ставится повторением

В Сеньорчике эта подтема идёт в ежедневных сессиях: движок возвращает её, пока ответы не станут уверенными, и ведёт прогресс отдельно по каждой подтеме. Теория внутри тоже бесплатна, лимит только на количество вопросов в день.