На основе каких данных вычисляется ROC AUC?

Ответ

ROC AUC (Area Under the Receiver Operating Characteristic Curve) вычисляется на основе предсказанных вероятностей принадлежности к положительному классу и истинных бинарных меток (0 или 1).

Ключевые моменты:

  • Вход: Вектор вероятностей y_score (например, [0.1, 0.9, 0.8, 0.3, 0.7]) и вектор истинных меток y_true (например, [0, 1, 1, 0, 1]).
  • Процесс: Метрика оценивает способность модели ранжировать объекты — вероятность для реально положительных объектов должна быть выше, чем для отрицательных. AUC — это площадь под кривой, которая строится по точкам (FPR, TPR) при варьировании порога классификации.
  • Интерпретация:
    • AUC = 1.0: Идеальное разделение.
    • AUC = 0.5: Модель не лучше случайного угадывания.
    • AUC < 0.5: Модель работает хуже случайной (но можно инвертировать предсказания).

Пример вычисления с помощью scikit-learn:

from sklearn.metrics import roc_auc_score

y_true = [0, 1, 1, 0, 1]
y_scores = [0.1, 0.9, 0.8, 0.3, 0.7] # Вероятности класса 1

auc_score = roc_auc_score(y_true, y_scores)
print(f"ROC AUC: {auc_score:.3f}") # Пример вывода: 0.833

Важно: ROC AUC оценивает качество ранжирования, а не конкретные предсказания, и может быть оптимистичной для сильно несбалансированных данных, где важна точность предсказания миноритарного класса.

Ответ 18+ 🔞

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

Короче, смотри. Представь, что твоя модель не просто тыкает пальцем в небо, а выдаёт каждому объекту вероятность того, что он принадлежит к «хорошему» классу (класс 1). Вот этот вектор вероятностей — это и есть y_score. А y_true — это реальность, суровая правда жизни, где каждый объект помечен либо 0, либо 1.

В чём прикол-то? Вся соль не в том, чтобы угадать с точностью до миллионной доли, а в том, чтобы правильно ранжировать. То есть, если взять реально положительный объект (класс 1) и реально отрицательный (класс 0), то у первого вероятность должна быть выше, чем у второго. Чем чаще это правило выполняется — тем модель круче. ROC AUC как раз и меряет, насколько хорошо модель это делает. Площадь под кривой, ёпта. Если площадь максимальная (равна 1) — ты бог ранжирования. Если 0.5 — ты как обезьяна с дартсом, просто кидаешь наугад. Ну а если меньше 0.5 — это вообще пиздец, у тебя всё наоборот, но можно просто инвертировать предсказания и сделать вид, что так и задумано.

Примерчик, чтобы вообще всё встало на свои места: Смотри, как это в коде выглядит. Проще простого.

from sklearn.metrics import roc_auc_score

# Вот реальные метки: ноль, единица, единица, ноль, единица.
y_true = [0, 1, 1, 0, 1]
# А вот что наша модель надумала: вероятности, что объект — единица.
y_scores = [0.1, 0.9, 0.8, 0.3, 0.7]

# Считаем одним махом.
auc_score = roc_auc_score(y_true, y_scores)
print(f"ROC AUC: {auc_score:.3f}")  # Выведет что-то типа 0.833

Видишь? Ничего сложного. Модель сказала, что у второго объекта вероятность быть единицей — 0.9, и он реально единица. У первого — всего 0.1, и он ноль. В целом ранжирование неплохое, вот AUC и получился высокий.

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

Короче, суть в том, чтобы твои вероятности для настоящих единиц были правее и выше, чем для нулей. Всё остальное — технические детали.