Какие есть методы выбора threshold по ROC кривой?
Что проверяют
Понимаете ли вы, что ROC-кривая и AUC оценивают модель сразу на всех порогах, а рабочий порог выбирается под задачу. Следом обычно спрашивают, что делать при сильном дисбалансе классов и на каких данных порог подбирать.
Как отвечать
Напомните основу: каждая точка ROC это пара FPR и TPR при одном пороге, в scikit-learn их вместе с массивом порогов возвращает roc_curve(y_true, y_score). Методы выбора:
- индекс Юдена:
J = TPR - FPR, берётся порог с максимумом. Геометрически это точка, дальше всего отстоящая от диагонали. Метод молча считает, что оба типа ошибок одинаково дороги; - ближайшая к углу (0, 1) точка: минимизируется расстояние
sqrt(FPR**2 + (1 - TPR)**2). Часто даёт результат, близкий к Юдену; - ограничение на одну ошибку: например, максимальный TPR при FPR не выше 1%. Типично для антифрода и скоринга, где число ложных тревог упирается в ресурсы ручной проверки;
- минимизация стоимости: задаются цены ошибок
C_FPиC_FN, по всем порогам считаетсяC_FP * FP + C_FN * FN. Самый честный вариант, если бизнес может назвать эти цены; - равенство чувствительности и специфичности: точка, где
TPR = 1 - FPR.
Начиная с scikit-learn 1.5 есть TunedThresholdClassifierCV, который подбирает порог кросс-валидацией под заданную метрику. При дисбалансе дополнительно смотрите PR-кривую: на редком положительном классе ROC выглядит оптимистично, потому что FPR делится на огромное число отрицательных примеров.
Где спотыкаются
Подбирают порог на тестовой выборке и там же отчитываются о качестве. Оценка получается смещённой: порог выбирают на валидации или по фолдам, а тест трогают один раз.
Говорят, что F1 оптимизируют по ROC-кривой. F1 зависит от precision, которой на ROC нет, её подбирают по PR-кривой или прямым перебором порогов.
Оставляют порог 0.5 по умолчанию для модели с неоткалиброванными вероятностями или после undersampling. Такое число ничего не значит, пока вероятности не откалиброваны, например через CalibratedClassifierCV.