Confusion Matrix
Uma matriz de confusão contabiliza as previsões de um modelo em relação aos rótulos verdadeiros, classe por classe. Veja como interpretá-la, quais métricas ela fornece e como é sua versão para detecção.
Uma matriz de confusão é uma tabela que contabiliza a correspondência entre as previsões de um modelo de classificação e os rótulos verdadeiros. Um eixo apresenta as classes reais e o outro as classes previstas, e cada célula contabiliza os exemplos que pertencem a esse par. As previsões corretas ficam na diagonal e todos os erros ficam fora dela, na célula que indica exatamente qual classe foi confundida com outra. Por isso, a matriz de confusão é a primeira forma habitual de observar os erros de um modelo e a origem da precisão global, da precisão, da revocação e do F1-score.
Ler uma matriz de confusão binária#
Com duas classes, a matriz tem quatro células:
- Verdadeiros positivos (TP): exemplos positivos previstos como positivos, como uma peça defeituosa assinalada como defeituosa.
- Falsos positivos (FP): exemplos negativos previstos como positivos, também chamados erros de tipo I ou falsos alarmes.
- Falsos negativos (FN): exemplos positivos previstos como negativos, também chamados erros de tipo II ou omissões.
- Verdadeiros negativos (TN): exemplos negativos previstos como negativos.
A maioria das métricas binárias são rácios destes quatro valores. A precisão é TP / (TP + FP), a revocação é TP / (TP + FN) e a precisão global é (TP + TN) dividido pela soma dos quatro valores. A célula fora da diagonal que mais importa depende da aplicação: um rastreio de cancro é ajustado para manter os falsos negativos baixos, enquanto um filtro de spam é ajustado para manter os falsos positivos baixos.
Matrizes de confusão multiclasse#
Com N classes, a matriz é N × N. Na orientação usada pelo confusion_matrix do scikit-learn, cada linha corresponde a uma classe verdadeira e cada coluna a uma classe prevista. A leitura de uma linha mostra onde foram parar os exemplos dessa classe, pelo que a célula diagonal dividida pelo total da linha corresponde à revocação da classe. A leitura de uma coluna mostra o que eram realmente as previsões do modelo para essa classe, pelo que a célula diagonal dividida pelo total da coluna corresponde à precisão da classe. Algumas ferramentas apresentam a matriz transposta, por isso os rótulos dos eixos determinam como ler o gráfico.
from sklearn.metrics import confusion_matrix
# Rótulos verdadeiros e previstos para 10 imagens
y_true = ["cat", "cat", "cat", "dog", "dog", "dog", "dog", "fox", "fox", "fox"]
y_pred = ["cat", "cat", "dog", "dog", "dog", "dog", "cat", "fox", "dog", "fox"]
# As linhas são as classes verdadeiras e as colunas são as classes previstas, nesta ordem de rótulos
labels = ["cat", "dog", "fox"]
matrix = confusion_matrix(y_true, y_pred, labels=labels)
print(matrix)As linhas apresentadas para cat, dog e fox são [2 1 0], [1 3 0] e [0 1 2]. A diagonal contém 7 das 10 imagens, pelo que a precisão global é 0.7. A coluna dog inclui um cat e um fox, o que resulta numa precisão de dog de 3 / 5 = 0.6; a linha dog perde uma imagem para cat, o que resulta numa revocação de dog de 3 / 4 = 0.75. Uma matriz normalizada divide cada célula pelo total da respetiva classe verdadeira, pelo que a diagonal apresenta a revocação por classe e as classes com dimensões muito diferentes se tornam comparáveis.
Matrizes de confusão para deteção de objetos#
A deteção acrescenta uma classe de fundo, porque um detetor pode apresentar uma caixa onde não existe nada ou não detetar um objeto. Primeiro, as previsões são associadas aos rótulos através da interseção sobre união (IoU) e, em seguida, contabilizadas: os pares associados ficam nas células das classes, as previsões sem correspondência contam como falsos positivos contra o fundo e os rótulos sem correspondência contam como falsos negativos previstos como fundo. A célula fundo-fundo permanece vazia, porque não é possível contabilizar regiões vazias da imagem; por isso, uma matriz de deteção não tem verdadeiros negativos. A validação do YOLO26 constrói esta matriz com uma linha e uma coluna adicionais para o fundo, associando previsões a rótulos com um IoU superior a 0.45, e guarda-a como confusion_matrix.png, com as classes previstas no eixo vertical e as classes verdadeiras no eixo horizontal.
from ultralytics import YOLO
# Load a pretrained YOLO26 nano detector
model = YOLO("yolo26n.pt")
# Validation builds the confusion matrix and saves it as confusion_matrix.png
metrics = model.val(data="coco8.yaml")
matrix = metrics.confusion_matrix.matrix # rows: predicted class, columns: true class
# 80 COCO classes plus one background row and column
print(matrix.shape)
# Class 0 is "person": correct detections and people the model missed
print(f"Person TP: {matrix[0, 0]:.0f}, missed: {matrix[-1, 0]:.0f}")A forma é (81, 81), e a última linha contabiliza as pessoas anotadas às quais nenhuma previsão correspondeu.
Matriz de confusão e ferramentas relacionadas#
- Curva ROC: um ponto por cada limiar de decisão; cada ponto resume a matriz de confusão desse limiar através da taxa de verdadeiros positivos e da taxa de falsos positivos.
- Precisão média (mAP): a principal pontuação de deteção, calculada com as mesmas decisões de TP e FP ao longo de todos os níveis de confiança, sem mostrar quais as classes que se confundem.
- Precisão global: a matriz reduzida a um número, a diagonal dividida pelo total. Num conjunto de dados com 95% de exemplos negativos, um modelo que prevê sempre "negativo" obtém uma precisão global de 95%, apesar de a matriz mostrar zero verdadeiros positivos.










