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