• Roger Sampaio

Desvendando as Métricas dos Modelos Preditivos no Azure 1-2


Fala meus guerreiros. Como estão vocês? Espero que todos estejam muito bem, caso contrário vamos trabalhar para melhorar. Não basta apenas construir modelos de aprendizado de máquina utilizando os mais avançados algoritmos, técnicas e ferramentas avançadas, antemão necessário interpretar os respectivos resultados. Como avaliar a performance de um modelo preditivo? Em outras palavras, como sabemos que o modelo está realizando o maior número de acertos possíveis? A resposta são as métricas.


Existem uma variedade grande de métricas disponíveis inclusive através de frameworks (Azure Machine Learning, Scikit Learning,...) divididas segundo o tipo de aprendizado de máquina: 1. classificação, 2. regressão, 3. clusterização. Exploraremos em detalhes e com exemplos práticos os dois primeiros nesse artigo. Apertem os cintos, porque vamos decolar.


Métricas para Classificação

Esse tipo de aprendizado de máquina nos dita que estamos tentando prever uma classe, categoria (podendo ser expressada por números inteiros ou caracteres alfanuméricos), chamada também de label. Exemplo: prever se um paciente tem probabilidade de ter diabete ou não. Existem duas possibilidades de saída: S (tem probabilidade de diabete), N (não tem probabilidade de ter diabete). Outro exemplo: prever o tipo de cliente bancária considerando as seguintes saídas: 1. baixa renda, 2. média renda, 3. alta renda. As labels podem variam entre duas (classificação binária) ou mais opções (classificação multibinária).

Suponha que você é um Cientista de Dados e foi contratado pela escola 'Melhor Escola' para construir um modelo preditivo. Sua missão é prever a qual escola o aluno pertence (GP - Gabriel Pereira ou MS Mousinho da Silveira) utilizando uma série de características dos estudantes como por, exemplo, idade, quantidade de faltas, nível de escolaridade de mãe e pai, nota G1, nota G2, nota G3 entre outras. A base contém 395 linhas e 33 colunas. Veja a descrição da base aqui. Você como um bom cientista construir o modelo utilizando o algoritmo Decision Tree, e agora deseja avaliar o desempenho do modelo.


  1. Confusion Matrix

Embora o normal pareça esquisito ao traduzir para o português 'matriz de confusão', é bem mais simples que pareça. A confusion matrix é uma das principais métricas de classificação, comparando para cada classe a quantidade de acertos do modelo entre os valores previstos e reais. No caso temos duas possibilidade de saída, ou seja, duas classe: GP ou MS.

Existem os dados reais (separados em um dataset de teste, não vistos no processo de treinamento do modelo) e dados previstos, esperando-se que ocorra uma taxa de erros do modelo. Vamos pensar um pouco meus guerreiros. Quando o modelo diz (prever) que o aluno é da escola GP e de fato é (classe real), o modelo acertou. O mesmo raciocínio vale para MS. Agora pode ser que o modelo diga que o aluno é da classe GP, quanto que na verdade era da classe MS, significando que o modelo errou. O modelo pode dizer que é da classe MS, quanto que era da classe GP, o modelo também errou. Embora não conotação boa ou ruim, para fins didáticos podemos ainda dizer que a classe GP é nossa classe positiva. Já MS será nossa classe negativa.

A matriz é dada por:

O primeiro quadrante chamado TP (True Positive, ou seja, Verdadeiro Positivo) reflete a quantidade de acertos da classe positiva, ou seja, GP. O real era a classe GP e o modelo de fato previu GP. Quanto maior o número de TP, melhor desempenho terá nosso modelo.

O segundo quadrante chamando FP (False Positive, ou seja, Falso Positivo) que é quantidade de erros em que a classe era MS e o modelo previu GP. Enquanto maior o número de erros aqui, pior será o desempenho do modelo.

O terceiro quadrante chamado FN (False Negative, ou seja, Falso Negativo) representa o inverso do segundo quadrante. É a quantidade de erros em que a classe real era GP, e o modelo previu MS. Quanto maior o número de erros aqui, pior será a performance do modelo.

Por fim o último quadrante chamado TN (True Negative, ou seja, Verdadeiro Negativo) é a quantidade de acertos no qual a classe era MS, e o modelo previu MS. Quanto maior o número de acertos, melhor será para o modelo. Em suma, o que queremos é o maior número de acertos possíveis entre as TP e TN, e o menor número de erros entre FP e FN. A matriz de confusão está disponível em uma linha de código no pacote from sklearn.metrics. Veja o código abaixo com a construção do modelo e chamada da matriz de confusão.

# Importações de pacotes
import pandas as pd
from sklearn import tree
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
from sklearn.metrics import confusion_matrix
from sklearn.metrics import accuracy_score
from sklearn.metrics import precision_score
from sklearn.metrics import recall_score
from sklearn.metrics import f1_score
from sklearn import metrics
# Obtendo os dados da fonte
alunos = pd.read_csv('datasets/student-mat.csv')
# Definição das variáveis preditoras e target
# Usaremos para nosso MODELOS apenas as variáveis PREDITORAS: age,failures,G1,G2,G3
# Note que no exercício não aplicamos normalização nos dados, tratamento das variáveis categóricas, eliminação de valores outliers, o que impactar negativamente no desempenho do modelo.
# O foco aqui é apenas a construção do modelo. No caso DecisionTreeClassifier
x = alunos[['age','absences','G1','G2','G3']]
y = alunos[['school']]

# Divisão entre os dados de treino e teste
x_treino, x_teste, y_treino, y_teste = train_test_split(x, y, test_size=0.30, random_state=42)
# Definição do Modelo e Treinamento
modelo1 = tree.DecisionTreeClassifier()
modelo1 = modelo1.fit(x, y)
# Efetuando uma previsão com modelo treinado
#   age absences    G1  G2  G3
modelo1.predict([[16,3,11,10,10]])
# Matriz de confusão. y_true são os dados reais, y_pred são os dados reais
y_true = y_teste
y_pred = modelo1.predict(x_teste)
confusion_matrix(y_true, y_pred)
array([[99,  0],
       [ 2, 18]])

O nosso dataset de teste tem 119 linhas, trazendo para matriz teremos:


Perceba que o modelo praticamente não teve erros (2 em FN e 0 em FP). A quantidade de acertos foram bem altas (TP, TN). Considerando que temos 119 linhas, ele acertou 117 registros, contabilizando 98% de acertos.



2. Acurácia


Essa métrica nos relata quantos acertos o modelo teve independente da classe, no nosso caso, GP ou MS. A fórmula para determinar a acurácia é dada pela quantidade de observações em cada quadrante da matriz de confusão. Veja:

Fazendo o cálculo temos:

Acurácia = 99 + 18 / (99 + 18 + 0 + 2) = 117/119 = 0,98 * 100 = 98%. Para calcular a acurácia no nosso código, podemos utilizar a seguinte função:


accuracy_score(y_true, y_pred)
0.9831932773109243

A acurácia é uma métrica de simples entendimento. Se você deseja explicar de uma forma resumida sem entrar em detalhes técnicos para a área de negócio, essa métrica é indicada. Enquanto maior o valor dela, melhor. Embora a métrica seja de fácil interpretação, ela pode não refletir verdadeiramente o desempenho do modelo devido a sensibilidade de desbalanceamento de classes. Caso tenha uma taxa de acertos muito alta da classe GP (exemplo: 90%), enquanto a outra classe MS um pequena taxa, a acurácia será bem alta. O modelo está classificado corretamente, porém somente da classe GP. Devemos corrigir o problema aplicando, por exemplo, técnica de balanceamento de classes. As métricas precisão, recall, F1-Score também são sensíveis ao desbalanceamento de classes.


3. Precisão

É a razão entre os exemplos classificados corretamente como positivos, ou seja, TP (verdadeiro positivo) e a quantidade de exemplos positivos. A métrica dá uma maior ênfase para erros por falso positivo. Veja a fórmula:

Isso responde a seguinte pergunta: dos exemplos classificados como da classe positiva, quantos são de fato? Retomando ao nosso projeto, vamos calcular a precisão:


precision_score(y_true, y_pred,average='micro')
0.9831932773109243

Como a precisão deu 98%, significa que a cada 100 exemplos da classe GP ou MS, é esperado que 98% seja de fato. Temos duas classes, logo a métrica responderia duas perguntas: 1. dos exemplos classificados como MS, quantos de fato são MS; 2. dos exemplos classificados como GP, quantos de fato são da escola GP. Se temos, por exemplo,100 exemplos da classe GP e o modelo classificou 90 corretamente, logo a precisão é de 90%.


4. Recall

Semelhante a precisão quanto a fórmula matemática, porém enfatizando os erros por falso negativo. Responde a seguinte pergunta: de todos os exemplos que são da classe positiva, quantos foram classificados corretamente como positivos?

No nosso código basta chamar a seguinte função:

recall_score(y_true, y_pred, average='macro')
0.95

Note que a diferença entre a precisão e recall está justamente na ênfase de erros. A precisão enfatiza os falsos positivos, enquanto o recall os falsos negativos. Trazendo para um contexto de negócio podemos utilizar a precisão em situações em que os falsos positivos são considerados mais prejudiciais que os falsos negativos. Suponha que haja um medicamento XYZ de alto risco que somente deve ministrado em casos extremos, caso contrário poderá incidir em graves complicações incluindo a morte. Um modelo preditivo foi construído para recomendar ou não o medicamento quanto o paciente apresenta determinado quadro clínico. O modelo recomendou o medicamento para um paciente que não era elegível, ou seja, falso positivo. Nessa situação é mais grave que o inverso: o modelo dizer que o paciente não era elegível, sendo que era. Um exemplo com recall é um modelo preditivo que classifica pacientes em com câncer ou não. É mais grave o modelo preditivo dizer que um paciente não está com câncer, sendo que o mesmo esteja (falso negativo) que classificar com câncer alguns pacientes saudáveis.


5. F1-Score


É uma métrica que calcula a média harmônica entre precisão e recall. Em outras palavras, não olha cada uma delas individualmente. Veja:

Retomando ao código, basta utilizar a seguinte função:


f1_score(y_true, y_pred, average='macro')
0.9686842105263158


6. Curva ROC


Trata-se de um gráfico que mede a variação entre a taxa de falsos positivos e verdadeiros positivos, separando por meio de um limiar. Ou seja, tudo que está acima do limiar, a classificação está correta, caso contrário não. Quanto mais próximo a curva estiver do canto superior esquerdo, melhor será. Os valores dela variam entre 0 -1, enquanto maior, melhor será o desempenho do modelo.

Retomando ao código:

metrics.plot_roc_curve(modelo1, x_teste, y_teste) 

Veja o gráfico final:


7. Avaliando com Cuidado

Não existe métrica mestre, ou seja, melhor que outras, que irão ditar a verdade absoluta em todos os seus projetos de aprendizado de máquina. A escolha da métrica dependerá sempre das regras do negócio. Conforme citado anteriormente, quando precisamos de um modelo que situações classificadas como falsos negativos são mais prejudiciais que os falsos positivos, o recall é uma boa escolha. Na prática cabe ao Cientista de Dados avaliar cada uma delas, interpretá-las, explicá-las para que a área de negócio possa tomar a decisão. Beijo no coração. Até a próxima.

104 visualizações0 comentário