В четвертой части мы начали изучение задачи классификации и разобрали метод 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 () и Recall (
):
Заметим, что F1-score будет большим только тогда, когда и precision, и recall достаточно большими одновременно.
Помимо F1, есть её обобщенная версия Fβ-score. Если F1 одинаково чувствителен как к precision так и к recall (формула симметрична относительно P и R), то Fβ позволяет вручную регулировать баланс между ними. Вычисляется она таким образом:
Если нам важно сильнее учитывать precision, возьмем . Если важнее recall —
.
Если же оба показателя одинаково важны, будем использовать , что соответствует стандартному 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 – отнесла объект в отрицательный класс
Оказывается, что все метрики, которые мы обсуждали раньше — это просто разные способы смотреть на эти четыре числа:
Также, можно раскрыть формулу для F1-score
Интересно, что TN не участвует в F1-score, поэтому эта метрика не зависит от количества правильно классифицированных отрицательных объектов.
Из-за этого F1 особенно полезен в задачах с дисбалансом классов, когда положительный класс встречается редко и именно качество его определения наиболее важно.
В таких задачах нас интересует не то, насколько хорошо модель угадывает “всё подряд”, а то, насколько хорошо она находит редкие, но важные случаи — например, заболевания или мошеннические транзакции.
Precision-Recall (PR) curve
На практике большинство моделей выдают не класс, а вероятность принадлежности к положительному классу.
Мы же выбираем порог (threshold): например, если вероятность больше 0.5 — считаем объект положительным, иначе отрицательным.
Здесь появляется важная идея: если менять этот порог, будут меняться и precision, и recall.
-
при большом пороге модель почти ничего не помечает как положительное․ precision получается большим, а recall — маленьким
-
при уменьшении порога модель помечает всё больше объектов как положительное, следовательно, recall растает, precision падает
Если для каждого значения порога посчитать precision и recall, а затем отложить их друг относительно друга, мы получим Precision–Recall curve (PR-кривую).
Чем ближе кривая к правому верхнему углу, тем лучше модель (высокие precision и recall). Резкое падение кривой говорит о плохом балансе ошибок, а низкое положение — о слабой разделяющей способности модели.
ROC-curve
Несмотря на свою наглядность, PR-кривая не является идеальным инструментом оценки.
Её главный минус в том, что она ничего не говорит о том, насколько хорошо модель различает отрицательный класс. Такая фокусировка на положительном классе особенно полезна в задачах с сильным дисбалансом, но иногда этого недостаточно для полного понимания поведения модели.
ROC(receiver operating characteristic)-кривая, в свою очередь, смотрит на задачу более “симметрично” — учитывая поведение модели сразу на обоих классах. Она показывает, как меняется способность модели находить положительные объекты при росте числа ложных срабатываний.
Чтобы понять ROC-кривую, введём две величины: TPR и FPR (True Positive Rate и False Positive Rate):
TPR показывает, какую долю действительно положительных объектов модель смогла найти.
По сути, это уже знакомый нам recall:
FPR показывает, какую долю отрицательных объектов модель ошибочно отнесла к положительным:
Как и в случае с PR кривой, мы меняем порог (threshold) и для каждого его значения считаем TPR и FPR. Далее, если нарисовать график где по оси X будет FPR, а по оси Y — TPR, можно получить 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, который сводит всё это в одно число․
И главное, что стоит запомнить: не существует одной правильной метрики качества. Есть только разные способы измерить разные типы ошибок. И выбрать нужно тот, который соответствует задаче.
Теперь, когда мы узнали про метрики оценивания, в следующей части спокойно перейдём к логистической регрессии и посмотрим, как модели уже начинают не просто оцениваться, а обучаться на данных.
Автор: ysrgsyn


