Avaliação de Modelos de Machine Learning: Métricas e Visualizações
Neste artigo, vamos explorar as principais métricas para problemas de classificação e regressão, além de mostrar como criar visualizações poderosas em Python usando Scikit-learn, Matplotlib e Seaborn.
1. Por que avaliar modelos?
A avaliação é essencial para responder perguntas como:
O modelo está realmente aprendendo padrões relevantes?
Ele generaliza bem ou apenas memoriza os dados de treino (overfitting)?
Está equilibrado para todas as classes ou favorece apenas algumas?
A métrica escolhida faz sentido para o problema?
Exemplo: em um modelo para detecção de fraudes (onde apenas 1% das transações são fraudulentas), acurácia alta pode ser enganosa. Um modelo que sempre prevê “não fraude” terá 99% de acurácia, mas não resolve o problema real.
2. Avaliação de modelos de classificação
2.1 Acurácia (Accuracy)
Proporção de acertos sobre o total de previsões.
Fórmula:
[
\text{Accuracy} = \frac{TP + TN}{TP + TN + FP + FN}
]
Boa quando as classes estão balanceadas.
from sklearn.metrics import accuracy_score
y_true = [0, 1, 0, 1, 1, 0, 1]
y_pred = [0, 1, 0, 0, 1, 0, 1]
print("Accuracy:", accuracy_score(y_true, y_pred))
2.2 Precisão (Precision)
Proporção de previsões positivas corretas.
[
\text{Precision} = \frac{TP}{TP + FP}
]
Importante em cenários onde falsos positivos são críticos (ex: diagnóstico de doenças).
2.3 Revocação (Recall / Sensibilidade)
Proporção de casos positivos identificados corretamente.
[
\text{Recall} = \frac{TP}{TP + FN}
]
Importante em cenários onde falsos negativos são perigosos (ex: fraude não detectada).
2.4 F1-Score
Média harmônica entre Precisão e Recall. Útil quando as classes estão desbalanceadas.
[
\text{F1} = 2 \times \frac{Precision \times Recall}{Precision + Recall}
]
from sklearn.metrics import precision_score, recall_score, f1_score
print("Precision:", precision_score(y_true, y_pred))
print("Recall:", recall_score(y_true, y_pred))
print("F1-Score:", f1_score(y_true, y_pred))
2.5 Matriz de Confusão
Mostra a distribuição de acertos e erros.
from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay
import matplotlib.pyplot as plt
cm = confusion_matrix(y_true, y_pred)
disp = ConfusionMatrixDisplay(confusion_matrix=cm)
disp.plot()
plt.show()
2.6 Curva ROC e AUC
A curva ROC mostra a relação entre taxa de verdadeiros positivos e taxa de falsos positivos.
O AUC (Área sob a curva) mede a capacidade do modelo de separar classes.
from sklearn.metrics import roc_curve, roc_auc_score
y_prob = [0.1, 0.9, 0.3, 0.2, 0.8, 0.05, 0.7] # probabilidades previstas
fpr, tpr, _ = roc_curve(y_true, y_prob)
plt.plot(fpr, tpr, label=f"AUC={roc_auc_score(y_true, y_prob):.2f}")
plt.xlabel("False Positive Rate")
plt.ylabel("True Positive Rate")
plt.legend()
plt.show()
2.7 Curva de Precisão-Revocação
Mais informativa em dados desbalanceados do que a curva ROC.
from sklearn.metrics import precision_recall_curve
precision, recall, _ = precision_recall_curve(y_true, y_prob)
plt.plot(recall, precision, marker='.')
plt.xlabel("Recall")
plt.ylabel("Precision")
plt.title("Precision-Recall Curve")
plt.show()
3. Avaliação de modelos de regressão
3.1 Erro Quadrático Médio (MSE) e Raiz do Erro Quadrático Médio (RMSE)
Mede o desvio entre os valores reais e previstos.
[
MSE = \frac{\sum (y_{real} - y_{pred})^2}{n}
]
from sklearn.metrics import mean_squared_error
y_true = [3.5, 2.1, 4.0, 5.2]
y_pred = [3.7, 2.0, 4.2, 5.0]
print("MSE:", mean_squared_error(y_true, y_pred))
print("RMSE:", mean_squared_error(y_true, y_pred, squared=False))
3.2 Erro Absoluto Médio (MAE)
Mede o erro médio em termos absolutos, sem penalizar erros grandes de forma desproporcional.
from sklearn.metrics import mean_absolute_error
print("MAE:", mean_absolute_error(y_true, y_pred))
3.3 Coeficiente de Determinação (R²)
Indica a proporção da variabilidade explicada pelo modelo.
Varia de 0 a 1, sendo 1 = modelo perfeito.
from sklearn.metrics import r2_score
print("R²:", r2_score(y_true, y_pred))
3.4 Visualizando erros de regressão
plt.scatter(y_true, y_pred)
plt.plot([min(y_true), max(y_true)], [min(y_true), max(y_true)], 'r--')
plt.xlabel("Valores Reais")
plt.ylabel("Valores Preditos")
plt.title("Dispersão Real vs Previsto")
plt.show()
4. Cross-Validation para avaliação robusta
Avaliar apenas com um único conjunto de treino/teste pode ser arriscado. O cross-validation divide os dados em múltiplos subconjuntos para garantir resultados mais confiáveis.
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression
model = LogisticRegression()
scores = cross_val_score(model, [[0],[1],[2],[3]], [0,0,1,1], cv=2, scoring='accuracy')
print("Cross-Validation Scores:", scores)
5. Boas práticas na avaliação de modelos
Escolha métricas adequadas ao problema
Classificação balanceada: Acurácia.
Classificação desbalanceada: F1-Score, AUC, Precision-Recall.
Regressão: RMSE e R².
Use múltiplas métricas para ter uma visão completa.
Visualize resultados com curvas e matrizes de confusão.
Valide modelos com cross-validation para evitar overfitting.
Interprete resultados no contexto do negócio, não apenas matematicamente.
6. Conclusão
Avaliar corretamente modelos de Machine Learning é fundamental para garantir sua confiabilidade e aplicabilidade no mundo real. Métricas como Acurácia, F1-Score, AUC, RMSE e R² oferecem diferentes perspectivas sobre o desempenho, enquanto visualizações como matriz de confusão, curvas ROC e Precision-Recall ajudam a interpretar melhor os resultados.
Com Python e bibliotecas como Scikit-learn, é possível implementar essas avaliações de forma prática, garantindo que seus modelos sejam não apenas precisos, mas também úteis e robustos.

Comentários
Postar um comentário