Entender que a acurácia não é tudo. Aprender a escolher, calcular e interpretar métricas apropriadas com base no problema—especialmente em contextos desbalanceados como detecção de fraudes.
Imagine um conjunto de dados de fraudes:
Um modelo que sempre prevê "NÃO FRAUDE" terá 99% de acurácia… mas é inútil! Detecta ZERO fraudes.
A matriz de confusão mostra:
from sklearn.metrics import confusion_matrix
import seaborn as sns
y_pred = modelo.predict(X_test)
cm = confusion_matrix(y_test, y_pred)
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues',
xticklabels=['Legítimo', 'Fraude'],
yticklabels=['Legítimo', 'Fraude'])
plt.title("Matriz de Confusão")
plt.ylabel("Real")
plt.xlabel("Previsto")
plt.show()
De todas as transações que marquei como fraude, quantas eram realmente fraudes?
Precisão = VP / (VP + FP)
✅ Importante quando o custo de falso positivo é alto (ex., bloquear um cartão legítimo).
De todas as fraudes reais, quantas eu detectei?
Revocação = VP / (VP + FN)
✅ CRÍTICA na detecção de fraudes. Você quer minimizar FN (fraudes não detectadas).
Média harmônica de precisão e revocação. Útil quando se busca equilíbrio.
F1 = 2 * (Precisão * Revocação) / (Precisão + Revocação)
from sklearn.metrics import precision_score, recall_score, f1_score
print("Precisão:", precision_score(y_test, y_pred))
print("Revocação: ", recall_score(y_test, y_pred))
print("Pontuação F1: ", f1_score(y_test, y_pred))
A curva ROC mostra a compensação entre Taxa de Verdadeiros Positivos (Revocação) e Taxa de Falsos Positivos em vários limites de decisão.
AUC (Área Sob a Curva) é um número entre 0 e 1:
from sklearn.metrics import roc_auc_score, roc_curve
y_proba = modelo.predict_proba(X_test)[:, 1] # probabilidade da classe positiva
auc = roc_auc_score(y_test, y_proba)
print("AUC-ROC:", auc)
# Plotar curva
fpr, tpr, thresholds = roc_curve(y_test, y_proba)
plt.plot(fpr, tpr, label=f'Curva ROC (AUC = {auc:.2f})')
plt.plot([0,1], [0,1], 'k--', label='Classificador Aleatório')
plt.xlabel('Taxa de Falsos Positivos')
plt.ylabel('Taxa de Verdadeiros Positivos')
plt.title('Curva ROC')
plt.legend()
plt.grid()
plt.show()
✅ Vantagem da AUC: Invariante ao desequilíbrio de classes. Perfeita para fraudes.
Scikit-learn fornece um resumo profissional:
from sklearn.metrics import classification_report
print(classification_report(y_test, y_pred,
target_names=['Legítimo', 'Fraude']))
Saída típica:
precision recall f1-score support
Legítimo 0.99 1.00 0.99 19800
Fraude 0.85 0.50 0.63 200
accuracy 0.99 20000
macro avg 0.92 0.75 0.81 20000
weighted avg 0.99 0.99 0.99 20000
Conjunto de dados: fraude_preprocessada.csv (pré-processado do módulo anterior)
Tarefas:
predict_proba e um limite de 0.3.precision_recall_curve para plotar a compensação precisão-revocação (útil quando os negativos são maioria).