Matriz de Confusão

O que é uma matriz de confusão

Uma matriz de confusão (confusion matrix) é um resumo compacto de como os rótulos previstos (predicted labels) de um classificador (classifier) se comparam aos rótulos verdadeiros (ground truth). Ela contabiliza com que frequência ocorre cada tipo de previsão correta e incorreta.

Ela é uma das ferramentas mais úteis para:

  • entender quais tipos de erros um modelo comete (e não apenas “quantos”)
  • derivar muitas métricas comuns de classificação (precisão, revocação, F1, especificidade, acurácia balanceada, …)
  • realizar análise de erros e depuração direcionadas (veja Análise de Erros (Fatiamento))

Um detalhe importante: a matriz de confusão é definida sobre previsões de classe discretas (hard class predictions) (rótulos). Se o seu modelo produz probabilidades ou pontuações (scores), você deve escolher uma regra de decisão (decision rule) (frequentemente um limiar) para convertê-las em rótulos.

Matriz de confusão na classificação binária

Em classificação binária (binary classification), os rótulos geralmente são “positivo” (1) e “negativo” (0). A matriz de confusão é uma tabela 2×2:

  • TP (verdadeiros positivos (true positives)): previsto como positivo, na realidade positivo
  • FP (falsos positivos (false positives)): previsto como positivo, na realidade negativo
  • TN (verdadeiros negativos (true negatives)): previsto como negativo, na realidade negativo
  • FN (falsos negativos (false negatives)): previsto como negativo, na realidade positivo

Um arranjo comum é:

  • linhas = real (verdade de referência)
  • colunas = previsto
Positivo Previsto Negativo Previsto
Positivo Real TP FN
Negativo Real FP TN

Algumas bibliotecas trocam os eixos (previsto vs real). Sempre verifique a documentação e rotule sua matriz explicitamente.

Exemplo prático (binário)

Suponha que um modelo de triagem médica preveja se um paciente tem uma doença (positivo) ou não (negativo). Em um conjunto de teste de 100 pacientes:

  • 15 realmente têm a doença
  • o modelo prevê 20 positivos
  • desses 20 positivos previstos, 12 estão corretos (TP)
  • portanto FP = 20 − 12 = 8
  • se 15 são realmente positivos e TP = 12, então FN = 15 − 12 = 3
  • o total de negativos é 85; com FP = 8, TN = 85 − 8 = 77

Então:

  • TP = 12
  • FP = 8
  • FN = 3
  • TN = 77

Interpretando as contagens:

  • FP = 8 significa que 8 pacientes saudáveis foram sinalizados (possível acompanhamento desnecessário).
  • FN = 3 significa que 3 pacientes doentes foram perdidos (potencialmente perigoso).

Métricas derivadas da matriz de confusão binária

Muitas métricas amplamente usadas são funções simples de TP/FP/TN/FN.

Seja (N = TP + FP + TN + FN).

Precisão (precision) (Valor Preditivo Positivo)

Precisão responde: Quando o modelo prevê positivo, com que frequência ele está correto?

[ \text{Precisão} = \frac{TP}{TP + FP} ]

  • Alta precisão significa poucos falsos alarmes (FP baixo).
  • Muitas vezes é importante quando falsos positivos são custosos (por exemplo, disparar uma revisão manual cara).

Exemplo: [ \text{Precisão} = \frac{12}{12+8} = 0.60 ]

Revocação (recall) (Sensibilidade, Taxa de Verdadeiros Positivos)

Revocação responde: Dos positivos reais, quantos capturamos?

[ \text{Revocação} = \frac{TP}{TP + FN} ]

  • Alta revocação significa que você deixa passar poucos positivos (FN baixo).
  • Muitas vezes é importante em tarefas de detecção críticas para segurança.

Exemplo: [ \text{Revocação} = \frac{12}{12+3} = 0.80 ]

Pontuação F1 (F1 score)

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

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

Ela equilibra precisão e revocação e é mais informativa quando você se importa com ambas.

Exemplo:

  • Precisão = 0.60, Revocação = 0.80

[ \text{F1} = \frac{2 \cdot 0.60 \cdot 0.80}{0.60 + 0.80} \approx 0.686 ]

Especificidade (specificity) (Taxa de Verdadeiros Negativos)

Especificidade responde: Dos negativos reais, quantos rejeitamos corretamente?

[ \text{Especificidade} = \frac{TN}{TN + FP} ]

  • Alta especificidade significa poucos falsos positivos.

Exemplo: [ \text{Especificidade} = \frac{77}{77+8} \approx 0.906 ]

Acurácia balanceada (balanced accuracy)

A acurácia simples pode ser enganosa quando as classes são desbalanceadas. A acurácia balanceada faz a média do desempenho em positivos e negativos:

[ \text{Acurácia Balanceada} = \frac{1}{2}\left(\frac{TP}{TP+FN} + \frac{TN}{TN+FP}\right) = \frac{\text{Revocação} + \text{Especificidade}}{2} ]

Exemplo:

  • Revocação = 0.80
  • Especificidade ≈ 0.906

[ \text{Acurácia Balanceada} \approx \frac{0.80 + 0.906}{2} \approx 0.853 ]

A acurácia balanceada é discutida com frequência no contexto de Desbalanceamento de Classes.

(Opcional, mas comum) Acurácia (accuracy) e taxa de erro (error rate)

Embora não solicitado, ajuda contrastar:

[ \text{Acurácia} = \frac{TP + TN}{N} \quad,\quad \text{Taxa de Erro} = 1 - \text{Acurácia} ]

Exemplo: [ \text{Acurácia} = \frac{12+77}{100} = 0.89 ]

Note que a acurácia (0.89) parece “ótima”, embora a precisão (0.60) indique muitos falsos alarmes entre os positivos previstos.

Escolhendo um limiar de decisão (pontuações → rótulos)

A maioria dos classificadores modernos produz uma pontuação ou probabilidade (p(y=1 \mid x)). Para construir uma matriz de confusão, você deve escolher um limiar (threshold) (t):

  • prever positivo se (p \ge t)
  • caso contrário, prever negativo

Como o limiar afeta a matriz de confusão

Aumentar o limiar tipicamente:

  • diminui os positivos previstos
  • muitas vezes diminui FP (melhor precisão / especificidade)
  • muitas vezes aumenta FN (pior revocação)

Diminuir o limiar tipicamente:

  • aumenta os positivos previstos
  • muitas vezes aumenta TP (melhor revocação)
  • muitas vezes aumenta FP (pior precisão / especificidade)

Esse trade-off está intimamente relacionado à análise de Característica de Operação do Receptor (ROC) e aos trade-offs de precisão–revocação (cobertos de forma mais ampla em Métricas).

A escolha do limiar deve refletir seu objetivo

Abordagens comuns:

  • Limiar baseado em custo: escolher (t) para minimizar o custo esperado de FP vs FN.
  • Baseado em restrições: por exemplo, “a revocação deve ser ≥ 0.95” e então escolher a maior precisão que satisfaça isso.
  • Maximizar uma métrica em um conjunto de validação: por exemplo, maximizar F1 (cuidado: pode não corresponder aos custos do negócio).

Prática importante:

A calibração importa

Se você interpreta as saídas do modelo como probabilidades, deve se importar com calibração (calibration). Um limiar de 0.5 só tem um significado natural quando as probabilidades estão razoavelmente calibradas. Veja Calibração.

Armadilhas do desbalanceamento de classes

Em conjuntos de dados desbalanceados (por exemplo, 1% de positivos, 99% de negativos), métricas derivadas da matriz de confusão podem se comportar de maneira muito diferente:

  • A acurácia pode ser inútil: prever sempre “negativo” produz 99% de acurácia, mas revocação zero.
  • A precisão depende da prevalência: mesmo uma pequena taxa de FP pode superar TP quando negativos dominam.
  • Acurácia balanceada, revocação, especificidade costumam ser mais informativas do que acurácia.
  • Sempre reporte as contagens brutas (TP/FP/TN/FN) junto com as taxas quando possível.

Exemplo (desbalanceamento extremo):

  • 10.000 exemplos; 100 positivos, 9.900 negativos
  • Suponha revocação = 0.90 → TP = 90, FN = 10
  • Se especificidade = 0.99 → FP = 99 (1% de 9.900), TN = 9.801
    Então a precisão é: [ \text{Precisão} = \frac{90}{90+99} \approx 0.476 ] Apesar da especificidade “excelente”, quase metade das previsões positivas é falsa devido à taxa base.

É por isso que a classificação com desbalanceamento é um tópico à parte: Desbalanceamento de Classes.

Matriz de confusão multiclasse

Em classificação multiclasse (multiclass classification) com (K) classes, a matriz de confusão é (K \times K):

  • entrada (C_{i,j}) = número de exemplos cuja classe verdadeira é (i) e cuja classe prevista é (j)

Interpretação-chave:

  • A diagonal (C_{i,i}) são as previsões corretas por classe.
  • Entradas fora da diagonal mostram quais classes o modelo confunde (por exemplo, “gato” rotulado incorretamente como “cachorro”).

Exemplo prático (3 classes)

Suponha que as classes sejam A, B, C. Uma matriz de confusão (linhas=real, colunas=previsto) poderia ser:

[ C = \begin{bmatrix} 50 & 2 & 3 \ 6 & 40 & 4 \ 1 & 5 & 30 \end{bmatrix} ]

Exemplos de interpretação:

  • Para a classe verdadeira B (segunda linha), 6 foram previstos como A, 40 corretos, 4 previstos como C.
  • O modelo confunde B→A mais frequentemente do que A→B (6 vs 2), o que pode sugerir ambiguidade assimétrica ou problemas no conjunto de dados.

Derivando TP/FP/FN por classe em multiclasse (um-contra-o-resto (one-vs-rest))

Para métricas multiclasse como precisão/revocação por classe, você normalmente trata cada classe (k) como “positiva” versus “todas as outras” como “negativas”:

  • (TP_k = C_{k,k})
  • (FN_k = \sum_{j \ne k} C_{k,j}) (verdadeiro k, previsto não k)
  • (FP_k = \sum_{i \ne k} C_{i,k}) (previsto k, verdadeiro não k)
  • (TN_k = \sum_{i \ne k}\sum_{j \ne k} C_{i,j}) (todo o resto)

Então calcule: [ \text{Precisão}_k = \frac{TP_k}{TP_k + FP_k} \quad,\quad \text{Revocação}_k = \frac{TP_k}{TP_k + FN_k} ]

É assim que a maioria das bibliotecas calcula relatórios de classificação por classe.

Médias micro, macro e ponderada

Quando você quer um único número entre as classes:

  • Média macro (macro average): calcula a média da métrica entre as classes com pesos iguais (trata cada classe como igualmente importante).
  • Macro ponderada (weighted macro): calcula a média da métrica ponderada pelo suporte da classe (número de instâncias verdadeiras por classe).
  • Média micro (micro average): agrega TP/FP/FN em todas as classes primeiro e então calcula a métrica (frequentemente dominada por classes frequentes).

Qual usar depende de se classes minoritárias importam. A média macro costuma ser preferida quando há desbalanceamento significativo e você se importa com todas as classes.

Matrizes de confusão normalizadas

As contagens brutas são essenciais, mas a normalização pode facilitar a comparação de padrões.

Duas normalizações comuns:

  1. Normalizada por linha (pela classe verdadeira): cada linha soma 1

    • interpreta como: dada a classe verdadeira, como o modelo distribui as previsões?
    • destaca um comportamento semelhante à revocação por classe.
  2. Normalizada por coluna (pela classe prevista): cada coluna soma 1

    • interpreta como: dada a classe prevista, qual era a distribuição das classes verdadeiras?
    • relaciona-se a um comportamento semelhante à precisão.

Seja explícito sobre qual normalização você usa; elas respondem a perguntas diferentes.

Calculando uma matriz de confusão na prática (Python)

Usando scikit-learn

import numpy as np
from sklearn.metrics import confusion_matrix, precision_score, recall_score, f1_score

y_true = np.array([1,0,1,1,0,0,1,0,0,1])
y_prob = np.array([0.9,0.2,0.8,0.4,0.7,0.1,0.6,0.3,0.2,0.9])

threshold = 0.5
y_pred = (y_prob >= threshold).astype(int)

cm = confusion_matrix(y_true, y_pred)  # by default: rows=true, cols=pred
print(cm)
# [[TN FP]
#  [FN TP]]  <-- note sklearn's binary layout ordering is [[0,0],[1,1]]

tn, fp, fn, tp = cm.ravel()

precision = tp / (tp + fp) if (tp + fp) else 0.0
recall = tp / (tp + fn) if (tp + fn) else 0.0
specificity = tn / (tn + fp) if (tn + fp) else 0.0
f1 = 2 * precision * recall / (precision + recall) if (precision + recall) else 0.0
balanced_acc = 0.5 * (recall + specificity)

print({"tp": tp, "fp": fp, "tn": tn, "fn": fn})
print({"precision": precision, "recall": recall, "f1": f1,
       "specificity": specificity, "balanced_acc": balanced_acc})

# Cross-check with sklearn’s metric helpers:
print("sk_precision", precision_score(y_true, y_pred))
print("sk_recall", recall_score(y_true, y_pred))
print("sk_f1", f1_score(y_true, y_pred))

Notas:

  • O confusion_matrix do scikit-learn retorna classes em ordem ordenada; em binário, isso geralmente é 0 e depois 1.
  • Sempre verifique como a matriz está organizada antes de extrair TP/FP/TN/FN.

Como interpretar e usar matrizes de confusão para melhorar modelos

Uma matriz de confusão é mais do que um gerador de métricas; é uma ferramenta de depuração.

Formas práticas de usá-la:

  • Identificar confusões sistemáticas (multiclasse): se “caminhão” é frequentemente previsto como “carro”, você pode precisar de mais exemplos representativos de caminhões, melhores atributos, ou limpeza de rótulos.
  • Ajuste direcionado de limiar (binário): se FNs estiverem altos demais, reduza o limiar (e então verifique o impacto em FP).
  • Fatiar por coortes: calcule matrizes de confusão por subgrupo (região, tipo de dispositivo, grupo demográfico, faixa de dificuldade) para detectar falhas ocultas. Isso se conecta diretamente à Análise de Erros (Fatiamento).
  • Comparar modelos além de um único número: dois modelos podem ter a mesma acurácia, mas perfis de FP/FN muito diferentes, implicando custos reais distintos.

Armadilhas comuns e boas práticas

  • Defina explicitamente a classe “positiva”: métricas como precisão/revocação dependem de qual classe é tratada como positiva.
  • Reporte contagens, não apenas taxas: precisão=0.9 significa coisas diferentes com 10 previsões vs 10.000.
  • Evite “hackear” o limiar no conjunto de teste: escolha limiares usando dados de validação e então avalie uma única vez no teste.
  • Considere a qualidade das probabilidades: se você precisa de decisões baseadas em probabilidade, avalie a calibração (veja Calibração).
  • Use a média apropriada em multiclasse: macro vs micro vs ponderada pode mudar conclusões drasticamente sob desbalanceamento de classes.
  • Pense em custos reais: FP e FN raramente custam o mesmo em sistemas reais; escolha métricas e limiares de acordo.

Resumo

Uma matriz de confusão enumera como previsões se alinham com a verdade de referência. Em classificação binária, ela fornece TP/FP/TN/FN; em multiclasse, generaliza para uma matriz (K \times K). Muitas métricas centrais—precisão, revocação, F1, especificidade e acurácia balanceada—são funções diretas dessas contagens. Como matrizes de confusão dependem de decisões discretas, a escolha do limiar e a calibração de probabilidades importam, e o desbalanceamento de classes pode tornar métricas ingênuas (especialmente acurácia) enganosas. Usadas com critério, matrizes de confusão oferecem tanto avaliação quantitativa quanto insights acionáveis sobre modos de falha do modelo.