Чем ROC-AUC лучше accuracy?

Ответ

ROC-AUC является более информативной и надежной метрикой, чем accuracy, по нескольким ключевым причинам:

  1. Независимость от порога классификации: Accuracy оценивает качество бинарных предсказаний (0 или 1) при одном, часто произвольно выбранном пороге (обычно 0.5). ROC-AUC же оценивает способность модели разделять классы по всем возможным порогам, что дает более полную картину.
  2. Устойчивость к несбалансированным данным: На сильно несбалансированных выборках (например, 99% негативных, 1% позитивных) accuracy вводит в заблуждение. Модель, всегда предсказывающая мажоритарный класс, получит accuracy 99%, но будет бесполесной. ROC-AUC корректно оценит, что модель не умеет разделять классы.
  3. Оценка вероятностей: ROC-AUC работает с вероятностями (y_score), а не с жесткими предсказаниями, что позволяет сравнивать модели на более глубоком уровне.

Наглядный пример:

import numpy as np
from sklearn.metrics import accuracy_score, roc_auc_score

# Сильно несбалансированные данные
n_samples = 1000
y_true = np.array([0] * 990 + [1] * 10)  # 1% положительных

# Модель-«угадыватель», всегда предсказывающая 0
y_pred = np.zeros(n_samples)
y_proba = np.random.uniform(0, 0.1, n_samples)  # Случайные низкие вероятности

print("Accuracy (всегда 0):", accuracy_score(y_true, y_pred))  # 0.99 - отличный, но ложный результат
print("ROC-AUC (случайные вероятности):", roc_auc_score(y_true, y_proba))  # ~0.5 - показывает отсутствие разделения

Таким образом, ROC-AUC — это метрика разделимости классов, в то время как accuracy — это метрика правильности классификации при конкретном пороге.

Ответ 18+ 🔞

А, ну вот, опять про эти метрики! Слушай, давай разберёмся, почему все так помешаны на этом ROC-AUC, а на accuracy смотрят как на мартышку с гранатой — вроде и есть, но доверия к ней ноль ебать.

Представь себе такую хуйню. Accuracy — это как твой строгий дед, который оценивает результат по принципу «или пан, или пропал». Он смотрит на твои предсказания (ноль или единица, да или нет) при каком-то одном, часто взятом с потолка, пороге. Обычно это 0.5. И говорит: «Ага, тут правильно, тут нет. Вот тебе цифра». Но это, ёпта, как оценивать машину только по тому, заводится она или нет. А то, что она бензин хавает как не в себя, едет только на первой передаче и руль бьёт — это accuracy похуй. Ему главное — завелась? Завелась. Значит, accuracy 100%. Пиздец, да?

А ROC-AUC — это уже другой подход, более хитрая жопа. Он не смотрит на один конкретный порог. Он оценивает твою модель по всем возможным порогам, от нуля до единицы. Он смотрит, насколько хорошо твоя модель вообще умеет разделять котов от собак, хороших клиентов от плохих, больных от здоровых. Это как проверить ту же машину на всех передачах, на разной скорости, в горку и под горку. Картина сразу полная вырисовывается, а не урывками.

Вот смотри, главный подвох — несбалансированные данные. Это когда у тебя, например, 990 здоровых и 10 больных. Accuracy тут превращается в полную пиздопроебибну. Модель, которая тупо всем ставит метку «здоров», получит accuracy 99%! Дед accuracy скажет: «О, гений!». А на деле модель — просто тупой отражатель большинства, она нихуя не умеет находить больных. ROC-AUC же сразу раскусит эту лажу и покажет тебе цифру около 0.5, что означает «чувак, твоя модель работает не лучше, чем подброшенная монетка». Вот и вся магия.

Ну и последний гвоздь в крышку гроба accuracy — ROC-AUC работает с вероятностями, а не с дубовыми «да/нет». Ему подавай y_proba, эти самые сочные числа от 0 до 1, которые показывают, насколько модель уверена. Это позволяет сравнивать модели на гораздо более тонком уровне. Какая модель даёт более «калиброванные» и уверенные вероятности? Accuracy тебе про это нихуя не скажет.

Вот, смотри на код, тут всё как на ладони:

import numpy as np
from sklearn.metrics import accuracy_score, roc_auc_score

# Данные, где всё хуёво сбалансировано. 1% одних, 99% других.
n_samples = 1000
y_true = np.array([0] * 990 + [1] * 10)  # 990 здоровых, 10 больных

# Наша модель-придурок, которая всем ставит 0 (здоров)
y_pred = np.zeros(n_samples)
# И вероятности от неё — просто рандомные низкие числа
y_proba = np.random.uniform(0, 0.1, n_samples)

print("Accuracy (тупая модель):", accuracy_score(y_true, y_pred))  # Выведет 0.99. Вообще охуенно!
print("ROC-AUC (случайные вероятности):", roc_auc_score(y_true, y_proba))  # Выведет ~0.5. Полный швах!

Видишь разницу? Accuracy орёт «Ура! 99%!», а ROC-AUC спокойно так говорит: «Да похуй, мудила, твоя модель нихуя не разделяет классы, результат как у обезьяны с дартсом».

Короче, резюмирую, чтобы в голове отложилось:

  • ROC-AUC — это метрика «разделимости классов». Она отвечает на вопрос: «Насколько хорошо модель отличает одно от другого ВООБЩЕ?».
  • Accuracy — это метрика «правильности классификации» при каком-то ОДНОМ, часто случайном, пороге. Она отвечает на вопрос: «Сколько раз модель угадала именно при ЭТИХ настройках?».

Так что когда в следующий раз будешь смотреть на accuracy в 99%, первым делом спроси: «А данные-то сбалансированные?». А то охуеешь потом, когда твоя «гениальная» модель в реальности окажется просто тупым угадывателем.