Калибровка вероятностей на собеседовании Data Scientist
Карьерник — Duolingo для аналитиков: 10 минут в день тренируй SQL, Python, A/B, статистику, метрики и ещё 3 темы собеса. 1500+ вопросов в Telegram-боте. Бесплатно.
Содержание:
Что такое калибровка
Модель калибрована, если предсказанная вероятность p совпадает с реальной частотой события. Если модель говорит p=0.7 для группы примеров — в этой группе должно быть примерно 70% положительных.
Группа с predicted p ≈ 0.7:
Калиброванная модель: 70% True positives
Некалиброванная: 45% или 90% TrueМногие модели не калиброваны из коробки:
- Tree-based (RF, GB): часто overconfident — выдают p близкие к 0 и 1
- SVM: decision_function не вероятность
- Naive Bayes: assumption нарушений → overconfidence
- Нейросети: часто overconfident, особенно на out-of-distribution
Калиброваны:
- Logistic regression — обычно хорошо
- Хорошо обученные нейросети с label smoothing — лучше
Зачем нужна
Когда нужна калибровка:
- Risk scoring (вероятность дефолта, fraud)
- A/B-тесты с порогами по вероятности
- Объединение нескольких моделей (нужны соразмерные probabilities)
- Cost-sensitive решения, где порог меняется по бизнес-логике
- Регулируемые отрасли (банки, медицина) — explainability
Когда не нужна:
- Только argmax (классификация без интерпретации probabilities)
- Ranking-задачи (порядок важнее абсолютных значений)
На собесе DS вопрос: «модель показывает 0.95 AUC, но в проде вероятности неинформативны — почему?» Ответ: плохая калибровка, AUC не зависит от калибровки (только от ranking).
Reliability diagram и метрики
Reliability diagram (calibration curve): разбиваем predictions на бины (например, [0-0.1, 0.1-0.2, ..., 0.9-1.0]). На оси X — средняя predicted probability в бине, на Y — реальная частота positive в бине.
Идеально калиброванная модель → диагональ. Overconfident → кривая ниже диагонали в высоких бинах, underconfident — выше.
from sklearn.calibration import calibration_curve
prob_pred, prob_true = calibration_curve(y_test, model.predict_proba(X_test)[:,1], n_bins=10)
plt.plot(prob_pred, prob_true)
plt.plot([0, 1], [0, 1], '--') # идеалМетрики калибровки:
- Brier score —
mean((p - y)²), ниже = лучше. Объединяет калибровку и ranking. - ECE (Expected Calibration Error) — взвешенное среднее |прогноз - факт| по бинам
- MCE — максимальная ошибка по бинам
Brier и ECE — независимые: Brier хорош у точной модели, ECE — у калиброванной.
Platt scaling
Простая калибровка через logistic regression поверх scores модели.
p_calibrated = sigmoid(A · score + B)A и B учатся на calibration set (отдельная выборка или CV).
Когда работает: sigmoid-форма — естественный fit для tree-based, SVM, многих моделей. Нужна параметрическая форма.
В sklearn:
from sklearn.calibration import CalibratedClassifierCV
calibrated = CalibratedClassifierCV(base_estimator=model, method='sigmoid', cv=5)
calibrated.fit(X_train, y_train)
prob = calibrated.predict_proba(X_test)cv=5 — внутри cross-validation, не leakage.
Минус: жёсткая параметрическая форма (сигмоид) может не подходить.
Isotonic regression
Непараметрическая калибровка — монотонная step-function, минимизирующая MSE.
calibrated = CalibratedClassifierCV(base_estimator=model, method='isotonic', cv=5)Свойства:
- Гибче Platt — fit любой монотонной зависимости
- Требует больше данных (~1000+ для надёжной)
- Может переобучиться на маленькой calibration выборке
Когда работает лучше Platt: сильно несимметричные миспрогнозы, когда ground truth не подходит под сигмоид.
Когда что выбирать
| Кейс | Метод |
|---|---|
| Маленькая calibration выборка (< 1000) | Platt |
| Большая выборка | Isotonic |
| Нужна smooth function | Platt |
| Ассиметричный bias | Isotonic |
| Классическая classification | CalibratedClassifierCV (любой) |
| Нейросети | Temperature scaling |
Temperature scaling для нейросетей: делим logits на температуру T (скалярный параметр), softmax. Простой и эффективный для DL.
def calibrated_softmax(logits, T):
return softmax(logits / T)
# T > 1 — softens predictions (less confident)
# T < 1 — sharpensЧастые ошибки
Калибровать на train. Калибровка должна быть на отдельной calibration выборке (или out-of-fold). Иначе — leakage.
Считать, что AUC отражает калибровку. AUC чувствителен только к ranking. Модель может иметь AUC=0.9 и быть совершенно некалиброванной.
Калибровать только positive class. Для multi-class — калибровка для всех классов.
Изменять калибровку при class imbalance. Если в проде class balance отличается от train — нужно адаптировать через prior correction или re-calibration на target distribution.
Использовать CalibratedClassifierCV дважды. На уже калиброванной модели — потеря производительности. Калибровать только raw model.
Игнорировать calibration drift. Distribution меняется → калибровка устаревает. Регулярная переоценка.
Калибровать через accuracy. Accuracy не зависит от probabilities. Метрики калибровки — Brier, ECE.
Связанные темы
- Class imbalance на собесе DS
- Loss-функции на собесе DS
- Bagging vs Boosting на собесе DS
- Что такое AUC-ROC
- Подготовка к собесу Data Scientist
FAQ
Random Forest нуждается в калибровке?
Часто да. RF подвержен «conservative» bias — predictions смещены к 0.5 на средней выборке, к extreme на чистых группах. Калибровка через Platt помогает.
Калибровка ухудшает AUC?
Нет. AUC зависит от ranking, калибровка — монотонное преобразование, не меняет порядок.
Можно ли использовать калиброванные вероятности для бизнес-решений?
Да, это и есть основное применение. «Если P(fraud) > 0.95 → блокировать» работает корректно только на калиброванных моделях.
Когда temperature scaling не работает?
Когда miscalibration не просто scaled, а имеет другой shape. Тогда — Platt или isotonic поверх softmax.
Calibration vs probability calibration in sklearn — что использовать?
CalibratedClassifierCV — стандарт. Поддерживает CV, обе method (sigmoid, isotonic).
Это официальная информация?
Нет. Статья основана на работах Platt (1999), Niculescu-Mizil & Caruana (2005), Guo et al. (2017) для temperature scaling, документации sklearn.
Тренируйте Data Science — откройте тренажёр с 1500+ вопросами для собесов.