Machine learning do zero · Aula 2.2 · 9 de 33 aulas prontas · 10 min
Avaliando um classificador: além da acurácia
Em resumo
A acurácia esconde quais erros um modelo comete. A matriz de confusão, a precisão e o recall mostram o equilíbrio que um limiar cria em dados de tumores.
Aquecimento Duas perguntas de aulas anteriores. Um minuto, e a aula nunca fica bloqueada.
Um alarme de fumaça que nunca toca jamais erra com um incêndio falso. Um alarme que dispara toda vez que você faz torrada jamais deixa passar um incêndio de verdade. Qual é o melhor? Nenhum dos dois — e um único número de acurácia nem diria qual deles você tem. Esta lição é sobre contar erros de um jeito que mostre o tipo deles, não só a quantidade.
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: 0,1
Com limiar 0,1 o recall é 96,9% (62 dos 64 tumores malignos detectados), com 0,2 só 92,2% e com 0,5 82,8%. Você paga com falsos alarmes: 20 biópsias saudáveis marcadas como malignas com 0,1, contra 3 com 0,5.
Experimente
- Mova o controle do limiar para a esquerda. Veja os falsos negativos da matriz de confusão diminuírem e os falsos positivos aumentarem, e o recall e a precisão andarem em sentidos opostos.
- Mova o controle do limiar para a direita e veja o contrário acontecer. Fique de olho na acurácia: ela diz que tipo de erro você está cometendo?
- Encontre o limiar mais alto em que nenhum tumor maligno é perdido. Veja quantos tumores benignos são marcados por engano nesse ponto.
- Escolha o limiar que você usaria num exame de rastreamento e diga numa frase por quê.
A ideia em poucas palavras
Vamos ver agora, em palavras simples, o que você acabou de manipular.
Voltemos aos 569 tumores de mama da lição 1. Um modelo dá a cada tumor uma pontuação: quanto mais alta, maior a chance de ser maligno. Um limiar transforma a pontuação numa decisão. Cada decisão então cai numa de quatro casas:
| previsto maligno | previsto benigno | |
|---|---|---|
| realmente maligno | verdadeiro positivo (VP) | falso negativo (FN) |
| realmente benigno | falso positivo (FP) | verdadeiro negativo (VN) |
Essa tabela é a matriz de confusão. A diagonal guarda as decisões corretas. As outras duas casas guardam dois tipos de erro muito diferentes: um falso positivo é um alarme falso (uma paciente saudável encaminhada para mais exames), e um falso negativo é um caso perdido (um câncer mandado para casa).
O alarme de fumaça mostra bem isso. O alarme mudo não tem falsos positivos e tem muitos falsos negativos. O alarme da torrada tem o contrário. Um bom alarme equilibra os dois de acordo com o custo de cada erro.
Por que funciona
Dois números resumem a matriz muito melhor que a acurácia:
precisão = VP / (VP + FP) recall = VP / (VP + FN)
O recall (revocação ou sensibilidade) responde: de todos os tumores malignos, que fração pegamos? A precisão responde: de todos os tumores que chamamos de malignos, que fração realmente era? O recall trata de não deixar escapar; a precisão, de não dar alarme falso.
O limiar controla o equilíbrio entre os dois. Baixe o limiar e mais tumores são marcados como malignos: você pega mais cânceres (o recall sobe), mas também marca mais tumores benignos (a precisão costuma cair). Suba o limiar e acontece o contrário. Nenhum limiar consegue maximizar os dois, a não ser que o modelo separe as classes perfeitamente. Escolher um limiar, portanto, não é um detalhe técnico, mas uma decisão de valores: quantos alarmes falsos você aceita para não perder um câncer?
A acurácia mistura as quatro casas num único número e esconde essa escolha. Ela também esconde o desbalanceamento de classes. Como 357 dos 569 tumores são benignos, um modelo que chama tudo de benigno acerta quase dois terços sem pegar nenhum câncer — recall zero. Esse é o paradoxo da acurácia: um modelo pode parecer razoável pela acurácia e ser inútil para aquilo para que foi construído.
Erro comum
O erro mais comum é relatar só a acurácia, principalmente em dados desbalanceados, em que uma classe é muito mais rara que a outra. O segundo é manter o limiar padrão de 0,5 sem perguntar quanto custam os erros. Um exame de rastreamento, em que um caso perdido pode ser fatal e um alarme falso significa um exame extra, normalmente deve ter um limiar mais baixo que um exame que leva a uma cirurgia. Uma terceira armadilha é confundir precisão e recall; lembrar as perguntas que eles respondem — “dos que eu marquei” versus “dos que existem” — ajuda mais que decorar fórmulas.
Até aqui avaliamos modelos num único conjunto de teste fixo. Mas um modelo pode brilhar nos dados com que aprendeu e ir mal em todo o resto. Na próxima lição provocamos isso de propósito: o overfitting.
Pegue o erro da IA
Foi assim que um chatbot respondeu. Uma frase está errada. Qual?
Pergunta: Com limiar 0,1, meu classificador de tumores encontra 62 dos 64 tumores malignos, mas também marca 20 benignos. Como devo interpretar isso?
Mostrar a frase errada
A frase errada: E como a precisão é a fração de todos os tumores malignos que o modelo pega, ela é igualmente alta aqui.
Essa é a definição de recall. A precisão responde à outra pergunta — dos tumores marcados, quantos são realmente malignos — e com limiar 0,1 os 20 falsos alarmes a puxam para baixo, enquanto com 0,5 há só 3.
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 matriz de confusão divide as decisões em verdadeiros e falsos positivos e negativos.
- O recall é a fração de positivos reais pegos; a precisão é a fração de casos marcados que são reais.
- O limiar troca recall por precisão, e o equilíbrio certo depende do custo de cada erro.
- A acurácia esconde o tipo de erro e pode parecer boa em dados desbalanceados mesmo perdendo todos os positivos.
Mais a fundo: fórmula, código, prática
A matemática
Um limiar t transforma uma pontuação em decisão: prever maligno quando score ≥ t. Contar as quatro caixas dá as métricas:
accuracy = (TP + TN) / n, a proporção de todas as decisões que estão certas;precision = TP / (TP + FP), a proporção de alarmes que são reais;recall = TP / (TP + FN), a proporção de casos reais que foram detectados;F1 = 2 · precision · recall / (precision + recall), a média harmônica das duas, que continua baixa se qualquer uma for baixa.
Baixar t só pode acrescentar alarmes, então TP e FP nunca caem e FN nunca sobe. Por isso o recall nunca cai quando t diminui, enquanto a precisão normalmente cai. Um modelo que sempre responde “benigno” tem TP = 0, então seu recall é 0, e sua acurácia é apenas a proporção da classe majoritária: 357 / 569.
No código (Python)
Os 569 tumores da lição, com as 10 variáveis “mean” do lab, uma regressão logística com escalonamento e uma divisão de teste estratificada de 30% (171 biópsias, random_state=1). As contagens do próprio lab (TP / FN / FP) são 53 / 11 / 3 no limiar 0,5 e 62 / 2 / 20 em 0,1. Esta divisão não é a do lab, então as contagens diferem um pouco:
from sklearn.datasets import load_breast_cancer
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
X, b = load_breast_cancer(return_X_y=True, as_frame=True)
X = X.filter(like="mean ") # as 10 variáveis "mean", como no lab
y = 1 - b # no sklearn 0 = maligno; inverte-se para que 1 = maligno
print(f"tumours {len(y)}, benign {(y == 0).sum()}, always-benign accuracy {(y == 0).mean():.3f}")
Xtr, Xte, ytr, yte = train_test_split(X, y, test_size=0.3, stratify=y, random_state=1)
score = make_pipeline(StandardScaler(), LogisticRegression()).fit(Xtr, ytr).predict_proba(Xte)[:, 1]
for t in (0.5, 0.1):
flag = score >= t
tp, fp, fn = (flag & (yte == 1)).sum(), (flag & (yte == 0)).sum(), (~flag & (yte == 1)).sum()
print(f"t={t}: TP {tp} FN {fn} FP {fp} precision {tp / (tp + fp):.3f} recall {tp / (tp + fn):.3f}")
Saída
tumours 569, benign 357, always-benign accuracy 0.627
t=0.5: TP 53 FN 11 FP 2 precision 0.964 recall 0.828
t=0.1: TP 61 FN 3 FP 13 precision 0.824 recall 0.953
Em 0,5 o recall é 0,828 aqui, como no lab, mas em 0,1 é 0,953 contra os 96,9% do lab, e os alarmes falsos são 13 em vez de 20. O recall muda de uma divisão para outra, que é justamente o ponto da lição 2. Baixar o limiar de 0,5 para 0,1 ainda aumenta o recall e diminui a precisão, como diz a lição. A baseline de “sempre benigno” parece decente pela acurácia e não encontra nenhum câncer.
Baixar o notebook (.ipynb). Abra no Jupyter ou envie para o Google Colab; ele baixa sozinho os dados que faltarem.
Para quem pratica
- Informe a precisão e o recall (ou a matriz de confusão inteira) ao lado da acurácia, e diga sempre qual classe é a “positiva”.
- Escolha o limiar com dados de validação, a partir do custo de cada erro, não por hábito. O 0,5 padrão é só uma convenção.
- Calcule sempre a baseline de prever a classe majoritária. Se sua acurácia estiver perto dela, o modelo aprendeu pouco.
- Recall e precisão em um limiar são um ponto de uma curva. Para comparar dois modelos com justiça, compare-os no mesmo recall ou olhe a curva precisão-recall inteira.
- Uma pontuação é apenas um ranking, a menos que seja calibrada. Não leia 0,3 como “30% de chance” sem verificar a calibração.
Isto foi útil?
Obrigado! Isso nos ajuda a melhorar.
Vá mais fundo no Atlas
Verbetes da enciclopédia sobre as ideias desta aula: