В чем разница между TPR (True Positive Rate) и FPR (False Positive Rate)?

Ответ

TPR (True Positive Rate, Полнота, Recall, Чувствительность) и FPR (False Positive Rate) — это две фундаментальные метрики, оценивающие разные аспекты ошибок бинарного классификатора. Они являются осями для построения ROC-кривой.

Метрика Формула Интерпретация
TPR (Recall) TP / (TP + FN) Какую долю реальных положительных объектов модель правильно нашла?
Высокий TPR означает, что модель редко пропускает целевые случаи (мало False Negatives).
FPR FP / (FP + TN) Какую долю реальных отрицательных объектов модель ошибочно пометила как положительные?
Низкий FPR означает, что модель редко «взывает тревогу» на негативных примерах (мало False Positives).

Практический расчет и интерпретация:

from sklearn.metrics import confusion_matrix

y_true = [1, 0, 1, 1, 0, 0]  # 1 - положительный класс (например, болезнь)
y_pred = [1, 1, 1, 0, 0, 0]  # предсказания модели

# Расчёт матрицы ошибок
tn, fp, fn, tp = confusion_matrix(y_true, y_pred).ravel()

# Расчёт метрик
tpr = tp / (tp + fn)  # = 2 / (2 + 1) ≈ 0.67
fpr = fp / (fp + tn)  # = 1 / (1 + 2) ≈ 0.33

print(f"TPR (Recall): {tpr:.2f}")  # Модель находит 67% всех больных.
print(f"FPR: {fpr:.2f}")           # При этом у 33% здоровых она ошибочно диагностирует болезнь.

Идеальный классификатор имеет TPR = 1 (находит все положительные) и FPR = 0 (не ошибается на отрицательных). На практике мы балансируем между этими метриками, сдвигая порог классификации. ROC-кривая, строящаяся по парам (FPR, TPR), наглядно показывает этот компромисс.

Ответ 18+ 🔞

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

TPR (он же Полнота, Recall, Чувствительность) — это ответ на вопрос: «А не проебал ли я чего важного?». Если проще: из всех реально больных чуваков, сколько моя модель правильно опознала и сказала «да, ты болен»? Если TPR низкий — значит, ты кучу больных отправил домой с миром, а они потом, простите за выражение, сдохнут. Это пиздец как важно, например, в медицине. Высокий TPR — это когда ты почти ни одного реального случая не пропустил.

FPR (Ложноположительная частота) — это уже про другую жопу. Он отвечает на вопрос: «Сколько здоровых людей я, сука, попутал и заставил переживать и тратить деньги на ненужные анализы?». Если FPR высокий — твоя модель истеричка, которая орет «КАРАУЛ!» на каждого второго здорового. Здоровые люди начинают тебя ненавидеть, а врачи тратят время впустую.

Вот смотри на пальцах, ёпта:

Метрика Формула Что значит на человеческом?
TPR (Recall) TP / (TP + FN) Какую кучу реально больных я нашёл?
Если он 1 — ты молодец, всех выцепил. Если 0 — ты слепой крот, нихуя не видишь.
FPR FP / (FP + TN) Сколько здоровых лбов я обосрал понапрасну?
Если он 0 — ты ясновидящий, ни разу не ошибся. Если 1 — ты объявил войну всему здоровому населению, пидарас шерстяной.

А теперь практика, мать его. Вот код, тут всё чётко:

from sklearn.metrics import confusion_matrix

# Допустим, 1 — это больной (пиздец), 0 — здоровый (ура)
y_true = [1, 0, 1, 1, 0, 0]
# А это наша гениальная модель понаделала предсказаний
y_pred = [1, 1, 1, 0, 0, 0]

# Считаем, кто есть кто
tn, fp, fn, tp = confusion_matrix(y_true, y_pred).ravel()

# Считаем наши метрики
tpr = tp / (tp + fn)  # = 2 / (2 + 1) ≈ 0.67
fpr = fp / (fp + tn)  # = 1 / (1 + 2) ≈ 0.33

print(f"TPR (Recall): {tpr:.2f}")  # Нашли 67% больных. Не айс, но жить можно.
print(f"FPR: {fpr:.2f}")           # Обосрали 33% здоровых. Тоже, мягко говоря, **не овердохуища**.

Что в сухом остатке, чувак? Идеальная модель — это TPR = 1 (всех больных засекла) и FPR = 0 (ни одного здорового не задела). В реальности это хуй с горы. Чем выше TPR ты выжимаешь, тем обычно выше лезет и FPR. Вся эта ебушки-воробушки с ROC-кривой как раз про этот вечный компромисс: «Готов ли ты ошибаться на здоровых, лишь бы ни один больной не ушёл?». Выбор за тобой, сам от себя охуей, но теперь-то ты хоть понимаешь, что выбираешь.