Avaliação de Modelos de Machine Learning: Métricas e Visualizações

Treinar um modelo de Machine Learning é apenas parte do processo. O verdadeiro desafio está em avaliar sua performance de forma correta, garantindo que ele seja útil, confiável e capaz de generalizar bem para novos dados. Para isso, utilizamos métricas de avaliação e visualizações gráficas que nos ajudam a interpretar os resultados.

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-learnMatplotlib 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

curva ROC mostra a relação entre taxa de verdadeiros positivos e taxa de falsos positivos.
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

  1. Escolha métricas adequadas ao problema

    • Classificação balanceada: Acurácia.

    • Classificação desbalanceada: F1-Score, AUC, Precision-Recall.

    • Regressão: RMSE e R².

  2. Use múltiplas métricas para ter uma visão completa.

  3. Visualize resultados com curvas e matrizes de confusão.

  4. Valide modelos com cross-validation para evitar overfitting.

  5. 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

Postagens mais visitadas deste blog

Python para Computação Quântica: Introdução com Qiskit

Gerando Relatórios em PDF com Python (ReportLab e FPDF)

Estrutura Básica de um Programa C# com exemplos