1.16. Калибровка вероятностей
При выполнении классификации часто требуется не только предсказать метку класса, но и получить вероятность соответствующей метки. Эта вероятность даёт некую уверенность в предсказании. Некоторые модели могут давать плохие оценки вероятностей классов, а некоторые даже не поддерживают предсказание вероятностей (например, некоторые экземпляры SGDClassifier). Модуль калибровки позволяет улучшить калибровку вероятностей заданной модели или добавить поддержку предсказания вероятностей.
Хорошо откалиброванные классификаторы являются вероятностными классификаторами, для которых выход метода predict_proba можно напрямую интерпретировать как уровень уверенности. Например, хорошо откалиброванный (бинарный) классификатор должен классифицировать образцы таким образом, что среди образцов, для которых он дал значение predict_proba близкое, скажем, к 0,8, примерно 80% фактически принадлежат положительному классу.
Прежде чем показать, как перекалибровать классификатор, нам сначала нужно способ определить, насколько хорошо классификатор откалиброван.
Примечание
Строго правильные функции оценки для вероятностных предсказаний, такие как sklearn.metrics.brier_score_loss и sklearn.metrics.log_loss оценивают калибровку (надёжность) и дискриминационную способность (разрешение) модели, а также случайность данных (неопределённость) одновременно. Это следует из хорошо известного разложения оценки Бриера Мерфи [1]. Поскольку неясно, какой член доминирует, оценка имеет ограниченное применение для оценки только калибровки (если не вычисляются каждый член разложения). Например, меньшая потеря Бриера не обязательно означает лучшую откалиброванную модель; она также может означать хуже откалиброванную модель с гораздо большей дискриминационной способностью, например, с использованием гораздо большего числа признаков.
1.16.1. Кривые калибровки
Кривые калибровки, также называемые диаграммами надёжности (Уилкс 1995 [2]), сравнивают, насколько хорошо откалиброваны вероятностные предсказания бинарного классификатора. Она строит частоту положительной метки (точнее, оценку условной вероятности события \(P(Y=1|\text{predict_proba})\)) по оси y и предсказанную вероятность predict_proba модели по оси x. Трудная часть заключается в получении значений для оси y. В scikit-learn это достигается путём разбиения предсказаний на интервалы, так что ось x представляет среднюю предсказанную вероятность в каждом интервале. Ось y затем является долей положительных, учитывая предсказания этого интервала, т. е. долей образцов, чей класс является положительным классом (в каждом интервале).
Верхняя кривая калибровки создаётся с помощью CalibrationDisplay.from_estimator, которая использует calibration_curve для вычисления средней предсказанной вероятности и доли положительных в каждом интервале. CalibrationDisplay.from_estimator принимает на вход обученный классификатор, который используется для вычисления предсказанных вероятностей. Таким образом, классификатор должен иметь метод predict_proba. Для небольшого числа классификаторов, не имеющих метода predict_proba, можно использовать CalibratedClassifierCV для калибровки выходных данных классификатора в вероятности.
Нижняя гистограмма даёт некоторое представление о поведении каждого классификатора, показывая количество образцов в каждом интервале предсказанной вероятности.
LogisticRegression более вероятно возвращает хорошо откалиброванные предсказания сам по себе, поскольку он имеет каноническую связующую функцию для своей потери, т. е. лог-связь для логарифмической потери. В случае без штрафов это приводит к так называемому свойству баланса, см. [8] и логистическую регрессию. На графике выше данные генерируются в соответствии с линейным механизмом, что согласуется с моделью LogisticRegression (модель «хорошо задана»), а значение параметра регуляризации C настроено должным образом (ни слишком сильное, ни слишком слабое). Вследствие этого модель возвращает точные предсказания с помощью своего метода predict_proba. В отличие от этого, другие показанные модели возвращают предвзятые вероятности; с различными предвзятостями в зависимости от модели.
GaussianNB (Наивный Байес) имеет тенденцию сдвигать вероятности к 0 или 1 (обратите внимание на подсчёты в гистограммах). Это в основном потому, что он делает предположение, что признаки условно независимы при заданном классе, что не так в этом наборе данных, который содержит 2 дублирующих признака.
RandomForestClassifier показывает противоположное поведение: гистограммы показывают пики примерно при вероятностях 0,2 и 0,9, в то время как вероятности, близкие к 0 или 1, встречаются очень редко. Объяснение этому дано Никулеску-Мизилом и Каруаной [3]: «Методы, такие как бэггинг и случайные леса, которые усредняют предсказания из базового набора моделей, могут испытывать трудности с предсказаниями, близкими к 0 и 1, потому что дисперсия в базовых моделях будет смещать предсказания, которые должны быть близки к нулю или единице, от этих значений. Поскольку предсказания ограничены интервалом [0, 1], ошибки, вызванные дисперсией, имеют тенденцию быть односторонними вблизи нуля и единицы. Например, если модель должна предсказать p = 0 для случая, единственный способ бэггинга достичь этого — если все деревья бэггинга предскажут ноль. Если мы добавим шум к деревьям, по которым бэггинг усредняет, этот шум заставит некоторые деревья предсказать значения, большие, чем 0 для этого случая, тем самым смещая среднее предсказание бэгингового ансамбля от 0. Мы наблюдаем этот эффект наиболее сильно со случайными лесами, потому что базовые деревья, обученные с помощью случайных лесов, имеют относительно высокую дисперсию из-за сужения признаков». В результате кривая калибровки демонстрирует характерную сигмовидную форму, указывая на то, что классификатор может больше доверять своей «интуиции» и возвращать вероятности, обычно более близкие к 0 или 1.
LinearSVC (SVC) показывает ещё более сигмовидную кривую, чем случайный лес, что типично для методов максимального отступа (сравните Никулеску-Мизила и Каруану [3]), которые сосредоточены на трудно классифицируемых образцах, которые близки к границе принятия решения (вектора поддержки).
1.16.2. Калибровка классификатора
Калибровка классификатора состоит в подгонке регрессора (называемого калибратором), который отображает выход классификатора (как задаётся с помощью decision_function или predict_proba) в откалиброванную вероятность в [0, 1]. Обозначая выход классификатора для данного образца как \(f_i\), калибратор пытается предсказать условную вероятность события \(P(y_i = 1 | f_i)\).
В идеале калибратор подгоняется на наборе данных, независимом от обучающих данных, используемых для обучения классификатора в первую очередь. Это потому, что производительность классификатора на обучающих данных будет лучше, чем для новых данных. Использование выходных данных классификатора обучающих данных для подгонки калибратора приведет к смещённому калибратору, который отображается на вероятности, более близкие к 0 и 1, чем это должно быть.
1.16.3. Использование
Класс CalibratedClassifierCV используется для калибровки классификатора.
CalibratedClassifierCV использует подход кросс-валидации, чтобы гарантировать, что для подгонки калибратора всегда используется несмещённая выборка данных. Данные разбиваются на k (train_set, test_set) пар (как определяется cv). Когда ensemble=True (по умолчанию), следующая процедура повторяется независимо для каждого разбиения кросс-валидации:
- клонированный экземпляр
base_estimatorобучается на подмножестве для обучения - обученный экземпляр
base_estimatorделает предсказания на подмножестве для тестирования - предсказания используются для подгонки калибратора (либо сигмоидального, либо изотонного регрессора) (если данные многоклассовые, для каждого класса подгоняется свой калибратор)
Это приводит к ансамблю из k (classifier, calibrator) пар, где каждый калибратор отображает выходной результат соответствующего классификатора в [0, 1]. Каждая пара представлена в атрибуте calibrated_classifiers_, где каждый элемент — это откалиброванный классификатор с методом predict_proba, который выдает откалиброванные вероятности. Результат вызова predict_proba для основного экземпляра CalibratedClassifierCV соответствует среднему значению предсказанных вероятностей k эстиматоров в списке calibrated_classifiers_. Выход predict — это класс с наибольшей вероятностью.
Важно тщательно выбрать cv при использовании ensemble=True. Все классы должны быть присутствовать как в подмножестве для обучения, так и в подмножестве для тестирования для каждого разбиения. Если класс отсутствует в подмножестве для обучения, предсказанная вероятность для этого класса по умолчанию будет равна 0 для (classifier, calibrator) пары этого разбиения. Это искажает predict_proba, поскольку вычисляется среднее по всем парам. Если класс отсутствует в подмножестве для тестирования, калибратор для этого класса (внутри (classifier, calibrator) пары этого разбиения) подгоняется на данных без положительного класса. Это приводит к неэффективной калибровке.
Когда ensemble=False, для получения «несмещённых» предсказаний для всех данных используется кросс-валидация с помощью cross_val_predict. Эти несмещённые предсказания затем используются для обучения калибратора. Атрибут calibrated_classifiers_ состоит только из одной (classifier, calibrator) пары, где классификатор — это base_estimator экземпляр, обученный на всех данных. В этом случае выход predict_proba для CalibratedClassifierCV — это предсказанные вероятности, полученные от единственной (classifier, calibrator) пары.
Основное преимущество ensemble=True заключается в том, что оно использует эффект традиционного ансамблирования (похожего на Bagging мета-эстиматор). Полученный ансамбль должен быть хорошо откалиброван и немного более точен, чем при использовании ensemble=False. Основное преимущество использования ensemble=False — вычислительное: оно сокращает общее время обучения, обучая только одну пару базового классификатора и калибратора, уменьшает размер конечной модели и увеличивает скорость предсказания.
В качестве альтернативы уже обученный классификатор может быть откалиброван с помощью FrozenEstimator в качестве CalibratedClassifierCV(estimator=FrozenEstimator(estimator)). Пользователь должен убедиться, что данные, используемые для обучения классификатора, не пересекаются с данными, используемыми для обучения регрессора.
CalibratedClassifierCV поддерживает использование двух методов регрессии для калибровки через параметр method: "sigmoid" и "isotonic".
1.16.3.1. Сигмоида
Сигмоидальный регрессор, method="sigmoid" основан на логической модели Платта [4]:
где \(y_i\) — истинная метка выборки \(i\), а \(f_i\) — выход неоткалиброванного классификатора для выборки \(i\). \(A\) и \(B\) — вещественные числа, определяемые при подгонке регрессора с помощью максимального правдоподобия.
Метод сигмоиды предполагает, что кривую калибровки можно исправить, применив к исходным предсказаниям функцию сигмоиды. Это предположение эмпирически подтверждено в случае машин опорных векторов с общими ядрами на различных тестовых наборах данных в разделе 2.1 работы Платта 1999 [4], но не обязательно верно в общем случае. Кроме того, логическая модель лучше всего работает, если ошибка калибровки симметрична, то есть выход классификатора для каждого бинарного класса имеет нормальное распределение с одинаковой дисперсией [7]. Это может быть проблемой для сильно несбалансированных задач классификации, где выходы не имеют одинаковой дисперсии.
В общем случае этот метод наиболее эффективен для небольших объёмов выборки или когда неоткалиброванная модель не уверена и имеет похожие ошибки калибровки для высоких и низких выходов.
1.16.3.2. Изотонный
method="isotonic" подгоняет непараметрический изотонный регрессор, который выдает ступенчатую неубывающую функцию, см. sklearn.isotonic. Он минимизирует:
при условии \(\hat{f}_i \geq \hat{f}_j\) всякий раз, когда \(f_i \geq f_j\). \(y_i\) — истинная метка выборки \(i\), а \(\hat{f}_i\) — результат откалиброванного классификатора для выборки \(i\) (т. е., откалиброванная вероятность). Этот метод более общий по сравнению с «сигмоидой», так как единственное ограничение состоит в том, что функция отображения монотонно возрастает. Таким образом, он более мощный, так как может исправить любое монотонное искажение неоткалиброванной модели. Однако он более подвержен переобучению, особенно на небольших наборах данных [6].
В целом, «изотонный» покажет такие же или лучшие результаты, чем «сигмоидальный», если данных достаточно (более ~ 1000 выборок), чтобы избежать переобучения [3].
Примечание
Влияние на метрики ранжирования, такие как AUC
Ожидается, что калибровка не повлияет на метрики ранжирования, такие как ROC-AUC. Однако эти метрики могут отличаться после калибровки при использовании method="isotonic" из-за того, что изотонная регрессия вводит связи в предсказанных вероятностя. Это можно рассматривать как неопределённость в предсказаниях модели. Если вам необходимо сохранить ранжирование и, следовательно, значения AUC, используйте method="sigmoid", которая представляет собой строго монотонное преобразование и, следовательно, сохраняет ранжирование.
1.16.3.3. Многоклассовая поддержка
Как изотонические, так и сигмоидные регрессоры поддерживают только одномерные данные (например, выходные данные бинарной классификации), но расширены для многоклассовой классификации, если base_estimator поддерживает многоклассовые прогнозы. Для многоклассовых прогнозов CalibratedClassifierCV производит калибровку для каждого класса отдельно по схеме OneVsRestClassifier [5]. При прогнозировании вероятностей прогнозируются откалиброванные вероятности для каждого класса отдельно. Поскольку эти вероятности необязательно суммируются до единицы, выполняется постобработка для их нормализации.
Примеры
- Кривые калибровки вероятностей
- Калибровка вероятностей для 3-классовой классификации
- Калибровка вероятностей классификаторов
- Сравнение калибровки классификаторов
Ссылки
© 2007–2025 The scikit-learn developers
Licensed under the 3-clause BSD License.
https://scikit-learn.org/1.6/modules/calibration.html