Como Calcular as Métricas de Validação dos Modelos de Machine Learning em Python

Ao ajustar um modelo de Machine Learning para classificação é necessário avaliar sua performance em dados desconhecidos. Existem muitas métricas como Acurácia, Recall, Precision, F1-Score e AUC, que avaliam seu modelo, antes de colocá-lo em produção.Se você não sabe sobre o que eu estou falando, dá uma olhada nesse artigo e veja o que são essas métricas e quais as diferenças entre elas.
Artigo: Métricas de Validação dos Modelos de Machine Learning
Conjunto de Dados
Para exemplificar como calcular as métricas de avaliação dos modelos de classificação no Python irei usar um conjunto de dados sobre compras em redes sociais.
A variável de interesse é se o cliente comprou (classe 1) ou não comprou o produto (classe 0). O conjunto de dados e suas as informações estão disponíveis em Kaggle .
Esse conjunto de dados possuí um desbalanceamento entre as classes, ou seja, existe mais informações (dados) na categoria 0 do que na categoria 1. Apenas 35% dos clientes compraram o produto.
Ajuste do Modelo
Para exemplificar as métricas, utilizaremos o modelo KNN (K – Nearest Neighbors algorithm). Vamos omitir os cálculos do ajuste do modelo, mas o código completo se encontra aqui.
No exemplo, utilizamos apenas as variáveis numéricas para simplificar o pré-processamento. Lembre-se, nosso objetivo nesse artigo é explicar como calcular as métricas e não chegar ao melhor ajuste.
As etapas para o ajuste do modelo foram as seguintes:
- Selecionar as variáveis explicativas , X (“EstimatedSalary” e “Age”).
- Selecionar a variável resposta, Y (“Purchased”).
- Padronizar as variáveis explicativas, esse processo é feito para deixar as variáveis na mesma escala e não influenciar o ajuste do modelo, lembre-se o KNN utiliza a distância no seu ajuste.
- Separar os dados em teste e treino.
- Ajustar o modelo KNN nos dados de treino.
- Estimar as classes nos dados de teste, preditct().
- Calcular a matriz de confusão e as métricas para analisar a performance do modelo em dados desconhecidos (dados de teste).
#Ajuste do Modelo KNN from sklearn.neighbors import KNeighborsClassifier #classificador knn = KNeighborsClassifier() knn.fit(x_treino, y_treino) resultado_knn = knn.predict(x_teste)
Matriz de Confusão
Após estimar a classe no dados de teste, vamos comparar a classe estimada pelo modelo com a classe real. A melhor maneira de exemplificar os resultados é utilizando a matriz de confusão.
#matriz de confusão from sklearn.metrics import accuracy_score #acuracia print (pd.crosstab(y_teste,resultado_knn, rownames=['Real'], colnames=['Predito'], margins=True))
Predito 0 1 All Real 0 50 8 58 1 4 38 42 All 54 46 100
Através da matriz de informação podemos extrair algumas métricas:
1. VP = Verdadeiros Positivos
Aqueles que compraram e foram classificados como compradores, 38.
2. VN = Verdadeiros Negativos
Aqueles que não compraram e foram classificados como não compradores, 50.
3. FP = Falso Positivos
Aqueles que não compraram e foram classificados como compradores, 8.
4. FN = Falso Negativo
Aqueles que compraram e foram classificados como não compradores, 4.
Sensibilidade VP/(VP+FN)
A sensibilidade mostra a proporção dos classificados como compradores em relação ao total de compradores.
Especificidade VN/(VN+FP)
A sensibilidade mostra a proporção dos classificados como não compradores em relação ao total de não compradores.
Valor preditivo positivo (VPP) = VP/(VP+FP)
Indica qual a probabilidade de uma pessoa classificada como compradora, tenha realmente comprado.
Valor preditivo negativo (VPP) =VN/(VN+FN)
Indica qual a probabilidade de uma pessoa classificada como não compradora, tenha realmente não comprado.
Acurácia
A Acurácia é a média global do acerto do modelo ao classificar as classes, pode ser calculada através da razão (VN+VP)/(VP+FN+VN+FP).
# Acurácia from sklearn.metrics import accuracy_score # importando a biblioteca para calcular a acurácia acuracia = accuracy_score(y_teste, resultado_knn) print('Acurácia: %f' % acuracia)
Acurácia: 0.880000
Obtemos uma acurácia de 88%, como temos dados desbalanceado, a acurácia pode não ser uma boa métrica de avaliação nesse cenário, é necessário analisar outras métricas.
Precision
Precision a métrica que traz a informação de quantas observações o modelo classificou corretamente como 1. Ou seja, de todas os clientes que o modelo previu como comprador, quantos realmente fizeram a compra.
# Precision from sklearn.metrics import precision_score #precision precision = precision_score(y_teste, resultado_knn) print('Precision: %f' % precision) Precision: 0.826087
Observe como obtemos uma precisão de 82%, menor que a acurácia, ou seja, o modelo consegue prever melhor a classe 0 do que a classe 1. Por isso, que obtemos uma acurácia maior, pois ela traz a informação do acerto do modelo sem distinguir a classe.
Recall
Recall analisa entre todos os compradores, quantos realmente o modelo conseguiu prever como comprador.
# Recall from sklearn.metrics import recall_score #recall recall = recall_score(y_teste, resultado_knn) print('Recall: %f' % recall). Recall: 0.904762
Obtemos um Recall de 90%, ou seja, de todos os compradores o modelo conseguiu classificar corretamente 90% dos compradores.
Observe que a Recall e a Precision traz informações sobre a qualidade do modelo em estimar a classe de interesse
F1-Score
A F1-Score é a média harmônica entre o Recall e Precision, ou seja, ela resume as informações dessas duas métricas.
# F1-Score from sklearn.metrics import f1_score #f1-score f1 = f1_score(y_teste, resultado_knn) print('F1-Score: %f' % f1) F1-Score: 0.863636;
AUC – Área sob a Curva Roc
A área sob a curva Roc traz a informação sobre a relação entre 1- Especificidade e Sensibilidade. Muito utilizada nas competições do Kaggle, mas existem outras métricas baseada na curva Roc que se comporta melhor em dados desbalanceados.
# AUC from sklearn.metrics import roc_auc_score #area sob curva roc AUC: 0.883
Curva Roc
A AUC é área sob a curva Roc, quando maior a área sob a curva maior a AUC. Para calcular a curva Roc é necessário calcular as probabilidades de cada observação pertencer a classe. Uma vantagem da curva Roc, é a possibilidade de escolher o ponto de corte que otimiza o desempenho do modelo.
# Estimando as probabilidades knn_prob = knn.predict_proba(x_teste) probs = knn_prob[:, 1] rfp, rvp,lim = roc_curve(y_teste, probs)
# Gráfico da curva roc pyplot.plot(rfp, rvp, marker='.', label='KNN',color="orange") pyplot.plot([0, 1], [0, 1], color='darkblue', linestyle='--') # alterando o nome dos eixos pyplot.xlabel('1- Especificidade') pyplot.ylabel('Sensibilidade') # Legenda pyplot.legend() # Mostrando o gráfico pyplot.show()
Analisando todas as métricas de uma vez
No Python é possível analisar todas as métricas de uma vez utilizando o comando classification_report(). Na primeira linha e primeira coluna temos os VPN (valores positivos negativos) igual a 93%.
Na primeira linha e segunda coluna temos a Especificidade igual a 86%. Na segunda linha e primeira coluna temos o Precision igual a 83% e na segunda linha e segunda coluna temos o Recall igual a 90%.
As outras métricas é o F1-Score para cada classe e a acurácia e suas variações.
from sklearn.metrics import classification_report # metricas de validação print(classification_report(y_teste, resultado_knn))
precision recall f1-score support 0 0.93 0.86 0.89 58 1 0.83 0.90 0.86 42 accuracy 0.88 100 macro avg 0.88 0.88 0.88 100 weighted avg 0.88 0.88 0.88 100
Conclusão
As métricas vão auxiliar a escolha do melhor modelo entre suas possibilidades. Todas essas métricas variam entre 0 e 1 e quanto mais próxima de 1 melhor.
Como podemos ver não existe a melhor métrica, é tudo depende do cenário e dos objetivos para analisar as métricas e definir a performance do modelo.
Essas métricas apenas nos auxiliar a tomar essa decisão.
Existe outras métricas que iremos abordar no futuro. Gostou desse artigo? Ele foi útil? Deixe um comentário.
Referências
https://www.kdnuggets.com/2020/05/model-evaluation-metrics-machine-learning.html
https://scikit-learn.org/stable/modules/generated/sklearn.metrics.f1_score.html
E se os dados forem desbalanceados, o q vc recomenda?
Existem técnicas específicas para tratar amostra desbalanceada, como undersampling e oversampling. Mas em relação as métricas, quando a amostra é desbalanceada, não é recomendado usar a acurácia. Nesse caso utilizamos a Precision ou Recall, depende do objetivo da análise.