Калибровка моделей ИИ: почему 0.8 на выходе классификатора не означает 80%
Калибровка моделей ИИ на практике помогает понять, насколько можно доверять числам, которые выдаёт классификатор, и перестать принимать решения на основе ложной уверенности нейросети.

Число 0.8 на выходе классификатора не означает «модель права в 80% случаев». Это внутренний скор, а не реальная вероятность. Если строить автоматизацию на таких числах без проверки, пороги будут означать не то, что вы думаете, и ошибки пойдут в продакшн незамеченными.
Проблема калибровки моделей ИИ стоит отдельно от точности. Модель может отлично разделять классы и при этом систематически врать о своей уверенности. Материал основан на курсе «Машинное обучение. Экспертный уровень», опубликованном на Хабре, и разбирает конкретные шаги: как обнаружить проблему, измерить её и починить, не трогая саму модель.
Что понадобится
- Python 3.8+ с библиотеками scikit-learn и numpy
- Обученный классификатор, который выдаёт
predict_probaилиdecision_function - Отложенная выборка данных, которую модель не видела при обучении (калибровочная выборка)
- Около 30 минут на первый проход и построение калибровочной кривой
Какую проблему решаем?
Вы обучили классификатор. Он выдаёт predict_proba. Вы берёте эти числа как вероятности и строите логику: если модель уверена больше чем на 0.8, принимаем решение автоматически, меньше, отправляем человеку.
Но число 0.8 на выходе, это не вероятность в обычном смысле. Это внутренний скор, который модель выдала, оптимизируя свою функцию потерь (loss function, формулу, по которой модель учится минимизировать ошибки). Скор неплохо ранжирует объекты: те, кому модель дала выше, обычно действительно «правее» тех, кому ниже. Но как абсолютная вероятность он врёт, иногда сильно.
Как разные модели врут по-разному?
Характер вранья зависит от архитектуры, и это важно для выбора метода починки.
- Нейросети с софтмаксом почти всегда переуверены. Выдают 0.99 там, где реальная частота около 80%. Причина: сеть с большой ёмкостью загоняет логиты (сырые числа перед финальным преобразованием) в крайние значения при долгом обучении
- Градиентный бустинг врёт наоборот: стягивает предсказания к середине. Уверенные случаи получают не 0.99, а 0.85, потому что усреднение по деревьям сглаживает
- Наивный байес печально известен экстремальными вероятностями: 0.9999 и 0.0001. Причина в предположении о независимости признаков, которое почти никогда не выполняется
Пошаговая инструкция
- Постройте калибровочную кривую. Разбейте предсказания на корзины по уровню вероятности и для каждой корзины посмотрите, какая доля объектов реально положительная. Откалиброванная модель ляжет на диагональ:
from sklearn.calibration import calibration_curve
frac_pos, mean_pred = calibration_curve(y_test, probs, n_bins=10)
# frac_pos — реальная доля положительных в корзине
# mean_pred — средняя предсказанная вероятность в корзине
# идеал: frac_pos == mean_pred
- Посчитайте ECE (Expected Calibration Error, ожидаемая ошибка калибровки, число, которое показывает, насколько модель врёт о своей уверенности). ECE равный нулю означает идеальную калибровку. Чем больше, тем хуже:
import numpy as np
def expected_calibration_error(y_true, probs, n_bins=10):
bins = np.linspace(0, 1, n_bins + 1)
ece = 0.0
for i in range(n_bins):
mask = (probs >= bins[i]) & (probs < bins[i + 1])
if mask.sum() > 0:
acc = y_true[mask].mean()
conf = probs[mask].mean()
ece += mask.mean() * abs(acc - conf)
return ece
-
Определите тип искажения по форме кривой. Кривая выше диагонали означает недоуверенность, ниже диагонали означает переуверенность. Форма подскажет метод починки.
-
Примените Platt scaling для сигмоидных искажений. Обучите логистическую регрессию (Logistic Regression, линейная модель, которая переводит число в вероятность через S-образную функцию) поверх сырых скоров модели на отложенной выборке:
from sklearn.linear_model import LogisticRegression
raw_scores = model.decision_function(X_cal).reshape(-1, 1)
calibrator = LogisticRegression().fit(raw_scores, y_cal)
calibrated = calibrator.predict_proba(
model.decision_function(X_new).reshape(-1, 1)
)
- Проверьте результат. Постройте калибровочную кривую заново на тестовой выборке (не на калибровочной!) и сравните ECE до и после. Кривая должна лечь ближе к диагонали.
Platt scaling хорошо работает, когда искажение имеет сигмоидную (S-образную) форму. Это типично для SVM (метод опорных векторов, модель, которая ищет границу между классами) и случаев, когда модель врёт «плавно». У метода всего два параметра, поэтому калибровочная выборка может быть небольшой.
Допустим, вы обучили градиентный бустинг для скоринга заявок. Модель выдаёт predict_proba = 0.85 для группы клиентов. Вы строите калибровочную кривую и видите: среди тех, кому модель дала 0.85, реально положительных только 72%. Ваш порог 0.8 для автоматического одобрения на деле пропускает заявки с точностью ниже ожидаемой. После применения Platt scaling кривая ложится ближе к диагонали, и теперь 0.8 на выходе действительно означает примерно 80% реальной точности. ECE падает, пороги начинают работать так, как задумано.
Калибруют на обучающей выборке. Для калибровки нужен отдельный кусок данных, который модель не видела. Иначе вы подгоняете преобразование под те же примеры, на которых модель уже «запомнила» ответы, и на новых данных результат будет хуже.
Путают калибровку с качеством. Модель бывает точной (хорошо ранжирует) и плохо откалиброванной одновременно. Метрика Брайера (Brier score, средний квадрат разницы между вероятностью и реальным исходом) ловит и то и другое разом, но полезнее разделять: точность отвечает на вопрос «правильно ли модель ранжирует», калибровка моделей ИИ отвечает на вопрос «честны ли её числа».
Навязывают форму преобразования. Platt scaling предполагает S-образное искажение. Если реальная кривая более сложной формы (например, волнистая), нужен другой метод: isotonic regression или temperature scaling (масштабирование температуры, простой способ «смягчить» уверенность нейросети одним множителем). Смотрите на кривую, прежде чем выбирать инструмент.
Забывают про количество корзин в ECE. Метрика зависит от числа корзин: 10 и 20 корзин дают разные числа. Фиксируйте количество и сравнивайте ECE только при одинаковых настройках.
Что делать с этим прямо сейчас, по ролям
Автору Дзена и копирайтеру. Если вы используете ИИ-классификатор для сортировки черновиков или определения тональности, проверьте: число на выходе модели, это не «процент уверенности». Постройте калибровочную кривую, прежде чем автоматизировать решения на основе порога.
Маркетологу. Скоринговые модели для лидов и сегментации часто выдают некалиброванные скоры. Порог «отправлять в отдел продаж, если скор выше 0.7» может пропускать или отсеивать не тех клиентов. Попросите аналитика проверить калибровку, это 30 минут работы, а не переобучение модели.
Разработчику и предпринимателю в РФ. Все методы из этой инструкции работают в scikit-learn без ограничений, никаких подписок и заблокированных API. Из российских платформ: Yandex DataSphere и ML-сервисы SberCloud поддерживают Python-стек, калибровку можно запускать прямо там.
По моим наблюдениям, большинство тех, кто использует predict_proba в боевых системах, ни разу не строили калибровочную кривую. Это не вопрос квалификации, просто тему редко объясняют простым языком. Калибровка моделей ИИ занимает полчаса и не требует переобучения. Но честная оговорка: Platt scaling не панацея. Для сложных искажений нужны другие методы, а для маленьких выборок любая калибровка будет шумной. Начните с кривой и ECE: даже если не будете калибровать, вы хотя бы узнаете, насколько можно доверять числам на выходе вашей модели.
Один простой тест, калибровочная кривая, покажет, врёт ли ваша модель о своей уверенности. Починить это можно за полчаса, не трогая саму модель. Но узнать о проблеме и ничего не сделать хуже, чем не знать: теперь каждый порог, который вы ставите на predict_proba, это осознанный выбор, а не слепое доверие числу.
Научитесь работать с ИИ на практике
В dzen.guru мы разбираем не только калибровку, но и десятки приёмов, которые помогают авторам и маркетологам использовать нейросети без иллюзий
Попробовать инструменты dzen.guru
Основатель dzen.guru. Эксперт по монетизации и продвижению на Дзен. Автор курса «Старт на Дзен 2026».
Читайте также

Конференция WAICO раскололась на два блока: 29 стран против Pax Silica, Казахстан в обоих
Конференция WAICO прошла, мир ИИ раскололся надвое. Вот что нужно знать автору из СНГ, чтобы ориентироваться в новом раскладе и использовать его в контенте.…

Hark привлёк $700 млн на ИИ-агента, который выполняет задачи в окне браузера
Стартап Hark привлёк 700 млн долларов в раунде Series A и в июне запустил ИИ-агент Handoff, который выполняет задачи в окне браузера, от заказа еды до…

WindBorne привлекла $37 млн: прогноз погоды искусственным интеллектом выходит на частный рынок
Компания WindBorne Systems, которая собирает метеоданные с помощью самых долголетающих в мире воздушных шаров и строит на них собственную модель прогноза…
Комментарии