Machine learning do zero · Aula 2.4 · 11 de 33 aulas prontas · 12 min
Calibração: 0,8 quer dizer 80%?
Em resumo
Um modelo pode ordenar bem e errar as porcentagens. O naive Bayes declara 98% de confiança e acerta 88%. A temperatura corrige isso sem mudar nenhuma decisão.
Aquecimento Duas perguntas de aulas anteriores. Um minuto, e a aula nunca fica bloqueada.
Na aula 2.3, as curvas ROC e PR verificavam o quanto um modelo ordena bem as biópsias. Elas nunca perguntavam se os números do modelo são verdadeiros. O modelo diz “0,8”. Isso quer dizer que 80% dessas biópsias são malignas? Essa é a pergunta da calibração. Hoje você vai verificá-la em dois modelos e ver que às vezes um único número a corrige, sem mudar nenhuma decisão.
Escolha uma resposta e o seu grau de certeza.
Responda para liberar o experimento.
Experimento interativo
Este experimento interativo funciona em um navegador com JavaScript ativado. O texto ao redor descreve o que ele mostra.
Ver a resposta
Resposta certa: Em cerca de 88%, ou seja, 10 pontos a menos do que promete
Ele declara em média 98,3% e acerta 88,3%: uma diferença de 10,0 pontos. 149 das 171 biópsias recebem confiança acima de 99%, e 5 delas são erros. A temperatura T = 4,12 baixa o Brier de 0,100 para 0,071 e não muda nenhuma decisão.
Experimente
- Comece pelo naive Bayes sem calibração. Onde estão os círculos em relação à diagonal? Quantas biópsias recebem confiança acima de 99%, e quantas delas são erros?
- Ligue a temperatura. O que acontece com os círculos, com o Brier e com o ROC AUC? Quantas decisões mudaram?
- Passe para a regressão logística e compare-a sem calibração e com temperatura. Esse modelo precisava de correção?
Depois de conferir no lab, vamos dar nome ao que você vê.
A ideia em palavras simples
Um modelo está calibrado quando dá para levar seus números ao pé da letra: entre as biópsias às quais ele dá 0,8, cerca de 80% são malignas, e entre as de 0,1, cerca de 10%. Quem verifica isso é o diagrama de confiabilidade. As biópsias são divididas em faixas pela probabilidade declarada, e em cada faixa contamos que parcela é realmente maligna. Um modelo calibrado fica sobre a diagonal. Círculos abaixo da diagonal, à direita, indicam excesso de confiança.
Calibrar não é o mesmo que ordenar. O ROC AUC da aula 2.3 só pergunta se uma biópsia maligna recebe pontuação maior que uma benigna. O naive Bayes ordena bem (ROC AUC 0,966, quase como a regressão logística com 0,969), mas suas porcentagens são infladas. Entre as 55 biópsias às quais ele dá pelo menos 0,9, declara em média 99,6%, e 89,1% são malignas.
O Brier score mede as duas coisas ao mesmo tempo: a média do quadrado da diferença entre a probabilidade declarada e o que aconteceu (1 para maligna, 0 para benigna). Quanto menor, melhor. O ECE diz a que distância média da diagonal ficam os círculos.
Jak to policzono
- Biópsias: Breast Cancer Wisconsin (Diagnostic), UCI, licença CC BY 4.0. 569 biópsias, 10 medidas “mean” de cada uma.
- Divisão estratificada: 171 biópsias de validação (30%); do resto, 266 para aprender e 132 para ajustar a calibração. Nem o modelo nem a calibração veem as biópsias de validação.
- Modelos: naive Bayes com distribuição normal (
GaussianNB) e padronização mais regressão logística (C = 1). - Temperatura: um único número T, ajustado nas 132 biópsias de calibração para que o log-loss seja o menor possível. Diagrama e ECE: 10 faixas de 0,1.
Por que funciona
O naive Bayes supõe que as medidas de um tumor são independentes entre si. Nestes dados elas não são: o raio, o perímetro e a área do tumor dizem quase a mesma coisa. Então o modelo conta a mesma evidência várias vezes e a soma de novo e de novo à pontuação, até a confiança chegar a 99% ou mais. A ordem das biópsias continua fazendo sentido, porque um tumor maior ainda recebe pontuação maior, mas as porcentagens crescem rápido demais.
A temperatura divide a pontuação do modelo antes da sigmoide por um único número T. Para o naive Bayes, T = 4,12, então cada pontuação fica mais de quatro vezes menor. Dividir por um número positivo não muda nem o sinal da pontuação nem a ordem das biópsias. Nenhuma decisão no limiar 0,5 muda, e o ROC AUC continua 0,966. Só as porcentagens mudam: a confiança média cai de 98,3% para 91,1%, o Brier de 0,100 para 0,071 e o ECE de 0,101 para 0,055. Agora 34 biópsias recebem confiança acima de 99%, e nenhuma delas é erro.
A regressão logística é calibrada quase desde o início: declara 92,5% e acerta 91,2%. Sua temperatura dá T = 0,93, perto de 1, e o Brier fica em 0,063. Não é por acaso: a regressão logística aprende diminuindo o log-loss, que é justamente a penalidade por porcentagens mal informadas.
Não é acaso de uma única divisão. No código abaixo, o mesmo experimento roda em outras 50 divisões: o naive Bayes declara em média 98,5% e acerta 91,2%, e a temperatura baixa seu Brier todas as vezes. Na regressão logística, a temperatura quase não muda nada.
Erro comum
Verdadeiro ou falso: “uma pontuação de 0,8 quer dizer 80% de chance”. Falso, até você verificar. Um modelo dá um número de 0 a 1, mas nada garante que seja uma probabilidade no sentido comum. No lab, o naive Bayes dá a 149 das 171 biópsias confiança acima de 99%, e 5 delas são erros. Se essas porcentagens fossem verdadeiras, haveria entre elas menos de dois erros. Leia a pontuação de um modelo como chance só depois de conferir o diagrama de confiabilidade em dados que o modelo não viu.
Um aviso no sentido contrário: calibrar não melhora a ordenação. A temperatura não muda nem o ROC AUC nem a acurácia, e não acrescenta nada a um modelo bem calibrado: o Brier da regressão logística fica em 0,063. A calibração é necessária quando os números do modelo vão adiante: para um limiar pelo custo dos erros (aula 2.6), para somar riscos, para uma conversa com uma paciente.
Quiz
Três perguntas para você se testar. Escolha uma resposta ou abra a resposta embaixo de cada pergunta. No teclado: as setas escolhem, Enter ou Espaço confirma.
Pontos-chave
- A calibração pergunta se as porcentagens do modelo são verdadeiras; ordenar (ROC AUC) é outra pergunta.
- Você verifica a calibração com um diagrama de confiabilidade e o Brier score em dados que o modelo não viu.
- O naive Bayes é confiante demais porque conta várias vezes a mesma evidência de medidas relacionadas.
- A temperatura corrige as porcentagens com um único número e não muda nenhuma decisão nem o ROC AUC.
Mais a fundo: fórmula, código, prática
A matemática
Diagrama de confiabilidade: numa faixa B de probabilidades declaradas, você compara a média declarada conf(B) com a parcela de positivos acc(B). Um modelo calibrado satisfaz P(y = 1 | p) = p.
Brier = (1/n) · Σ (pᵢ − yᵢ)², e ECE = Σ_B (|B| / n) · |acc(B) − conf(B)|.
Temperatura: o modelo dá uma pontuação z (logit) e a probabilidade é p = σ(z / T), onde σ(z) = 1 / (1 + e^(−z)). T é ajustado numa parte separada dos dados, diminuindo o log-loss. Quando T > 1, as porcentagens se achatam. O sinal de z / T é o de z, então a decisão p ≥ 0,5 (ou seja, z ≥ 0) não muda.
Platt: p = σ(a · z + b), dois números em vez de um. O deslocamento b pode mudar decisões: no lab, muda 2 para o naive Bayes.
No código (Python)
O mesmo experimento no scikit-learn em 50 divisões aleatórias (266 biópsias para aprender, 132 para calibrar, 171 para avaliar): confiança média, acurácia e Brier antes e depois da temperatura.
import numpy as np
from scipy.optimize import minimize_scalar
from scipy.special import expit
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import GaussianNB
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import brier_score_loss
X, y = load_breast_cancer(return_X_y=True)
X, y = X[:, :10], 1 - y # as 10 medidas "mean", como no lab; 1 = maligno
def score(m, rows): # pontuação do modelo antes da sigmoide: log P(maligno) - log P(benigno)
lp = m.predict_log_proba(X[rows])
return lp[:, 1] - lp[:, 0]
def run(model, seed): # 266 para aprender, 132 para calibrar, 171 para avaliar (validação)
rest, va = train_test_split(np.arange(len(y)), test_size=0.3, stratify=y, random_state=seed)
tr, ca = train_test_split(rest, test_size=1 / 3, stratify=y[rest], random_state=seed)
m = model.fit(X[tr], y[tr])
zc, zv = score(m, ca), score(m, va)
loss = lambda T: np.mean(np.logaddexp(0, -zc / T) * y[ca] + np.logaddexp(0, zc / T) * (1 - y[ca]))
T = minimize_scalar(loss, bounds=(0.05, 20), method="bounded").x # temperatura: um só número, ajustado na parte de calibração
p0, p1 = expit(zv), expit(zv / T)
conf, acc = np.maximum(p0, 1 - p0).mean(), ((p0 >= 0.5) == y[va]).mean()
same = ((p0 >= 0.5) == (p1 >= 0.5)).all() # dividir por T nunca muda uma decisão
return conf, acc, brier_score_loss(y[va], p0), brier_score_loss(y[va], p1), T, same
for name, model in (("naive Bayes", GaussianNB()), ("logistic regression", make_pipeline(StandardScaler(), LogisticRegression()))):
r = np.array([run(model, s) for s in range(50)])
print(f"{name}, 50 splits: declares {r[:, 0].mean():.1%}, accuracy {r[:, 1].mean():.1%}; Brier {r[:, 2].mean():.3f} -> {r[:, 3].mean():.3f} with T = {r[:, 4].mean():.2f}; lower in {(r[:, 3] < r[:, 2]).sum()} of 50, decisions kept in {int(r[:, 5].sum())} of 50")
Saída
naive Bayes, 50 splits: declares 98.5%, accuracy 91.2%; Brier 0.077 -> 0.061 with T = 3.86; lower in 50 of 50, decisions kept in 50 of 50
logistic regression, 50 splits: declares 93.4%, accuracy 93.5%; Brier 0.047 -> 0.047 with T = 0.94; lower in 17 of 50, decisions kept in 50 of 50
As divisões são diferentes das do lab, então os números também: o naive Bayes declara em média 98,5% e acerta 91,2%. O quadro é o mesmo. A temperatura baixa o Brier dele em 50 de 50 divisões e não muda nenhuma decisão, enquanto na regressão logística quase não faz nada: Brier 0,047 antes e depois.
Baixar o notebook (.ipynb). Abra no Jupyter ou envie para o Google Colab; ele baixa sozinho os dados que faltarem.
Para quem pratica
- No scikit-learn,
calibration_curve,CalibrationDisplayebrier_score_lossverificam a calibração, sempre em dados que o modelo não viu. CalibratedClassifierCVa corrige (method="sigmoid"é Platt,"isotonic"é a regressão isotônica); a temperatura é fácil de acrescentar à mão. A regressão isotônica precisa de mais dados, porque ajusta uma função em escada inteira.- Ajuste a calibração numa parte separada dos dados ou dentro da validação cruzada, nunca nos dados com que o modelo aprendeu: ali o modelo parece melhor do que é.
- Porcentagens calibradas importam quando o número vai adiante: para um limiar pelo custo dos erros (aula 2.6), para somar riscos, para uma conversa com uma paciente. Quando só a ordem importa, o ROC AUC basta.
Isto foi útil?
Obrigado! Isso nos ajuda a melhorar.
Vá mais fundo no Atlas
Verbetes da enciclopédia sobre as ideias desta aula: