1.16. Калибровка вероятностей
При выполнении классификации часто требуется не только предсказать метку класса, но и получить вероятность соответствующей метки. Эта вероятность дает некоторое представление об уверенности в предсказании. Некоторые модели могут давать плохие оценки вероятностей классов, а некоторые вообще не поддерживают предсказание вероятностей (например, некоторые экземпляры SGDClassifier). Модуль калибровки позволяет лучше калибровать вероятности заданной модели или добавлять поддержку предсказания вероятностей.
Хорошо откалиброванные классификаторы — это вероятностные классификаторы, для которых результат метода predict_proba можно напрямую интерпретировать как уровень уверенности. Например, хорошо откалиброванный (бинарный) классификатор должен классифицировать выборки так, чтобы среди выборок, которым он присвоил значение predict_proba, близкое, скажем, к 0.8, приблизительно 80% действительно принадлежали положительному классу.
Прежде чем показать, как повторно калибровать классификатор, нам понадобится способ определить, насколько хорошо он откалиброван.
Примечание
Строго правильные правила оценки вероятностных предсказаний, такие как sklearn.metrics.brier_score_loss и sklearn.metrics.log_loss, одновременно оценивают калибровку (надежность) и различающую способность (разрешение) модели, а также случайность данных (неопределенность). Это следует из общеизвестного разложения оценки Бриера, предложенного Мерфи [1]. Поскольку неясно, какой член разложения преобладает, эта оценка имеет ограниченную применимость для оценки только калибровки (если не вычислять каждый член разложения). Например, меньшее значение потерь Бриера не обязательно означает, что модель откалибрована лучше: оно может указывать и на худшую калибровку модели при значительно большей различающей способности, например при использовании гораздо большего количества признаков.
1.16.1. Кривые калибровки
Кривые калибровки, также называемые диаграммами надежности (Wilks 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, встречаются очень редко. Объяснение этому дают Niculescu-Mizil и Caruana [3]: «Методы вроде бэггинга и случайных лесов, усредняющие предсказания базового набора моделей, могут испытывать трудности при предсказании значений, близких к 0 и 1, поскольку дисперсия базовых моделей смещает предсказания, которые должны быть близки к нулю или единице, в сторону от этих значений. Поскольку предсказания ограничены интервалом [0,1], ошибки, вызванные дисперсией, около нуля и единицы, как правило, направлены только в одну сторону. Например, если модель должна предсказать \(p = 0\) для некоторого случая, бэггинг может добиться этого, только если все деревья в ансамбле предсказывают ноль. Если добавить шум в усредняемые методом бэггинга деревья, этот шум заставит некоторые деревья предсказывать для данного случая значения больше 0, тем самым сместив среднее предсказание ансамбля с бэггингом от 0. Этот эффект наиболее заметен у случайных лесов, поскольку деревья базового уровня, обученные в случайных лесах, имеют относительно высокую дисперсию из-за выбора подмножеств признаков». В результате кривая калибровки приобретает характерную сигмоидальную форму, указывая на то, что классификатор мог бы больше доверять своей «интуиции» и обычно выдавать вероятности, более близкие к 0 или 1.
LinearSVC (SVC) демонстрирует еще более выраженную сигмоидальную кривую, чем случайный лес. Это типично для методов максимального зазора (см. Niculescu-Mizil и Caruana [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 — это класс с наибольшей вероятностью.
При использовании ensemble=True важно тщательно выбирать cv. В каждом разбиении все классы должны присутствовать и в обучающем, и в тестовом подмножестве. Если класс отсутствует в обучающем подмножестве, предсказанная вероятность для этого класса по умолчанию будет равна 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 работы Platt 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\) (то есть откалиброванная вероятность). Этот метод более универсален по сравнению с 'sigmoid', поскольку единственное ограничение состоит в том, что функция преобразования должна быть монотонно возрастающей. Следовательно, он обладает большей гибкостью и позволяет исправить любое монотонное искажение нескалиброванной модели. Однако он более склонен к переобучению, особенно на небольших наборах данных [6].
В целом 'isotonic' будет работать не хуже или лучше, чем 'sigmoid', если данных достаточно (более ~ 1000 выборок), чтобы избежать переобучения [3].
Примечание
Влияние на ранжирующие метрики, такие как AUC
Как правило, считается, что калибровка не влияет на ранжирующие метрики, такие как ROC-AUC. Однако после калибровки эти метрики могут измениться при использовании method="isotonic", поскольку изотоническая регрессия создает совпадающие значения предсказанных вероятностей. Это можно считать следствием неопределенности предсказаний модели. Если важно сохранить ранжирование и, следовательно, значения AUC, используйте method="sigmoid" — строго монотонное преобразование, сохраняющее ранжирование.
1.16.3.3. Поддержка многоклассовой классификации
Изотонический и сигмоидальный регрессоры поддерживают только одномерные данные (например, выходные данные бинарной классификации), но их можно использовать и для многоклассовой классификации, если base_estimator поддерживает многоклассовые предсказания. Для многоклассовых предсказаний CalibratedClassifierCV выполняет калибровку отдельно для каждого класса по схеме OneVsRestClassifier [5]. При предсказании вероятностей откалиброванные вероятности для каждого класса вычисляются отдельно. Поскольку сумма этих вероятностей необязательно равна единице, на этапе последующей обработки они нормализуются.
Температурное масштабирование, напротив, естественным образом поддерживает многоклассовые предсказания: оно работает с логитами и в конце применяет функцию softmax.
1.16.3.4. Температурное масштабирование
Для задачи многоклассовой классификации с \(n\) классами температурное масштабирование [9], method="temperature", вычисляет вероятности классов, изменяя функцию softmax с помощью параметра температуры \(T\):
где для заданной выборки \(z\) — вектор логитов для каждого класса, предсказанных оцениваемой моделью, которую требуется откалибровать. В терминах API scikit-learn это соответствует выходным данным decision_function или логарифму predict_proba. Вероятности преобразуются в логиты: сначала к ним добавляется малая положительная константа, чтобы избежать численных проблем при вычислении логарифма нуля, а затем применяется натуральный логарифм.
Параметр \(T\) обучается путем минимизации log_loss, то есть потери перекрестной энтропии, на отложенном (калибровочном) наборе данных. Обратите внимание, что \(T\) не влияет на положение максимума в выходных данных softmax. Поэтому температурное масштабирование не изменяет точность калибруемого оценивателя.
Главное преимущество температурного масштабирования перед другими методами калибровки заключается в том, что оно позволяет естественным образом получать (лучше) откалиброванные многоклассовые вероятности с помощью всего одного свободного параметра, в отличие от схемы «один против остальных», требующей дополнительных параметров для каждого отдельного класса.
Примеры
- Кривые калибровки вероятностей
- Калибровка вероятностей для классификации на 3 класса
- Калибровка вероятностей классификаторов
- Сравнение калибровки классификаторов
Список литературы
© 2007–2026 The scikit-learn developers
Licensed under the 3-clause BSD License.
https://scikit-learn.org/1.9/modules/calibration.html