Выбор порога классификации по стоимости ложноположительных и ложноотрицательных ошибок
Практическое руководство по выбору порога решения с учётом взвешенных стоимостей ложноположительных и ложноотрицательных ошибок, использующее отложенный валидационный набор и матрицы ошибок scikit-learn.
В этом материале
Короткий ответ
Сравнивайте кандидатные пороги на валидационных данных, используя явные стоимости ошибок. Для гипотетических значений в этом руководстве вариант A имеет четыре ложных срабатывания и одну ложноотрицательную ошибку; вариант B - одну и три. При стоимостях 1 и 5 их итоги равны 9 и 16, поэтому A дешевле среди этих двух вариантов. Это иллюстративный расчёт, а не результат подогнанной модели или доказательство глобально оптимального порога. Сохраняйте итоговые тестовые данные отдельно и оценивайте неопределённость и условия развёртывания.
Разделяйте оценки и решения
Классификатор выдаёт оценку, а порог превращает эту оценку в решение. Для бинарного правила можно определить положительное решение как оценку, большую или равную порогу. Направление оценки и положительный класс должны быть явными. Значение, похожее на вероятность, само по себе не устанавливает, что модель калибрована.
Изменение порога меняет, какие случаи получают положительные и отрицательные решения. Оно не переобучает базовую модель и не делает её вероятности несмещёнными. Обычный отсечка, такой как 0.5, является отправной точкой для оценок вероятности, а не универсальной стоимостно-оптимальной настройкой. Сравнивайте альтернативы с решением, которое действительно нужно принять.
Укажите, какая ошибка дороже
Во многих областях ложноотрицательная ошибка (FN) гораздо более вредна, чем ложноположительная (FP). Стоимостно-чувствительный выбор порога требует, чтобы пользователь присвоил числовые штрафы, например cost(FP)=1 и cost(FN)=5. Эти числа не выводятся из данных; они отражают экспертизу области, регуляторное воздействие или последующие расходы. Когда стоимости фиксированы, общая стоимость для данного порога равна cost(FP)·FP + cost(FN)·FN.
Подсчитайте матрицу ошибок
Матрица ошибок в scikit-learn следует соглашению: строки = истинный класс, столбцы = предсказанный класс. Для бинарных задач с labels=[0,1] элементы: TN = C[0,0], FP = C[0,1], FN = C[1,0], TP = C[1,1]. Используя валидационные оценки и кандидатный порог, можно получить y_pred = (probs >= thr).astype(int), а затем вызвать confusion_matrix(y_val, y_pred, labels=[0,1]).
Сравните два иллюстративных порога
Используйте явно гипотетические значения матрицы ошибок: вариант A имеет FP=4 и FN=1, а вариант B - FP=1 и FN=3. Пусть ложноположительная ошибка стоит одну единицу, а ложноотрицательная - пять единиц. Итог для A равен 1*4 + 5*1 = 9. Итог для B равен 1*1 + 5*3 = 16.
A дешевле среди этих двух построенных вариантов, хотя у B меньше ложноположительных ошибок. Эти значения даны для арифметической иллюстрации; код не обучает классификатор и не получает их из набора данных. Два напечатанных итога ниже являются ожидаемыми результатами, выведенными из формулы, а не наблюдениями из выполненного теста.
cost_fp = 1
cost_fn = 5
fp_a, fn_a = 4, 1
fp_b, fn_b = 1, 3
cost_a = cost_fp * fp_a + cost_fn * fn_a
cost_b = cost_fp * fp_b + cost_fn * fn_b
print("Cost A:", cost_a)
print("Cost B:", cost_b)
Выбирайте на отложенной валидации
Обучите модель на обучающих данных, затем сравнивайте пороги на отдельных валидационных предсказаниях. Не вычисляйте валидационные значения, используя те же наблюдения, которые подогнали модель. Используйте подходящее разбиение для задачи: хронологическая задача может требовать разбиения с учётом времени, а не случайной выборки.
Сам выбор порога использует валидационные результаты, поэтому сообщение о наименьшей наблюдаемой валидационной стоимости может быть оптимистичным. Отдельное разбиение предотвращает прямое повторное использование обучающих примеров для настройки; оно не гарантирует несмещённую оценку или достаточно много положительных случаев. Запишите разбиение, кандидатные пороги, значения классов и предположения о стоимостях, чтобы сравнение можно было интерпретировать.
Держите выбор порога подальше от тестового набора
Заморозьте модель, порог и предварительную обработку перед оценкой на итоговых тестовых данных, которые не использовались для подгонки или выбора порога. Если тестовые результаты заставляют вас настраивать снова, этот образец становится частью процесса выбора и больше не выполняет ту же роль независимой оценки.
Независимый тестовый набор полезен, но не гарантирует производительность в производстве. Маленький образец, непредставительное население или меняющиеся условия могут исказить оценку. Сообщайте наблюдаемые значения, размер выборки и неопределённость, а не называйте единый итог гарантированной или несмещённой производственной стоимостью.
Проверьте распространённость в развёртывании
Распространённость в развёртывании - это доля положительных случаев в населении, где будет использоваться решение. Она может отличаться от валидационной распространённости. Чтобы сравнивать ожидаемые стоимости на случай при предложенной распространённости p, используйте cost_fp*(1-p)*FPR + cost_fn*p*FNR, где FPR - доля отрицательных случаев, классифицированных как положительные, а FNR - доля положительных случаев, классифицированных как отрицательные.
Эта корректировка предполагает, что условные скорости ошибок остаются применимыми при изменённом распределении классов. Она не обрабатывает произвольные изменения в признаках, калибровке или процессе разметки. Для оценки обеих скоростей нужны достаточные наблюдения по обоим классам. Умножение ожидаемой стоимости на случай на предложенное размер популяции даёт итог при этих предположениях; не сравнивайте сырые значения из по-разному размерных популяций, как если бы они были взаимозаменяемы.
Укажите, чего не хватает в сравнении стоимостей
Простая формула стоимости игнорирует несколько реальных факторов: (1) денежную ценность последующих действий (например, дополнительных тестов), (2) неопределённость в оценках стоимостей, (3) потенциальные преимущества раннего обнаружения помимо бинарных результатов и (4) эффект калибровки - оценки вероятности могут быть смещены, из-за чего низкий порог кажется дешевле, чем он есть на самом деле. Эти пропуски следует документировать, и можно выполнить анализ чувствительности, меняя параметры стоимости.
Что проверить
- Явно определите положительный класс и направление оценки.
- Сохраняйте наблюдения для обучения и выбора порога раздельно.
- При labels=[0,1] читайте матрицу ошибок как TN, FP, FN, TP в порядке по строкам.
- Укажите стоимости ложноположительной и ложноотрицательной ошибок, включая их единицы.
- Рассматривайте итоги 9 и 16 как построенные арифметические примеры.
- Сохраняйте итоговые тестовые данные вне выбора порога.
- При корректировке распространённости укажите предположение об условных скоростях ошибок.
Границы применения
В примере используются гипотетические бинарные значения матрицы ошибок и фиксированные стоимости. Он определяет более дешёвый из двух вариантов, а не глобально оптимальный порог. Независимые валидационные или тестовые разбиения не гарантируют несмещённые оценки производства, калиброванные вероятности или устойчивость при изменениях распределения. Реальным развёртываниям нужны репрезентативные данные, анализ неопределённости и обоснованные предположения о стоимостях.