Как подбирается threshold и какой критерий выбирается?
Что проверяют
Понимаете ли вы, что порог 0.5 это не свойство модели, а решение, которое принимают под цену ошибок. Интервьюер ждёт, что вы свяжете выбор порога с бизнес-ограничением и назовёте, на каких данных его подбирать. Следом часто спрашивают, что делать, когда распределение данных поменялось.
Как отвечать
Модель выдаёт скор, а predict у большинства бинарных классификаторов scikit-learn фактически сравнивает вероятность с 0.5. Порог подбирают отдельно, на валидации или out-of-fold предсказаниях, но не на тесте. Критерий зависит от задачи:
- стоимость ошибок: если известна цена ложного срабатывания и пропуска, минимизируйте ожидаемые потери. Самый честный вариант, когда цены удаётся посчитать;
- ограничение: «полнота не ниже 0.9 при максимальной точности» или «не больше 500 алертов в день, столько успевает разобрать команда». Второе по сути top-K по скору;
- F-beta: максимум F1 при равной важности точности и полноты, F2 при большей важности полноты;
- J Юдена: точка ROC-кривой с максимальной разницей TPR и FPR. Удобна для сбалансированных классов, при сильном дисбалансе полезнее PR-кривая.
Инструменты: precision_recall_curve и roc_curve возвращают метрики по всем порогам. В свежих версиях scikit-learn есть TunedThresholdClassifierCV, который подбирает порог кросс-валидацией под заданную метрику, и FixedThresholdClassifier для заданного вручную значения.
Два уточнения. Если скор трактуют как вероятность, сначала проверьте калибровку и при необходимости используйте CalibratedClassifierCV. И порог устаревает: при смене доли положительного класса или дрейфе признаков его пересматривают по свежим данным.
Где спотыкаются
Подбирают порог на тестовой выборке и там же отчитываются метрикой. Оценка получается завышенной.
Пытаются улучшить ROC AUC сдвигом порога. AUC от порога не зависит, меняются только точность, полнота и их баланс.
Выбирают «оптимальную точку» без привязки к продукту. Порог, который максимизирует F1, может давать больше алертов, чем способна обработать команда.