Receiver Operating Characteristic (ROC) Curve
Una curva caratteristica operativa del ricevitore (ROC) rappresenta il tasso di veri positivi rispetto al tasso di falsi positivi per ogni soglia. Scopri come leggerla, AUC e codice.
Una curva caratteristica operativa del ricevitore (ROC) è un grafico che mostra quanto bene un classificatore binario separa due classi per ogni possibile soglia decisionale. Riporta il tasso di veri positivi sull’asse y rispetto al tasso di falsi positivi sull’asse x, con un punto per ogni soglia applicata ai punteggi del modello, così un’unica immagine copre tutti i compromessi tra individuare i positivi e generare falsi allarmi. La sua area, l’area sotto la curva (AUC), riassume il grafico in un unico valore indipendente dalla soglia. Il nome deriva dall’ingegneria radar della Seconda guerra mondiale, in cui misurava quanto bene gli operatori dei ricevitori radar distinguevano gli aerei nemici dal rumore; in seguito il metodo si è diffuso in medicina, psicologia e machine learning (ML).
Come si costruisce una curva ROC#
Ogni punto della curva deriva da una matrice di confusione calcolata a una determinata soglia:
- Tasso di veri positivi (TPR), chiamato anche recall o sensibilità: TP / (TP + FN), la quota di positivi effettivi individuati dal modello.
- Tasso di falsi positivi (FPR): FP / (FP + TN), la quota di negativi effettivi segnalati erroneamente. L’FPR è uguale a 1 meno la specificità.
Facendo variare la soglia da un valore alto a uno basso, si traccia la curva da (0, 0), dove non viene segnalato nulla, a (1, 1), dove viene segnalato tutto. Un classificatore che assegna a ogni positivo un punteggio superiore a quello di ogni negativo passa per l’angolo in alto a sinistra, un modello che indovina a caso segue la diagonale e una curva sotto la diagonale indica che i punteggi sono invertiti. L’AUC equivale alla probabilità che un positivo scelto a caso riceva un punteggio superiore a quello di un negativo scelto a caso: 0.5 corrisponde al caso e 1.0 a una separazione perfetta. Per costruire la curva servono punteggi continui, come probabilità previste o valori di confidenza, perché le etichette binarie 0/1 forniscono un solo punto. L’esempio seguente addestra un classificatore di regressione logistica su un dataset sbilanciato e calcola la curva con roc_curve di scikit-learn:
import numpy as np
from sklearn.datasets import make_classification
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import roc_auc_score, roc_curve
from sklearn.model_selection import train_test_split
# Binary task where 10% of samples are positive
X, y = make_classification(n_samples=5000, weights=[0.9], class_sep=0.8, random_state=0)
X_train, X_test, y_train, y_test = train_test_split(X, y, stratify=y, random_state=0)
# ROC analysis needs continuous scores, not hard 0/1 predictions
scores = LogisticRegression().fit(X_train, y_train).predict_proba(X_test)[:, 1]
fpr, tpr, thresholds = roc_curve(y_test, scores)
print(f"AUC: {roc_auc_score(y_test, scores):.3f}")
# Each threshold is one point on the curve: higher recall costs more false alarms
for target in (0.80, 0.95):
i = np.argmax(tpr >= target) # first point that reaches the target TPR
print(f"Threshold {thresholds[i]:.2f}: TPR {tpr[i]:.2f}, FPR {fpr[i]:.2f}")Il modello raggiunge un’AUC di 0.963. Con una soglia di 0.44 individua l’82% dei positivi con un FPR di 0.01, mentre per raggiungere un recall del 95% occorre abbassare la soglia a 0.02, portando l’FPR a 0.26. In questa suddivisione di test, composta da 130 positivi e 1,120 negativi, individuare 18 positivi in più comporta 279 falsi allarmi in più.
Scegliere un punto operativo#
La curva mostra il costo di ogni soglia e l’applicazione decide quale costo è accettabile:
- Screening medico: Un tumore mancato è molto più costoso di un esame di controllo, quindi gli strumenti di screening operano con un TPR elevato e accettano più falsi positivi da sottoporre alla valutazione dei radiologi.
- Rilevamento delle frodi: Ogni pagamento legittimo bloccato crea disagi al cliente, quindi le banche scelgono un punto che individua la maggior parte delle frodi mantenendo l’FPR a un livello gestibile dai team di revisione e dai clienti.
- Costi uguali: Quando entrambi gli errori hanno lo stesso costo, la statistica J di Youden, TPR meno FPR, individua il punto più lontano sopra la diagonale.
I modelli di classificazione Ultralytics YOLO26 restituiscono in results[0].probs.data una probabilità per ogni classe, i punteggi continui necessari per l’analisi ROC; raccogliendo la probabilità di una classe su un set di validazione etichettato si ottiene la curva ROC uno contro tutti di quella classe e una soglia scelta in base ai costi della distribuzione.
Curva ROC e strumenti correlati#
Una curva precision-recall riporta la precision rispetto al recall invece del TPR rispetto all’FPR. Poiché TPR e FPR vengono calcolati ciascuno all’interno di una classe, una curva ROC non cambia quando i positivi diventano più rari, mentre la precision diminuisce. Quando i positivi sono rari, come nello screening delle frodi o nel rilevamento delle anomalie, anche un FPR basso può comportare più falsi allarmi che rilevamenti corretti; uno studio PLOS ONE sui dataset sbilanciati ha rilevato che in questo contesto i grafici precision-recall sono più informativi. Il rilevamento degli oggetti viene valutato con curve precision-recall e mean average precision (mAP) per un motivo simile: le regioni di sfondo che verrebbero conteggiate come veri negativi sono illimitate, quindi l’FPR non ha un denominatore fisso.
- Accuratezza e punteggio F1: Valori singoli misurati a una sola soglia, mentre la curva ROC e la sua AUC riassumono tutte le soglie.
- Classificazione di immagini con molte classi: Ogni classe ha una curva ROC uno contro tutti e le AUC per classe vengono mediate in un punteggio macro o ponderato per prevalenza, calcolato da scikit-learn con
roc_auc_scoretramitemulti_class="ovr".










