ML Systems Lab Open interactive version →
Intermediate 35 min read calibrationECEreliabilityproduction monitoring

Calibration Monitoring in Production

Reliability diagrams from logged predictions, ECE over time, recalibration triggers

An insurance pricing model outputs a claim probability. On launch day it's beautifully calibrated: a prediction of 0.15 really does mean a 15% claim rate — dead on the reliability diagram's diagonal. Three months later, the same 0.15 predictions are actually claiming at 22%. The model is now *underestimating* risk by 7 points in that bucket. And the pricing team feeds its output straight into premiums, so for three months it has been silently undercharging exactly the high-risk customers. No alert fired. AUC is a steady 0.82.


AUC will never catch this, because AUC measures a different thing

AUC measures *ranking* — does the model put riskier customers above safer ones? Calibration measures *probability accuracy* — does 0.15 actually mean 15%? These are independent. A model can rank every customer perfectly (great AUC) while being wrong about every customer's *absolute* risk (terrible calibration). Anywhere the output is used as a real probability — pricing, risk scoring, expected-value math — you must monitor both, separately.


Why calibration drifts even when ranking holds

As the input distribution shifts, the model's probability estimates stop matching the true rates in the new population — even though it still knows *who* is riskier than whom. It just no longer knows *by how much.* You quantify this with Expected Calibration Error:

$ECE = \sum_{bins} (n_{bin}/n)\,|\,\text{confidence}_{bin} - \text{accuracy}_{bin}\,|$

An ECE tripling from 0.03 at launch to 0.09 in three months isn't a footnote — it's mispricing at scale.


Fixing it rarely means retraining

*Platt scaling* fits a small logistic regression on top of the model's outputs using recent labeled data — a few hours with ~1,000 examples. *Temperature scaling* uses a single scalar T: new_prob = σ(logit / T). Both are fast and leave the base model untouched. Trigger recalibration when ECE runs 0.03 above baseline for three days straight.

And kill the assumption that "stable AUC means calibration is fine." A model can post AUC 0.90 with ECE 0.15 — ranking everyone right while its probabilities are off by 15 points. For a fraud model, that means your chosen threshold no longer buys the precision-recall tradeoff you designed. For pricing, it means systematic mispricing. Monitor both, independently, on every batch of labels that arrives.

Key points

Takeaway

Calibration drift is invisible to AUC — monitor ECE on every label batch, recalibrate with Platt or temperature scaling on recent data when ECE crosses threshold, and never wait for a business stakeholder to notice the mispricing.

Recap

Check your understanding

Q1. A loan default model's ECE has increased from 0.03 (at deployment) to 0.09 (current) over 4 months. Reliability diagram shows the model is now overconfident for predictions > 0.7. What is your response?

Q2. Which two statements correctly explain why a pricing model's AUC can hold steady at 0.82 while its 0.15 predictions actually claim at 22%?

Q3. You apply temperature scaling and ECE improves by only 0.008. What does this small improvement tell you?

Try it interactively

ML Systems Lab is a free interview-prep platform for ML engineers — work through the full interactive module, quizzes, and drills.

Open ML Systems Lab →