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

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:

  1. Selecionar as variáveis explicativas , X (“EstimatedSalary” e “Age”).
  2. Selecionar a variável resposta, Y (“Purchased”).
  3.  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.
  4.  Separar os dados em teste e treino.
  5. Ajustar o modelo KNN nos dados de treino.
  6.  Estimar as classes nos dados de teste, preditct().
  7. 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

https://machinelearningmastery.com/roc-curves-and-precision-recall-curves-for-classification-in-python.html

Sobre o Autor

Juliana Scudilio
Juliana Scudilio

Doutora e Mestre em Estatística pelo ICMC-USP. Bacharel em Estatística pela UFSCAR. Founder e Data Scientist da flai. Apaixonada por dados e por ensinar.

2 Comentários

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


Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *