Ответ
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 — метрика для оценки ранжирования. Она может быть слегка оптимистичной, особенно если у тебя данные — просто овердохуища одних нулей и капля единиц. Модель может хорошо разделять, но при этом на конкретном пороге ты всё равно будешь всех в ноль записывать. Так что если тебе важна точность предсказания именно редкого класса — смотри ещё на другие метрики, не зацикливайся на одной этой площади.
Короче, суть в том, чтобы твои вероятности для настоящих единиц были правее и выше, чем для нулей. Всё остальное — технические детали.