Confusion Matrix
Una matrice di confusione conta le previsioni di un modello rispetto alle etichette vere, classe per classe. Scopri come leggerla, quali metriche fornisce e come si presenta nella rilevazione.
Una matrice di confusione è una tabella che conta quanto le previsioni di un modello di classificazione corrispondono alle etichette reali. Un asse elenca le classi effettive e l'altro le classi previste; ogni cella conta gli esempi appartenenti a quella coppia. Le previsioni corrette si trovano sulla diagonale, mentre ogni errore è fuori diagonale, nella cella che indica esattamente quale classe è stata confusa con quale altra. Per questo la matrice di confusione è la prima panoramica standard degli errori di un modello e la fonte di accuratezza, precisione, richiamo e F1-score.
Come leggere una matrice di confusione binaria#
Con due classi, la matrice ha quattro celle:
- Veri positivi (TP): esempi positivi previsti come positivi, per esempio un componente difettoso segnalato come difettoso.
- Falsi positivi (FP): esempi negativi previsti come positivi, detti anche errori di tipo I o falsi allarmi.
- Falsi negativi (FN): esempi positivi previsti come negativi, detti anche errori di tipo II o mancate rilevazioni.
- Veri negativi (TN): esempi negativi previsti come negativi.
La maggior parte delle metriche binarie è costituita da rapporti tra questi quattro conteggi. La precisione è TP / (TP + FP), il richiamo è TP / (TP + FN) e l'accuratezza è (TP + TN) diviso per la somma di tutti e quattro. Quale cella fuori diagonale sia più importante dipende dall'applicazione: uno screening del cancro è regolato per mantenere bassi i falsi negativi, mentre un filtro antispam è regolato per mantenere bassi i falsi positivi.
Matrici di confusione multiclasse#
Con N classi, la matrice è N × N. Nell'orientamento usato da scikit-learn, nella sua confusion_matrix, ogni riga rappresenta una classe reale e ogni colonna una classe prevista. Leggere una riga mostra dove sono finiti gli esempi di quella classe, quindi la cella diagonale divisa per il totale della riga corrisponde al richiamo della classe. Leggere una colonna mostra quali fossero davvero le previsioni del modello per quella classe, quindi la cella diagonale divisa per il totale della colonna corrisponde alla precisione della classe. Alcuni strumenti visualizzano la matrice trasposta, quindi per leggere un grafico bisogna fare riferimento alle etichette degli assi.
from sklearn.metrics import confusion_matrix
# Etichette reali e previste per 10 immagini
y_true = ["cat", "cat", "cat", "dog", "dog", "dog", "dog", "fox", "fox", "fox"]
y_pred = ["cat", "cat", "dog", "dog", "dog", "dog", "cat", "fox", "dog", "fox"]
# Le righe sono le classi reali e le colonne quelle previste, in quest'ordine di etichette
labels = ["cat", "dog", "fox"]
matrix = confusion_matrix(y_true, y_pred, labels=labels)
print(matrix)Le righe stampate per cat, dog e fox sono [2 1 0], [1 3 0] e [0 1 2]. La diagonale contiene 7 delle 10 immagini, quindi l'accuratezza è 0.7. La colonna dog raccoglie un cat e un fox, perciò la precisione di dog è 3 / 5 = 0.6; la riga dog perde un'immagine a favore di cat, perciò il richiamo di dog è 3 / 4 = 0.75. Una matrice normalizzata divide ogni cella per il totale della relativa classe reale, quindi la diagonale mostra il richiamo per classe e le classi di dimensioni molto diverse diventano confrontabili.
Matrici di confusione per il rilevamento di oggetti#
Il rilevamento aggiunge una classe di sfondo, perché un rilevatore può indicare un riquadro dove non c'è nulla oppure non rilevare affatto un oggetto. Prima, le predizioni vengono associate alle etichette tramite intersezione sull'unione (IoU), poi vengono conteggiate: le coppie associate finiscono nelle celle delle classi, le predizioni non associate contano come falsi positivi rispetto allo sfondo e le etichette non associate come falsi negativi previsti come sfondo. La cella sfondo-sfondo resta vuota perché non è possibile conteggiare regioni vuote dell'immagine, quindi una matrice di rilevamento non ha veri negativi. La validazione di YOLO26 costruisce questa matrice con una riga e una colonna aggiuntive per lo sfondo, associando le predizioni alle etichette con IoU superiore a 0.45, e la salva come confusion_matrix.png, con le classi previste sull'asse verticale e quelle reali sull'asse orizzontale.
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}")La forma è (81, 81) e l'ultima riga conta le persone etichettate che non sono state associate ad alcuna predizione.
Matrice di confusione e strumenti correlati#
- Curva ROC: un punto per ogni soglia decisionale; ciascun punto riassume la matrice di confusione di quella soglia come tasso di veri positivi e tasso di falsi positivi.
- Media della precisione media (mAP): il principale punteggio di rilevamento, calcolato usando le stesse decisioni TP e FP a tutti i livelli di confidenza, senza mostrare quali classi vengono confuse.
- Accuratezza: la matrice ridotta a un solo numero, cioè la diagonale divisa per il totale. In un dataset composto per il 95% da esempi negativi, un modello che prevede sempre "negativo" ottiene un'accuratezza del 95%, anche se la matrice mostra zero veri positivi.










