Ответ
ROC-кривая (Receiver Operating Characteristic) строится на основе двух метрик, которые вычисляются для различных пороговых значений вероятности, выдаваемых классификатором.
Ключевые формулы:
- True Positive Rate (TPR), она же Recall (Полнота):
TPR = TP / (TP + FN)- Показывает, какую долю реальных положительных объектов модель правильно идентифицировала.
- False Positive Rate (FPR):
FPR = FP / (FP + TN)- Показывает, какую долю реальных отрицательных объектов модель ошибочно классифицировала как положительные.
Кривая представляет собой график TPR (по оси Y) от FPR (по оси X). Идеальная модель проходит через точку (0,1), где FPR=0, а TPR=1.
Практический пример построения на Python:
from sklearn.metrics import roc_curve
import matplotlib.pyplot as plt
# y_true - истинные метки, y_score - предсказанные вероятности положительного класса
fpr, tpr, thresholds = roc_curve(y_true, y_score)
plt.figure(figsize=(8, 6))
plt.plot(fpr, tpr, label='Our Model (AUC = %0.3f)' % auc(fpr, tpr))
plt.plot([0, 1], [0, 1], 'k--', label='Random Classifier')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('ROC Curve')
plt.legend()
plt.grid(True)
plt.show() Ответ 18+ 🔞
А, ну это ж классика, ёпта! ROC-кривая, блядь. Сидишь такой, модель натренировал, а она тебе выдает не просто "да" или "нет", а какие-то вероятности, типо "ну на 73% это котик, а на 27% — говно". И что с этими процентами делать, а? Вот тут-то она, хитрая жопа, и начинается.
Смотри, чтобы понять, не сосалка ли твоя модель, нужно посмотреть на две главные штуки. Их, блядь, даже формулы есть, но не пугайся, там всё просто, как три копейки.
Первая — TPR, или "Полнота". Это когда модель правильно ловит всех, кого нужно было поймать. Формула: TPR = TP / (TP + FN). Говоря человеческим языком: из всех реальных котиков, сколько штук твоя обалдуйка-модель котиками и назвала. Если пропустила — пиши пропало, полнота хуёвая.
Вторая — FPR, "Ложное срабатывание". Вот это уже весёлое. Формула: FPR = FP / (FP + TN). Это когда твоя нейросеть, ебанько, начинает видеть котиков в каждом говне. Берёт старую калошу, а говорит: "О! Котик! Пушистый!". Вот это вот и есть FPR — сколько мусора она приняла за цель.
А ROC-кривая — это, блядь, такой график, где по одной оси эта самая доля ложных тревог (FPR), а по другой — доля правильных попаданий (TPR). И строится он для кучи разных порогов. То есть, сначала ты говоришь: "Всё, что больше 50% вероятности — котик". Считаешь TPR и FPR. Потом: "Всё, что больше 60% — котик". Опять считаешь. И так далее, от 0 до 100. И всё это на график.
Идеальная модель, ядрёна вошь, должна сидеть в левом верхнем углу: FPR = 0 (ни одной калоши не приняла за котика), TPR = 1 (всех реальных котиков нашла). А полный распиздяй, который тыкает пальцем в небо, будет идти по диагонали из нуля в единицу. Это как гадалка — угадает с вероятностью 50 на 50.
Ну а на практике в питоне это выглядит как-то так:
from sklearn.metrics import roc_curve
import matplotlib.pyplot as plt
# y_true - истинные метки, y_score - предсказанные вероятности положительного класса
fpr, tpr, thresholds = roc_curve(y_true, y_score)
plt.figure(figsize=(8, 6))
plt.plot(fpr, tpr, label='Our Model (AUC = %0.3f)' % auc(fpr, tpr))
plt.plot([0, 1], [0, 1], 'k--', label='Random Classifier')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('ROC Curve')
plt.legend()
plt.grid(True)
plt.show()
Запустишь этот код — и увидишь всю правду. Если твоя кривая полезла вверх и влево, почти к тому самому углу (0,1) — ты молодец, чувак, модель огонь. Если она прилипла к диагонали — ну, что сказать... доверия ебать ноль, иди учи данные заново собирать. Вот и вся магия, ебать копать.