Ir para o conteúdo

Classificação & Métricas

A classificação é o aprendizado supervisionado com alvo categórico: spam/não spam, inadimplente/pagador, doente/saudável, ou uma dentre muitas classes (dígito 0–9). As Partes IV e V constroem um portfólio de classificadores; esta aula constrói a ferramenta de que você precisa antes de qualquer um deles — saber como medir se um classificador é bom. Escolher a métrica errada não é um detalhe: silenciosamente otimiza o comportamento errado.

A matriz de confusão

Para um problema binário, chame uma classe de positiva (geralmente a rara/interessante: fraude, doença) e a outra de negativa. Toda previsão cai em uma de quatro células:

Previsto positivo Previsto negativo
Realmente positivo VP (verdadeiro positivo) FN (falso negativo) — escape
Realmente negativo FP (falso positivo) — alarme falso VN (verdadeiro negativo)
from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay
confusion_matrix(y_test, y_pred)          # linhas = verdade, colunas = previsão
ConfusionMatrixDisplay.from_estimator(model, X_test, y_test)

Os dois tipos de erro geralmente têm custos muito diferentes: um câncer não detectado (FN) não é o mesmo que um exame de acompanhamento desnecessário (FP); uma transação legítima bloqueada (FP) não é o mesmo que uma fraude aprovada (FN). As métricas existem para pesá-los explicitamente.

Acurácia — e por que ela mente

\[ \text{Acurácia} = \frac{VP + VN}{VP + VN + FP + FN} \]

A acurácia responde "que fração das previsões estava certa?" — razoável quando as classes são balanceadas e os erros custam o mesmo. Mas com classes desbalanceadas ela degenera. Fraude é 0,5% das transações? A regra burra "tudo é legítimo" pontua 99,5% de acurácia enquanto pega zero fraude.

O paradoxo da acurácia

Em problemas desbalanceados, alta acurácia pode descrever um modelo inútil. Sempre compare com a baseline da classe majoritária (DummyClassifier) e recorra às métricas abaixo.

Precisão e revocação

Ambas focam na classe positiva, respondendo a perguntas diferentes:

\[ \text{Precisão} = \frac{VP}{VP + FP} \qquad\qquad \text{Revocação} = \frac{VP}{VP + FN} \]
  • Precisãodos casos que sinalizei, quantos eram reais? Precisão alta = poucos alarmes falsos;
  • Revocação (sensibilidade) — dos casos reais, quantos eu peguei? Revocação alta = poucos escapes.

Elas puxam em direções opostas: sinalize mais agressivamente e a revocação sobe enquanto a precisão cai; sinalize com cautela e o inverso. Qual priorizar é uma decisão de domínio:

Aplicação Erro custoso Priorizar
Rastreio de câncer deixar de detectar um paciente (FN) revocação
Filtro de spam perder um e-mail real (FP) precisão
Triagem de fraude para revisão humana desperdiçar tempo do analista (FP) vs fraude não detectada (FN) equilíbrio — depende da capacidade

F1: um número quando você precisa de um só

A média harmônica de precisão e revocação:

\[ F_1 = 2 \cdot \frac{\text{Precisão} \cdot \text{Revocação}}{\text{Precisão} + \text{Revocação}} \]

A média harmônica pune o desequilíbrio: precisão 1,0 com revocação 0,02 dá \(F_1 \approx 0.04\), não a média aritmética 0,51 — você não consegue comprar um bom F1 maximizando um lado só. O \(F_\beta\) geral pesa a revocação \(\beta\) vezes mais que a precisão (\(F_2\) para rastreio, \(F_{0.5}\) para spam).

from sklearn.metrics import classification_report
print(classification_report(y_test, y_pred))

Multiclasse

A matriz de confusão se generaliza para \(k \times k\) — as células fora da diagonal revelam quais classes são confundidas (diagnósticos úteis: o modelo está misturando 4 e 9?). Precisão/revocação/F1 por classe são combinados por:

  • média macro — média sobre as classes, todas iguais (classes pequenas contam integralmente);
  • média ponderada (weighted) — média ponderada pela frequência da classe;
  • média micro — calculada a partir das contagens agregadas (igual à acurácia em problemas de rótulo único).

Em dados multiclasse desbalanceados, reporte o macro-F1: ele expõe falhas em classes raras que as médias ponderadas escondem.

Escores, limiares e calibração

A maioria dos classificadores produz um escore ou probabilidade, e o rótulo vem de um limiar (padrão 0,5):

proba = model.predict_proba(X_test)[:, 1]
y_pred = (proba >= 0.5).astype(int)       # o limiar é uma escolha!

Mover o limiar troca precisão por revocação — abaixe-o para pegar mais positivos (revocação ↑, precisão ↓), aumente-o para alarmes mais limpos. O limiar é uma decisão de negócio aplicada após o treino, e avaliar um modelo em todos os limiares é exatamente o que as curvas ROC e precisão–revocação fazem — o tema de ROC-AUC & Dados Desbalanceados.

Quando as próprias probabilidades previstas importam (precificação de risco, ordenação de triagem), verifique a calibração: entre os casos previstos como "70%", cerca de 70% acabam sendo positivos? (sklearn.calibration.CalibrationDisplay).

Material de aula

Notebook da aula (em português)

Notebook prático usado em sala — Aula 13 — Classificação de Dados: abrir no Colab


Quiz