Разбираемся в ML без воды: от базы до Attention. Часть 5: Метрики качества

от автора

В четвертой части мы начали изучение задачи классификации и разобрали метод kNN.

Мы уже дошли до той точки, когда можем построить худо-бедно работающий классификатор. Но если нас спросят: “а насколько хорошо он работает?”,
то максимум, что мы пока сможем ответить — что-то вроде: “ну… на тестовой выборке модель правильно ответила в p% случаев”.

С одной стороны, как гласит древняя пословица: лучше иметь 500 рублей, чем 200. Но гарантирует ли высокий p% качество модели?

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

Accuracy

Во вступлении мы уже обсудили эту метрику. Она показывает долю правильных ответов модели.

Сразу отмечу, что хоть accuracy часто переводят как “точность”, в ML это может приводить к путанице. Поэтому, вместо перевода, будем говорить либо доля правильных ответов, либо просто Accuracy.

Чем он удобен? Accuracy даёт простую и понятную оценку качества модели: он показывает, в каком проценте случаев модель угадала правильный класс. Это хороший базовый ориентир, особенно когда классы в задаче сбалансированы (т.е. имеют примерно одинаковое количество элементов) и ошибки разных типов одинаково важны.

Однако у этой метрики есть серьёзное ограничение — он ничего не говорит о том, какие именно ошибки допускает модель.

Рассмотрим ситуацию со странными идеями стартапов, среди которых 1 из 1000 может оказаться успешной. Если модель всегда будет отвечать “ничего не получится”, её accuracy будет равен 99.9%.
Формально это отличный результат, но практическая польза такой модели сомнительна…

Именно в таких задачах accuracy перестаёт быть полезной метрикой — она скрывает критически важные ошибки, особенно когда классы несбалансированы или цена ошибок различается.

Precision

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

Возвращаясь к примеру со стартапами, precision показывает, какая доля стартапов, которые модель предсказала как успешные, действительно таковыми и являются.

Precision важен в задачах, где мы не хотим, чтобы модель слишком часто «поднимала ложную тревогу». Например, в банковских системах мы вряд ли будем рады модели, которая отменяет каждую вторую транзакцию, считая её мошеннической.

Рассмотрим небольшой пример:

Допустим, у нас есть 100 идей стартапов, из которых только 5 действительно окажутся успешными.

Модель выдала следующий результат:

  • из 5 успешных стартапов она правильно нашла только 3, а оставшиеся 2 посчитала провальными;

  • из 95 провальных стартапов модель правильно отметила 90 как провальные, но ещё 5 ошибочно посчитала успешными.

Тогда:

  • всего модель дала 93 правильных ответа из 100, то есть accuracy равен 93%;

  • успешными модель посчитала 8 стартапов, но реально успешными из них оказались только 3. Значит precision = 3/8 (37.5%)

Несмотря на высокий accuracy, доверять положительным предсказаниям модели всё ещё трудно.

Recall

Recall (или полнота) показывает, какую долю положительных объектов модель смогла найти среди всех действительно положительных объектов.

В нашем примере это доля успешных стартапов, которые модель смогла определить как успешные (в примере таких оказалось 3 из 5, следовательно recall = 60%).

Recall особенно важен в задачах, где критично не пропускать положительные объекты. Например, при поиске заболеваний низкий recall означает, что модель пропускает действительно больных людей.

F-score

У нас возникла одна проблема: precision и recall чуть ли не враждуют друг с другом.

Например, модель может очень редко предсказывать «успешный стартап». Тогда её precision будет высоким — ведь она почти не ошибается. Но recall окажется низким, потому что модель пропустит множество действительно успешных проектов.

И наоборот: если модель начнёт помечать почти всё как успешное, recall вырастет, но precision резко упадёт.

Поэтому на практике часто используют F-score — метрику, которая пытается одновременно учитывать и precision, и recall. В частности F1-score это среднее гармоническое от Precision (P) и Recall (R):

F_1 = \frac{2PR}{P+R}

Заметим, что F1-score будет большим только тогда, когда и precision, и recall достаточно большими одновременно.

Помимо F1, есть её обобщенная версия Fβ-score. Если F1 одинаково чувствителен как к precision так и к recall (формула симметрична относительно P и R), то Fβ ​позволяет вручную регулировать баланс между ними. Вычисляется она таким образом:

F_\beta = (1+\beta)^2 \frac{2PR}{\beta^2 P + R}

Если нам важно сильнее учитывать precision, возьмем \beta < 1. Если важнее recall — \beta > 1.
Если же оба показателя одинаково важны, будем использовать \beta = 1, что соответствует стандартному F1-score.

Таким образом, Fβ позволяет гибко управлять балансом между precision и recall.

Confusion Matrix

До того, как пойти дальше, немного поговорим о той же самой концепции через «четырёх всадников апокалипсиса». Честно говоря, такая интерпретация метрик мне не очень нравится — в ней легко запутаться, но, как говорится, надо Федя, надо…

Представим, что модель — это система, которая выносит приговор каждому объекту: положительный он или отрицательный.

И у каждого такого приговора есть один из четырёх исходов.

TP — True Positive (истинно положительный)

Это случаи, когда модель сказала: “да, это положительный объект”, и оказалась права.
Модель решила, что стартап успешный и он действительно успешный.

FP — False Positive (ложно положительный)

Модель сказала: “это положительный объект”, но ошиблась:
Модель решила, что стартап успешный, но на деле он провальный.

FN — False Negative (ложно отрицательный)

Модель сказала: “это отрицательный объект”, но ошиблась.
Модель решила, что стартап провальный, хотя он на самом деле успешный.

TN — True Negative (истинно отрицательный)

Модель правильно определила отрицательный класс.
Стартап признан провальным и он действительно провальный.

Маленький гайд запомнить
  • True (T) — модель оказалась права.

  • False (F) — модель ошиблась.

  • Positive (P) — модель отнес объект в положительный класс (класс 1)

  • Negative (N) — модель отнес объект в отрицательный класс (класс 0)

Например:

TP: T — модель права, потому что P — отнесла объект в положительный класс
FN: F — модель ошиблась, потому что N — отнесла объект в отрицательный класс

Оказывается, что все метрики, которые мы обсуждали раньше — это просто разные способы смотреть на эти четыре числа:

Accuracy = \frac{TP+TN}{TP+TN+FP+FN}Precision = \frac{TP}{TP+FP}Recall = \frac{TP}{TP+FN}

Также, можно раскрыть формулу для F1-score

F_1 = \frac{2TP}{2TP +FP + FN}

Интересно, что TN не участвует в F1-score, поэтому эта метрика не зависит от количества правильно классифицированных отрицательных объектов.
Из-за этого F1 особенно полезен в задачах с дисбалансом классов, когда положительный класс встречается редко и именно качество его определения наиболее важно.

В таких задачах нас интересует не то, насколько хорошо модель угадывает «всё подряд», а то, насколько хорошо она находит редкие, но важные случаи — например, заболевания или мошеннические транзакции.

Precision-Recall (PR) curve

На практике большинство моделей выдают не класс, а вероятность принадлежности к положительному классу.

Мы же выбираем порог (threshold): например, если вероятность больше 0.5 — считаем объект положительным, иначе отрицательным.

Здесь появляется важная идея: если менять этот порог, будут меняться и precision, и recall.

  • при большом пороге модель почти ничего не помечает как положительное․ precision получается большим, а recall — маленьким

  • при уменьшении порога модель помечает всё больше объектов как положительное, следовательно, recall растает, precision падает

Если для каждого значения порога посчитать precision и recall, а затем отложить их друг относительно друга, мы получим Precision–Recall curve (PR-кривую).

пример PR кривой

пример PR кривой

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

ROC-curve

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

ROC(receiver operating characteristic)-кривая, в свою очередь, смотрит на задачу более “симметрично” — учитывая поведение модели сразу на обоих классах. Она показывает, как меняется способность модели находить положительные объекты при росте числа ложных срабатываний.

Чтобы понять ROC-кривую, введём две величины: TPR и FPR (True Positive Rate и False Positive Rate):

TPR показывает, какую долю действительно положительных объектов модель смогла найти.
По сути, это уже знакомый нам recall:

TPR = \frac{TP}{TP+FN}

FPR показывает, какую долю отрицательных объектов модель ошибочно отнесла к положительным:

FPR = \frac{FP}{FP+TN}

Как и в случае с PR кривой, мы меняем порог (threshold) и для каждого его значения считаем TPR и FPR. Далее, если нарисовать график где по оси X будет FPR, а по оси Y — TPR, можно получить ROC-кривую.

пример ROC кривой

пример ROC кривой

Как с этим работать:

  • Чем ближе кривая к левому верхнему углу (точка (0, 1)), тем лучше модель. Это означает, что модель успешно находит положительные объекты (высокий TPR) и при этом почти не создаёт ложных срабатываний (низкий FPR).

  • Если кривая резко уходит вправо и вниз, это говорит о том, что модель начинает сильно ошибаться на отрицательных объектах при попытке находить больше положительных.

  • Диагональ (линия от (0,0) до (1,1)) соответствует случайной модели — такой, которая не умеет различать классы и фактически «угадывает».

ROC-AUC

ROC-кривая показывает, как модель балансирует между TPR и FPR при разных порогах.

Но сам график неудобно использовать для сравнения моделей — потому что это не одно число, а целая кривая.

Чтобы упростить сравнение, используют ROC-AUC (Area Under Curve) — площадь под ROC-кривой.
Полученное число показывает насколько «хорошо в среднем» модель отделяет положительные объекты от отрицательных при всех возможных порогах.

Интерпретировать его можно таким образом։

  • AUC = 1 → идеальная модель (полное разделение классов)

  • AUC = 0.5 → случайная модель (как подбрасывание монетки)

  • AUC < 0.5 → модель хуже случайной (лайфхак: просто перевернуть предсказания и получить нормальную модель)

Заключение

Теперь если нас спросят: “а насколько хорошо работает твой классификатор?” — мы уже не ограничиваемся одной цифрой вроде accuracy.
Мы поняли, что качество модели — это многогранная вещь, и его можно рассматривать с разных сторон:

  • через confusion matrix и базовые ошибки (TP, FP, FN, TN);

  • через precision и recall, которые показывают разные типы ошибок;

  • через F-score, который балансирует между ними;

  • через PR-кривую, которая показывает компромисс между precision и recall;

  • через ROC-кривую, которая учитывает поведение модели на обоих классах;

  • и через ROC-AUC, который сводит всё это в одно число․

И главное, что стоит запомнить: не существует одной правильной метрики качества. Есть только разные способы измерить разные типы ошибок. И выбрать нужно тот, который соответствует задаче.

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

ссылка на оригинал статьи https://habr.com/ru/articles/1038730/