1.16. Калибровка вероятности¶
При выполнении классификации часто требуется не только предсказать метку класса,
но и получить вероятность соответствующей метки. Эта вероятность дает вам некоторую
уверенность в прогнозе. Некоторые модели могут давать неверные оценки вероятностей классов,
а некоторые даже не поддерживают прогнозирование вероятностей (например, некоторые экземпляры
SGDClassifier
). Модуль калибровки позволяет лучше калибровать
вероятности данной модели или добавить поддержку прогнозирования вероятности.
Хорошо калиброванные классификаторы - это вероятностные классификаторы, для которых выходные данные метода predict_proba можно напрямую интерпретировать как уровень достоверности. Например, хорошо откалиброванный (двоичный) классификатор должен классифицировать образцы так, чтобы среди образцов, которым он присваивал значение predict_proba, близкое, скажем, к 0.8, примерно 80% действительно принадлежали к положительному классу.
Прежде чем мы покажем, как повторно откалибровать классификатор, нам сначала нужен способ определить, насколько хорошо откалиброван классификатор.
Примечание
Строго правильные правила оценки для вероятностных предсказаний, такие как sklearn.metrics.brier_score_loss
и sklearn.metrics.log_loss
, оценивают калибровку (надежность) и дискриминационную способность (разрешение) модели, а также случайность данных (неопределенность) одновременно. Это следует из хорошо известного разложения оценки Бриера (Brier score decomposition Murphy) [1]. Поскольку неясно, какой член доминирует, оценка имеет ограниченное применение только для оценки калибровки (если не вычислять каждый член разложения). Например, более низкий показатель Brier не обязательно означает лучшую калиброванную модель, он также может означать худшую калиброванную модель с гораздо большей дискриминационной способностью, например, использующую гораздо больше признаков.
1.16.1. Калибровочные кривые¶
Калибровочные кривые, также называемые диаграммами надежности (Wilks 1995 [2]), сравнивают, насколько хорошо откалиброваны вероятностные предсказания бинарного классификатора. По оси y
откладывается частота положительных меток (точнее, оценка вероятности условного события \(P(Y=1|\text{predict_proba})\)), а по оси x
- предсказанная вероятность predict_proba модели. Самое сложное - получить значения для оси y
. В scikit-learn это делается путем бинирования предсказаний таким образом, что ось x
представляет собой среднее значение предсказанной вероятности в каждом бине. Ось y
- это доля положительных результатов с учетом предсказаний этого бина, т.е. доля образцов, чей класс является положительным (в каждом бине).
Верхний график калибровочной кривой создается с помощью CalibrationDisplay.from_estimator
, который использует calibration_curve
для расчета средних предсказанных вероятностей и доли положительных результатов для каждого бина. CalibrationDisplay.from_estimator
принимает на вход обученный классификатор, который используется для расчета предсказанных вероятностей. Таким образом, классификатор должен иметь метод predict_proba. Для тех классификаторов, которые не имеют метода predict_proba, можно использовать CalibratedClassifierCV
для калибровки выходов классификатора в вероятности.
Нижняя гистограмма дает некоторое представление о поведении каждого классификатора, показывая количество образцов в каждом бине предсказанной вероятности.
LogisticRegression
по умолчанию возвращает хорошо откалиброванные предсказания, поскольку имеет каноническую функцию связи для потерь, т.е. логит-связь для Log loss. Это приводит к так называемому свойству баланса, см. [8] и Логистическая регрессия. В отличие от этого, другие показанные модели возвращают смещенные вероятности; с разными смещениями для каждой модели.
GaussianNB
(Naive Bayes) имеет тенденцию сдвигать вероятности к 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
сначала обучается на подмножестве тренировочной выборке. Затем его предсказания на тестовой выборке используются для обучении калибратора (либо сигмоидального, либо изотонического регрессора). В результате получается ансамбль из k пар (классификатор, калибратор)
, где каждый калибратор отображает выход соответствующего классификатора на [0, 1]. Каждая пара раскрывается в атрибуте calibrated_classifiers_
, где каждая запись - это калиброванный классификатор с методом predict_proba, который выводит калиброванные вероятности. Выход predict_proba для основного экземпляра CalibratedClassifierCV
соответствует среднему значению предсказанных вероятностей k
моделей в списке calibrated_classifiers_
. Выходом predict является класс, имеющий наибольшую вероятность.
Когда ensemble=False
, используется кросс-валидация для получения “несмещенных” прогнозов для всех данных с помощью cross_val_predict
. Эти несмещенные прогнозы затем используются для обучения калибратора. Атрибут calibrated_classifiers_
состоит только из одной пары (классификатор, калибратор)
, где классификатор - это base_estimator
, обученный на всех данных. В этом случае выход predict_proba для CalibratedClassifierCV
- это предсказанные вероятности, полученные от единственной пары (классификатор, калибратор)
.
Основное преимущество ensemble=True
заключается в использовании традиционного эффекта ансамбля (аналогично Бэггинг метамодель (Bagging meta-estimator)). Результирующий ансамбль должен быть хорошо откалиброван и немного более точен, чем при использовании ensemble=False
. Основное преимущество использования ensemble=False
- вычислительное: сокращается общее время обучении за счет обучения только одной пары базового классификатора и калибратора, уменьшается размер итоговой модели и увеличивается скорость предсказания.
В качестве альтернативы можно откалибровать уже настроенный классификатор, задав cv="prefit"
. В этом случае данные не разбиваются на части и все они используются для обучении регрессора. Пользователь должен убедиться, что данные, используемые для обучении классификатора, не расходятся с данными, используемыми для обучении регрессора.
CalibratedClassifierCV
поддерживает использование двух методов регрессии для калибровки через параметр method
: "sigmoid"
и "isotonic"
.
1.16.3.1. Сигмойда¶
Сигмоидный регрессор, method="sigmoid"
, основан на логистической модели Платта [4]:
где \(y_i\) - истинная метка образца \(i\), а \(f_i\) - выход некалиброванного классификатора для образца \(i\). \(A\) и \(B\) - вещественные числа, определяемые при обучении регрессора методом максимального правдоподобия.
Сигмоидный метод предполагает, что калибровочная кривая может быть скорректирована путем применения сигмоидной функции к исходным предсказаниям. Это предположение было эмпирически обосновано в случае Метод опорных векторов (Support Vector Machines - SVM) с общими функциями ядра на различных эталонных наборах данных в разделе 2.1 Platt 1999 [4], но не обязательно справедливо в общем случае. Кроме того, логистическая модель лучше всего работает, если ошибка калибровки симметрична, то есть выход классификатора для каждого бинарного класса нормально распределен с одинаковой дисперсией [7]. Это может быть проблемой для сильно несбалансированных задач классификации, где выходы не имеют одинаковой дисперсии.
В целом этот метод наиболее эффективен при небольших объемах выборки или когда некалиброванная модель недостаточно уверенна и имеет одинаковые ошибки калибровки как для высоких, так и для низких выходов.
1.16.3.2. Isotonic¶
Метод 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].
Примечание
Impact on ranking metrics like AUC
Обычно предполагается, что калибровка не влияет на такие метрики ранжирования, как ROC-AUC. Однако эти метрики могут отличаться после калибровки при использовании метода="isotonic"
, поскольку изотоническая регрессия вносит связи в предсказанные вероятности. Это можно рассматривать как неопределенность предсказаний модели. Если вы хотите сохранить ранжирование и, соответственно, AUC, используйте method="sigmoid"
, который является строго монотонным преобразованием и, таким образом, сохраняет ранжирование.
1.16.3.3. Поддержка мультиклассов¶
И изотонический, и сигмоидальный регрессоры поддерживают только одномерные данные (например, результаты бинарной классификации), но могут быть расширены для многоклассовой классификации, если base_estimator
поддерживает многоклассовые предсказания. Для многоклассовых предсказаний CalibratedClassifierCV
калибрует для каждого класса отдельно в OneVsRestClassifier моде [5]. При прогнозировании вероятностей калиброванные вероятности для каждого класса прогнозируются отдельно. Поскольку эти вероятности не обязательно равны единице, выполняется постобработка для их нормализации.