Ответ
ROC-AUC (Area Under the Receiver Operating Characteristic Curve) и PR-AUC (Area Under the Precision-Recall Curve) — это метрики для оценки бинарных классификаторов, но они измеряют разные аспекты производительности модели.
| Метрика | Что оценивает | Чувствительность к дисбалансу | Типичное применение |
|---|---|---|---|
| ROC-AUC | Соотношение True Positive Rate (Recall) и False Positive Rate при варьировании порога классификации. | Низкая. Остается стабильной даже при сильном дисбалансе классов. | Общие задачи классификации, где оба класса примерно равнозначны (например, определение спама). |
| PR-AUC | Соотношение Precision (точности) и Recall (полноты). | Высокая. Резко падает, если модель плохо предсказывает редкий класс. | Задачи с сильным дисбалансом, где важен редкий класс (например, обнаружение мошенничества, медицинская диагностика). |
Почему это важно? В задачах с дисбалансом (например, 99% негативных и 1% позитивных примеров) высокий ROC-AUC может вводить в заблуждение, так как модель, всегда предсказывающая негативный класс, все равно будет иметь низкий FPR. PR-AUC в такой ситуации сразу покажет низкое качество, так как Precision для редкого класса будет нулевым.
Пример на Python:
from sklearn.metrics import roc_auc_score, average_precision_score
import numpy as np
# Имитация предсказаний модели и истинных меток
y_true = np.array([0, 1, 0, 1, 0, 0, 0, 1]) # Сильный дисбаланс
# Модель уверенно предсказывает негативный класс, но иногда ошибается с позитивным
y_scores = np.array([0.1, 0.9, 0.2, 0.8, 0.05, 0.15, 0.1, 0.7])
roc_auc = roc_auc_score(y_true, y_scores)
pr_auc = average_precision_score(y_true, y_scores)
print(f"ROC-AUC: {roc_auc:.3f}") # Может быть относительно высоким
print(f"PR-AUC: {pr_auc:.3f}") # Будет значительно ниже, что лучше отражает проблему
Вывод: Выбирайте PR-AUC, когда критически важно правильно находить объекты редкого класса и минимизировать ложные срабатывания.
Ответ 18+ 🔞
Давай разжую тебе эту тему, как будто объясняю за стопкой чая после тяжёлого дебага. Смотри, есть две главные метрики для бинарной классификации: ROC-AUC и PR-AUC. Они как два соседа по гаражу — оба про машины, но один тебе про расход топлива будет три часа рассказывать, а второй сразу в лоб: «Жрёт бензина дохуя, не бери».
ROC-AUC — это классика, старая добрая метрика. Она смотрит, как соотносятся правильно найденные позитивные случаи (True Positive Rate) и ложные срабатывания (False Positive Rate), когда ты крутишь порог отсечения. Её главный плюс — она спокойная, как удав. Даже если у тебя в данных один позитивный пример на тысячу негативных (дисбаланс ебаный), ROC-AUC может оставаться высокой и создавать иллюзию, что всё окей. Это как если бы ты оценивал работу сторожа, который спит всю ночь, а утром говорит: «Ну я же никого не впустил!» — техника-то не сработала ни разу, но и ложных тревог не было. Доверия к ней в таких случаях — ноль ебать.
А вот PR-AUC — это уже хитрая жопа. Она не на FPR смотрит, а на связку Precision (точность) и Recall (полнота). Precision — это из всех, кого ты назвал мошенниками, сколько реально ими оказались. Recall — это из всех реальных мошенников, скольких ты смог выцепить. PR-AUC оценивает площадь под кривой, которая строится из этих двух величин. И вот тут-то вся соль: если твой редкий класс (те самые мошенники или больные) модель предсказывает хреново, PR-AUC тут же об этом кричит, падая ниже плинтуса. Она не даст тебе уснуть с мыслью, что модель хороша, когда она просто всех помечает как «нормальных».
Короче, запомни как «Отче наш»:
- ROC-AUC — когда классы более-менее сбалансированы. Типа отличить котиков от собачек.
- PR-AUC — когда у тебя дисбаланс овердохуища и редкий класс — это святое. Обнаружение аномалий, мошенничества, редких болезней — вот её вотчина.
Вот тебе кусок кода, чтобы совсем всё стало на свои места:
from sklearn.metrics import roc_auc_score, average_precision_score
import numpy as np
# Допустим, у нас 95% транзакций нормальные, а 5% — мошеннические. Дисбаланс.
y_true = np.array([0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0]) # Куча нулей, пара единиц
# Пусть модель в целом неплоха, но с редким классом тупит
y_scores = np.array([0.1, 0.85, 0.2, 0.7, 0.05, 0.1, 0.15, 0.1, 0.2, 0.1, 0.08, 0.12])
roc_auc = roc_auc_score(y_true, y_scores)
pr_auc = average_precision_score(y_true, y_scores)
print(f"ROC-AUC: {roc_auc:.3f}") # Может быть 0.85 и ты подумаешь — огонь!
print(f"PR-AUC: {pr_auc:.3f}") # А тут будет 0.65, и станет ясно, что с редким классом — беда.
Видишь разницу? ROC-AUC может быть прилично высоким, создавая ложное ощущение успеха. А PR-AUC бьёт в колокол: «Э, дружок-пирожок, с обнаружением мошенничества у тебя пока хреново, нужно ещё поработать!».
Так что не ведись на высокий ROC-AUC, когда работаешь с несимметричными данными. Всегда смотри на PR-AUC, это твой индикатор реальной способности модели вылавливать те самые редкие, но важные случаи. Иначе получится, что ты построил модель, которая всех объявляет здоровыми, и рапортуешь о 99% точности, пока реальные больные ходят и заражают всех вокруг. Пиздец, а не результат.