Receiver Operating Characteristic (ROC) Curve
Uma curva característica de operação do recetor (ROC) representa a taxa de verdadeiros positivos em função da taxa de falsos positivos para cada limiar. Como a interpretar, AUC e código.
Uma curva da característica de operação do recetor (ROC) é um gráfico que mostra o desempenho de um classificador binário na separação de duas classes para todos os limiares de decisão possíveis. Representa a taxa de verdadeiros positivos no eixo y em função da taxa de falsos positivos no eixo x, com um ponto por cada limiar aplicado às pontuações do modelo, pelo que um único gráfico abrange todas as compensações entre detetar positivos e gerar falsos alarmes. A sua área, a área sob a curva (AUC), resume o gráfico num único valor independente do limiar. O nome tem origem na engenharia de radares da Segunda Guerra Mundial, onde media a capacidade dos operadores de recetores de radar para distinguir aeronaves inimigas do ruído; mais tarde, o método estendeu-se à medicina, à psicologia e à aprendizagem automática (ML).
Como se constrói uma curva ROC#
Cada ponto da curva provém de uma matriz de confusão calculada com um determinado limiar:
- Taxa de verdadeiros positivos (TPR), também chamada revocação ou sensibilidade: TP / (TP + FN), a proporção de positivos reais assinalados pelo modelo.
- Taxa de falsos positivos (FPR): FP / (FP + TN), a proporção de negativos reais assinalados incorretamente. A FPR é igual a 1 menos a especificidade.
Ao percorrer o limiar de um valor alto para um baixo, a curva vai de (0, 0), onde nada é assinalado, a (1, 1), onde tudo é assinalado. Um classificador que ordena todos os positivos acima de todos os negativos passa pelo canto superior esquerdo; um modelo que adivinha aleatoriamente segue a diagonal; e uma curva abaixo da diagonal significa que as pontuações estão invertidas. A AUC equivale à probabilidade de um positivo escolhido aleatoriamente receber uma pontuação superior à de um negativo escolhido aleatoriamente, por isso 0.5 corresponde ao acaso e 1.0 à separação perfeita. Para construir a curva, são necessárias pontuações contínuas, como probabilidades previstas ou valores de confiança, pois as etiquetas binárias 0/1 fornecem apenas um ponto. O exemplo seguinte treina um classificador de regressão logística num conjunto de dados desequilibrado e calcula a sua curva com o roc_curve do 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}")O modelo atinge uma AUC de 0.963. Com um limiar de 0.44, deteta 82% dos positivos com uma FPR de 0.01, enquanto atingir uma revocação de 95% exige baixar o limiar para 0.02, o que faz a FPR subir para 0.26. Nesta divisão de teste, com 130 positivos e 1,120 negativos, detetar mais 18 positivos custa mais 279 falsos alarmes.
Escolher um ponto de operação#
A curva mostra o custo de cada limiar, e a aplicação decide qual é o custo aceitável:
- Rastreio médico: Não detetar um tumor é muito mais prejudicial do que realizar um exame de acompanhamento, por isso as ferramentas de rastreio funcionam num ponto de TPR elevada e aceitam mais falsos positivos para serem analisados por radiologistas.
- Deteção de fraude: Cada pagamento legítimo bloqueado causa transtorno ao cliente, por isso os bancos escolhem um ponto que detete a maior parte das fraudes e mantenha a FPR num nível suportável para as equipas de análise e os clientes.
- Custos iguais: Quando ambos os erros têm o mesmo custo, a estatística J de Youden — TPR menos FPR — escolhe o ponto mais afastado acima da diagonal.
Os modelos de classificação Ultralytics YOLO26 devolvem uma probabilidade para cada classe em results[0].probs.data, as pontuações contínuas necessárias à análise ROC; assim, recolher a probabilidade de uma classe num conjunto de validação etiquetado fornece a curva ROC dessa classe contra todas as outras e permite escolher um limiar adequado aos custos da implementação.
Curva ROC vs. ferramentas relacionadas#
Uma curva de precisão-revocação representa a precisão em função da revocação, em vez da TPR em função da FPR. Como a TPR e a FPR são calculadas dentro de cada classe, uma curva ROC mantém-se igual quando os positivos se tornam mais raros, enquanto a precisão diminui. Quando os positivos são raros, como na deteção de fraude ou na deteção de anomalias, uma FPR baixa pode ainda significar mais falsos alarmes do que deteções verdadeiras, e um estudo da PLOS ONE sobre conjuntos de dados desequilibrados concluiu que, nessa situação, os gráficos de precisão-revocação são mais informativos. A deteção de objetos é avaliada com curvas de precisão-revocação e precisão média (mAP) por um motivo semelhante: as regiões de fundo que contariam como verdadeiros negativos não têm limites, pelo que a FPR não tem um denominador fixo.
- Precisão e pontuação F1: Valores únicos medidos com um só limiar, enquanto a curva ROC e a respetiva AUC resumem todos os limiares.
- Classificação de imagens com muitas classes: Cada classe tem uma curva ROC contra todas as outras, e as AUC por classe são calculadas numa média macro ou ponderada pela prevalência, que o
roc_auc_scoredo scikit-learn calcula commulti_class="ovr".










