3.3. Настройка порога принятия решения для предсказания класса
Классификация лучше всего разделена на две части:
- статистическая задача обучения модели для предсказания, в идеале, вероятностей класса;
- задача принятия решения о конкретном действии на основе этих предсказаний вероятностей.
Рассмотрим простой пример, связанный с прогнозированием погоды: первый пункт относится к ответу на вопрос «какова вероятность дождя завтра?», а второй пункт относится к ответу на вопрос «нужно ли мне взять зонт завтра?».
Что касается API scikit-learn, то первый пункт решается путем предоставления оценок с использованием predict_proba или decision_function. Первый возвращает оценки условных вероятностей \(P(y|X)\) для каждого класса, а второй возвращает оценку решения для каждого класса.
Решение, соответствующее меткам, получается с помощью predict. В бинарной классификации правило принятия решения или действие затем определяются порогом оценок, что приводит к предсказанию единственной метки класса для каждого образца. В бинарной классификации в scikit-learn предсказания меток класса получаются с помощью жестко заданных пороговых правил: класс положительного предсказывается, когда условная вероятность \(P(y|X)\) больше 0,5 (получена с помощью predict_proba) или если оценка решения больше 0 (получена с помощью decision_function).
Здесь мы покажем пример, который иллюстрирует взаимосвязь между оценками условных вероятностей \(P(y|X)\) и метками класса:
>>> from sklearn.datasets import make_classification
>>> from sklearn.tree import DecisionTreeClassifier
>>> X, y = make_classification(random_state=0)
>>> classifier = DecisionTreeClassifier(max_depth=2, random_state=0).fit(X, y)
>>> classifier.predict_proba(X[:4])
array([[0.94 , 0.06 ],
[0.94 , 0.06 ],
[0.0416..., 0.9583...],
[0.0416..., 0.9583...]])
>>> classifier.predict(X[:4])
array([0, 0, 1, 1])
Хотя эти жестко заданные правила могут на первый взгляд показаться разумными как поведение по умолчанию, они, безусловно, не являются идеальными для большинства случаев использования. Давайте проиллюстрируем это на примере.
Рассмотрим ситуацию, когда предсказательная модель используется для помощи врачам в обнаружении опухолей. В этой ситуации врачи, скорее всего, будут заинтересованы в выявлении всех пациентов с раком и не пропущении ни одного, чтобы они могли предоставить им правильное лечение. Другими словами, врачи отдают приоритет достижению высокой точности. Эта ориентация на точность, конечно, связана с компромиссом, заключающимся в потенциально большем количестве ложноположительных предсказаний, что снижает точность модели. Это риск, на который готовы пойти врачи, потому что стоимость пропущенного рака намного выше, чем стоимость дальнейших диагностических тестов. Поэтому, когда речь идет о том, следует ли классифицировать пациента как больного раком или нет, может быть более целесообразно классифицировать его как больного раком, когда оценка условной вероятности намного ниже 0,5.
3.3.1. Настройка порога принятия решения после обучения
Одним из решений проблемы, поставленной во введении, является настройка порога принятия решения классификатора после обучения модели. TunedThresholdClassifierCV настраивает этот порог с помощью внутренней перекрестной проверки. Оптимальный порог выбирается для максимизации заданного метрики.
На рисунке ниже показана настройка порога принятия решения для классификатора градиентного бустинга. Хотя классификатор по умолчанию и настроенный классификатор обеспечивают одинаковые значения predict_proba и, следовательно, одни и те же кривые ROC и Precision-Recall, предсказания меток класса отличаются из-за настроенного порога принятия решения. Классификатор по умолчанию предсказывает интересующий класс при условной вероятности больше 0,5, а настроенный классификатор предсказывает интересующий класс при очень низкой вероятности (около 0,02). Этот порог принятия решения оптимизирует метрику полезности, определенную бизнесом (в данном случае страховой компанией).
3.3.1.1. Варианты настройки порога принятия решения
Порог принятия решения можно настроить с помощью различных стратегий, управляемых параметром scoring.
Один из способов настройки порога - максимизация предварительно определенной метрики scikit-learn. Эти метрики можно найти, вызвав функцию get_scorer_names. По умолчанию используется сбалансированная точность, но следует выбрать осмысленную метрику для конкретного случая использования.
Примечание
Важно отметить, что эти метрики имеют параметры по умолчанию, в частности, метку интересующего класса (т.е. pos_label). Таким образом, если эта метка не подходит для вашего приложения, вам необходимо определить оценщик и передать правильную pos_label (и дополнительные параметры) с помощью make_scorer. Обратитесь к Функциональные оценщики, чтобы получить информацию для определения собственной функции оценки. Например, мы покажем, как передать информацию об оценщике, что метка интереса равна 0 при максимизации f1_score:
>>> from sklearn.linear_model import LogisticRegression >>> from sklearn.model_selection import TunedThresholdClassifierCV >>> from sklearn.metrics import make_scorer, f1_score >>> X, y = make_classification( ... n_samples=1_000, weights=[0.1, 0.9], random_state=0) >>> pos_label = 0 >>> scorer = make_scorer(f1_score, pos_label=pos_label) >>> base_model = LogisticRegression() >>> model = TunedThresholdClassifierCV(base_model, scoring=scorer) >>> scorer(model.fit(X, y), X, y) 0.88... >>> # compare it with the internal score found by cross-validation >>> model.best_score_ 0.86...
3.3.1.2. Важные замечания по внутренней перекрестной проверке
По умолчанию TunedThresholdClassifierCV использует 5-кратную стратифицированную перекрестную проверку для настройки порога принятия решения. Параметр cv позволяет управлять стратегией перекрестной проверки. Можно обойти перекрестную проверку, установив cv="prefit" и предоставив обученный классификатор. В этом случае порог принятия решения настраивается на предоставленных данных методу fit.
Однако следует проявлять крайнюю осторожность при использовании этого варианта. Нельзя использовать одни и те же данные для обучения классификатора и настройки порога принятия решения из-за риска переобучения. Более подробная информация приведена в следующем разделе примеров (см. Учет повторного обучения модели и перекрестной проверки). При ограниченных ресурсах рекомендуется использовать число с плавающей точкой для cv для ограничения внутренней однократной проверки на разделении на обучающий и тестовый наборы.
Вариант cv="prefit" следует использовать только в том случае, если предоставленный классификатор уже обучен, и вам нужно только найти наилучший порог принятия решения, используя новый набор проверки.
3.3.1.3. Ручная установка порога принятия решения
В предыдущих разделах обсуждались стратегии поиска оптимального порога принятия решения. Также можно вручную установить порог принятия решения, используя класс FixedThresholdClassifier. В случае, если вы не хотите переобучать модель при вызове fit, оберните свой под-оценщик с помощью FrozenEstimator и выполните FixedThresholdClassifier(FrozenEstimator(estimator), ...).
3.3.1.4. Примеры
- См. пример под названием Последовательная настройка точки отсечения функции принятия решения, чтобы получить представление о настройке порога принятия решения.
- См. пример под названием Настройка порога принятия решения для обучения с учетом затрат, чтобы узнать об обучении с учетом затрат и настройке порога принятия решения.
© 2007–2025 The scikit-learn developers
Licensed under the 3-clause BSD License.
https://scikit-learn.org/1.6/modules/classification_threshold.html