Pontuação F1
Visão geral
A pontuação F1 (F1 score) é uma métrica de avaliação amplamente usada para modelos de classificação. Ela é definida como a média harmônica (harmonic mean) da precisão (precision) e da revocação (recall), e foi projetada para resumir o compromisso entre precisão e revocação (precision–recall tradeoff) em um único número.
O F1 é especialmente popular quando:
- As classes são desbalanceadas (imbalanced) (por exemplo, detecção de fraude, triagem de doenças raras)
- Falsos positivos (false positives) e falsos negativos (false negatives) são importantes
- Você se importa mais com o desempenho na classe positiva do que em identificar corretamente os negativos
Como depende apenas de precisão e revocação, a pontuação F1 em grande parte ignora verdadeiros negativos (true negatives), o que é ao mesmo tempo uma característica (para problemas desbalanceados) e uma armadilha comum (quando verdadeiros negativos importam).
Para contexto sobre os componentes subjacentes, veja Precisão e Revocação e, para o compromisso completo ao longo dos limiares, veja Curva Precisão–Revocação (Precision–Recall Curve (PR Curve)).
Fundamentos da matriz de confusão
Para classificação binária, defina:
- TP: verdadeiros positivos (true positives) (predito positivo, de fato positivo)
- FP: falsos positivos (predicted positive, actually negative)
- FN: falsos negativos (predicted negative, actually positive)
- TN: verdadeiros negativos (predicted negative, actually negative)
A partir dessas contagens:
Precisão:
[ \text{Precision} = \frac{TP}{TP + FP} ] “Dos positivos preditos, quantos estavam corretos?”Revocação (também conhecida como sensibilidade (sensitivity), taxa de verdadeiros positivos (true positive rate, TPR)):
[ \text{Recall} = \frac{TP}{TP + FN} ] “Dos positivos reais, quantos encontramos?”
Acurácia (accuracy), por contraste, usa os quatro termos; veja Acurácia para entender por que ela pode ser enganosa sob desbalanceamento.
Definição da pontuação F1
A pontuação F1 é a média harmônica da precisão (P) e da revocação (R):
[ F_1 = \frac{2PR}{P + R} ]
Forma equivalente em termos das contagens da matriz de confusão:
[ F_1 = \frac{2TP}{2TP + FP + FN} ]
Por que a média harmônica?
A média harmônica penaliza fortemente casos em que uma quantidade é alta e a outra é baixa. Isso é desejável quando você quer que um modelo equilibre precisão e revocação em vez de otimizar apenas uma delas.
Intuição por exemplo:
- Se (P = 1.0) e (R = 0.0), então (F_1 = 0.0) (você não encontrou nenhum dos positivos).
- Se (P = 0.5) e (R = 0.5), então (F_1 = 0.5).
- Se (P = 0.9) e (R = 0.1), então (F_1 \approx 0.18) — baixo porque a revocação é ruim.
Exemplo prático (classificação binária)
Suponha que você construa um classificador para um evento raro (positivos são escassos). Em um conjunto de teste:
- TP = 40
- FP = 10
- FN = 60
- TN = 890
Calcule:
- Precisão (P = 40 / (40 + 10) = 0.80)
- Revocação (R = 40 / (40 + 60) = 0.40)
- F1 (= 2(0.8)(0.4)/(0.8 + 0.4) = 0.533...)
Embora a precisão seja alta (0.80), o modelo deixa passar muitos positivos (revocação 0.40), e o F1 reflete esse equilíbrio.
Observe que TN não aparece na fórmula do F1. Com 890 TN, a acurácia pareceria forte:
[ \text{Accuracy} = \frac{TP + TN}{TP+FP+FN+TN} = \frac{40+890}{1000} = 0.93 ]
Assim, a acurácia sugere “ótimo desempenho”, enquanto o F1 destaca a fraqueza na classe positiva.
O que o F1 resume (e o que não resume)
O que ele resume bem
O F1 é um resumo compacto do comportamento de um modelo na classe positiva:
- Ele recompensa encontrar positivos (revocação)
- Ele pune prever positivos em excesso (precisão)
Isso frequentemente é exatamente o que você quer em cenários desbalanceados, em que a classe negativa é “fácil” e abundante.
O que ele não captura
Como ignora TN, o F1 pode ficar cego para aspectos importantes do desempenho:
- Se negativos são caros de classificar incorretamente (custo de FP alto), você pode querer precisão muito alta, e não “equilíbrio”.
- Se rejeitar corretamente negativos é importante (por exemplo, filtragem de spam em escala enorme), métricas que envolvem TN (como especificidade (specificity)) podem importar.
- Se você precisa interpretar probabilidades e calibração, o F1 sozinho é insuficiente; veja conceitos relacionados a Calibração (se o seu wiki tiver) ou use regras de pontuação adequadas.
Relação com limiares
A maioria dos classificadores modernos produz um escore (score) ou probabilidade (probability) (por exemplo, regressão logística (logistic regression), redes neurais (neural networks)). Para produzir um rótulo de classe, você escolhe um limiar de decisão (decision threshold):
- Predizer positivo se escore ≥ limiar
- Caso contrário, predizer negativo
Mudar o limiar altera TP/FP/FN e, portanto, precisão, revocação e F1.
Comportamento típico do limiar
- Limiar menor → mais positivos preditos → revocação aumenta, precisão frequentemente diminui
- Limiar maior → menos positivos preditos → precisão aumenta, revocação diminui
Como o F1 depende de ambos, o limiar que maximiza o F1 geralmente não é o padrão 0,5 e depende de:
- O desbalanceamento de classes
- A distribuição dos escores
- Os custos relativos dos erros (mesmo que o próprio F1 não codifique custos)
F1 e a curva precisão–revocação
Ao longo dos limiares, você pode visualizar o compromisso usando a Curva Precisão–Revocação (Curva PR). O F1 corresponde a uma família particular de curvas iso-F1 no espaço precisão–revocação:
[ F_1 = \frac{2PR}{P+R} \quad \Rightarrow \quad R = \frac{F_1 P}{2P - F_1} ]
Na prática:
- Use curvas PR para entender o comportamento ao longo dos limiares
- Escolha limiares com base em necessidades operacionais (ou maximize F1 se “equilíbrio” for apropriado)
Exemplo de código: escolhendo um limiar para maximizar F1
import numpy as np
from sklearn.metrics import f1_score
# y_true: 0/1 labels, y_score: predicted probabilities or scores
def best_f1_threshold(y_true, y_score, thresholds=np.linspace(0, 1, 501)):
best = (-1, None)
for t in thresholds:
y_pred = (y_score >= t).astype(int)
f1 = f1_score(y_true, y_pred)
if f1 > best[0]:
best = (f1, t)
return best # (best_f1, threshold)
Cuidado: selecionar um limiar no conjunto de teste enviesará sua avaliação. Escolha o limiar em um conjunto de validação ou via validação cruzada (cross-validation).
F1 multiclasse: médias macro, micro e ponderada
O F1 é naturalmente definido para classificação binária, mas muitas tarefas são multiclasse (por exemplo, classificar tópicos de notícias). A abordagem comum é calcular precisão/revocação/F1 por classe usando a visão um-contra-o-resto (one-vs-rest) e então fazer a média.
Seja (F_{1,k}) a pontuação F1 para a classe (k), tratando a classe (k) como “positiva” e todas as outras classes como “negativas”.
F1 macro
O F1 macro faz a média das pontuações F1 por classe com pesos iguais:
[ F_1^{macro} = \frac{1}{K}\sum_{k=1}^{K} F_{1,k} ]
Use F1 macro quando:
- Você se importa igualmente com todas as classes
- Você quer evidenciar o desempenho em classes minoritárias (já que cada classe tem o mesmo peso)
O F1 macro pode ser baixo mesmo se a acurácia geral for alta, se classes minoritárias forem tratadas de forma ruim.
F1 ponderado
O F1 ponderado faz a média das pontuações F1 por classe ponderada pelo suporte (support) da classe (número de instâncias verdadeiras):
[ F_1^{weighted} = \sum_{k=1}^{K} w_k F_{1,k}, \quad w_k = \frac{n_k}{N} ]
Use F1 ponderado quando:
- Você quer uma pontuação “geral”, mas ainda calculada via desempenho por classe
- Você quer que classes majoritárias influenciem a métrica proporcionalmente
Cuidado: o F1 ponderado pode parecer bom mesmo se o F1 das classes minoritárias for ruim, porque as classes majoritárias dominam.
F1 micro
O F1 micro agrega as contribuições de todas as classes para calcular uma única precisão e revocação (somando TP, FP, FN em todas as classes) e então calcula o F1:
[ P^{micro} = \frac{\sum_k TP_k}{\sum_k (TP_k + FP_k)}, \quad R^{micro} = \frac{\sum_k TP_k}{\sum_k (TP_k + FN_k)} ] [ F_1^{micro} = \frac{2P^{micro}R^{micro}}{P^{micro}+R^{micro}} ]
Propriedades e intuição:
- A média micro dá o mesmo peso a cada exemplo, não a cada classe.
- Para classificação multiclasse de rótulo único (exatamente uma classe verdadeira por exemplo), F1 micro é igual à acurácia. Isso surpreende muitos profissionais e é uma fonte comum de confusão.
Assim, se seu objetivo é ser robusto ao desbalanceamento de classes em cenários multiclasse, o F1 macro costuma ser mais informativo do que o F1 micro.
Exemplo prático: mesmo modelo, médias muito diferentes
Imagine 3 classes com suportes:
- Classe A: 900 exemplos (fácil)
- Classe B: 90 exemplos (média)
- Classe C: 10 exemplos (rara)
Se o modelo vai bem em A, mas mal em C:
- F1 micro será dominado pela classe A e pode parecer forte.
- F1 macro penalizará o desempenho ruim em C, frequentemente revelando o problema.
- F1 ponderado fica entre os dois, mas ainda tende para A.
Exemplo de código: F1 multiclasse no scikit-learn
from sklearn.metrics import f1_score
# y_true and y_pred are integer class labels, e.g., 0..K-1
macro = f1_score(y_true, y_pred, average="macro")
micro = f1_score(y_true, y_pred, average="micro")
weighted = f1_score(y_true, y_pred, average="weighted")
per_class = f1_score(y_true, y_pred, average=None) # array of F1 per class
Extensões: pontuação Fβ (Fβ score) (quando precisão e revocação não são igualmente importantes)
O F1 dá o mesmo peso para precisão e revocação. Se sua aplicação valoriza uma mais do que a outra, use a pontuação Fβ:
[ F_\beta = (1+\beta^2)\frac{PR}{\beta^2 P + R} ]
- (\beta > 1) enfatiza revocação (por exemplo, tarefas de triagem)
- (\beta < 1) enfatiza precisão (por exemplo, falsos positivos de alto custo)
O F1 é o caso especial (\beta = 1).
Armadilhas e mal-entendidos comuns
1) “F1 alto significa que o classificador é bom no geral”
Não necessariamente. O F1 foca no desempenho da classe positiva (ou no desempenho por classe em multiclasse) e não incorpora TN. Um modelo pode ter:
- Ótimo F1 para positivos
- Baixa capacidade de rejeitar negativos de um modo que importa operacionalmente
Se verdadeiros negativos ou taxas de falsos positivos forem importantes, considere métricas adicionais (por exemplo, especificidade, métricas relacionadas a ROC) junto com F1.
2) Ignorar verdadeiros negativos pode enganar em alguns domínios
Em dados altamente desbalanceados, ignorar TN muitas vezes é aceitável porque TN é enorme e pouco informativo. Mas em outros cenários, TN é significativo:
- Controle de qualidade em que ambas as classes são importantes
- Diagnóstico médico em que descartar corretamente uma doença importa para alocação de recursos
- Sistemas com custos extremos para alarmes falsos
Nesses casos, combine F1 com outras medidas e análise de custo específica do domínio.
3) F1 micro em multiclasse pode colapsar para acurácia
Para tarefas multiclasse de rótulo único, precisão micro = revocação micro = acurácia, logo F1 micro = acurácia. Se você pretendia medir sensibilidade a classes minoritárias, o F1 micro não fará isso.
4) Comparar F1 entre definições de rótulo ou esquemas de amostragem diferentes
O F1 depende da prevalência de positivos e do protocolo de avaliação. Mudanças em:
- Regras de rotulagem
- Composição do conjunto de dados
- Amostragem de negativos (comum em recuperação de informação)
- Partições baseadas em tempo vs partições aleatórias
podem alterar o F1 sem refletir uma melhoria real no ambiente em produção.
5) Otimizar F1 pode prejudicar a qualidade das probabilidades
Maximizar o F1 incentiva decisões rígidas que podem degradar a utilidade das probabilidades preditas. Se decisões a jusante usam probabilidades (ranqueamento, pontuação de risco), você também pode precisar de calibração e métricas de ranqueamento.
6) Casos indefinidos e “divisão por zero”
Se um modelo prediz nenhum positivo, então (TP+FP = 0) e a precisão é indefinida; de forma semelhante, se não há positivos reais, a revocação é indefinida. Bibliotecas lidam com isso de maneiras diferentes (frequentemente definindo a métrica como 0 com avisos). Sempre verifique casos extremos, especialmente em conjuntos pequenos ou classes raras.
Quando usar F1 (e quando não usar)
Bons cenários para F1
- Classificação desbalanceada em que a classe positiva é o foco
- Situações em que precisão e revocação são importantes e você quer uma pontuação de resumo
- Seleção de modelos durante iteração, em conjunto com curvas PR para um entendimento mais profundo
Casos em que F1 pode ser insuficiente ou inadequado
- Quando verdadeiros negativos importam significativamente
- Quando você precisa de otimização explicitamente sensível a custo (cost-sensitive) (o F1 não codifica custos diretamente)
- Ao avaliar sistemas de ranqueamento ou recuperação (retrieval), em que métricas como precisão média (average precision) ou NDCG podem se alinhar melhor à tarefa
- Quando você precisa avaliar qualidade das probabilidades (calibração/regras de pontuação)
Recomendações práticas de fluxo de trabalho
- Reporte precisão, revocação e F1 juntos, e não apenas F1.
- Para tarefas binárias desbalanceadas, inclua uma curva PR e considere reportar também a área sob a curva PR; veja Curva Precisão–Revocação (Curva PR).
- Para tarefas multiclasse, reporte:
- F1 macro para refletir equidade por classe
- F1 por classe para identificar classes fracas
- Opcionalmente, F1 ponderado para um resumo sensível à prevalência
- Escolha limiares usando dados de validação e documente a política de seleção de limiar.
- Sempre faça uma verificação de sanidade com uma matriz de confusão e alguns exemplos concretos de erro.
Resumo
- A pontuação F1 é a média harmônica da precisão e revocação:
[ F_1 = \frac{2PR}{P+R} = \frac{2TP}{2TP + FP + FN} ] - Ela resume o compromisso entre precisão e revocação, frequentemente útil sob desbalanceamento de classes.
- Em cenários multiclasse, o F1 normalmente é promediado via estratégias macro, micro ou ponderada, cada uma respondendo a uma pergunta diferente.
- O F1 é dependente do limiar; entender como ele muda ao longo dos limiares é crucial.
- Uma armadilha central é que o F1 ignora verdadeiros negativos, então ele deve ser usado junto com outras métricas e considerações de domínio.