Medindo a eficiência de uma I.A. com uma Matriz de Confusão
Dentro do aprendizado de máquina, é necessário avaliar se os algoritmos estão aprendendo de forma adequada, e para isso podemos avaliar o número de acertos, erros, entre outros valores importantes para estimarmos a eficiência do nosso modelo.
Para isso, pegamos os resultados gerados pelo modelo e aplicamos na matriz de confusão, que nada mais é do que uma tabela que agrupa todos os elementos para mostrar os erros e acertos.
Na matriz de confusão (Figura 1), existem quatro possibilidades de classificações para um elemento:
Verdadeiro Positivo (VP): Um elemento que foi apontado como Verdadeiro, e é Verdadeiro.
Falso Positivo (FP): Elemento apontado como Verdadeiro, porém deveria ser Falso.
Falso Negativo (FN): Definido como Falso, porém deveria ser Verdadeiro.
Verdadeiro Negativo (VN): Apontado como Falso, e é Falso.
Imaginando que você esteja passando uma série de imagens do seu celular para um modelo de predição. O modelo deve retornar a imagem afirmando se ela possui ou não um gato. Em seguida essa mesma informação é cruzada com os dados pré-informados (Se a imagem de foto possui um gato). Em uma matriz de confusão, deve-se identificar como as imagens foram classificadas.
Supondo que o modelo já foi treinado com várias fotos que possuem gatos, e fotos sem qualquer aparição de um bichinho. Assim, já é possível que a IA tenha treinando o suficiente para identificar uma imagem contendo ou não um gato.
Conforme o exemplo acima da Matriz de Confusão, no caso dos gatos, podemos visualizar da seguinte maneira.
Métricas
Para medir a eficiência do nosso modelo, as métricas mais indicadas são:
Acurácia
Uma das medidas inicialmente mais utilizadas e busca entender qual é a proporção de acertos a partir das tentativas. O principal é entender quantas imagens o modelo acertou (Em uma imagem de um gato, Verdadeiro Positivo; E em uma imagem sem gatos, Verdadeiro Negativo).
Precisão
Nessa métrica, o objetivo é entender o número de imagens identificadas de maneira precisa. Por isso na fórmula são colocados os número de Falsos Positivos. Possibilitando balancear junto aos Verdadeiros Positivos.
Revocação (Ou Sensibilidade):
Nessa métrica, o foco é entender quantas fotos de gatos foram apontadas como Positivas (Verdadeiros Positivos). Nessa fórmula o valor é balanceado com fotos de gatos que foram apontados erroneamente como Falsas (Falso Negativo). Esse é um importante exemplo, pois mesmo com uma acurácia beirando o 100%, em caso de uma Revocação alta, significa que o modelo está deixando muitos registros como Falsos Negativos.
F1 Score:
Mais complexa, essa fórmula, tem como objetivo juntar os índices apontados em Precisão e Revocação em uma única métrica.
Exemplificando
Ainda no exemplo do modelo identificador de gatinhos, vamos supor que das 100 imagens processadas pelo modelo para teste. Dessas imagens, elas foram colocadas na Matriz de Confusão da seguinte maneira
Verdadeiros Positivos: 58 imagens.
Falsos Positivos: 6 imagens.
Falso Negativo: 17 imagens.
Verdadeiro Negativo: 19 imagens.
Feito isso, é possível calcular de acordo com as fórmulas das métricas listadas anteriormente.
Implementadas as fórmulas, as métricas do nosso modelo apresentam os seguinte resultados:
Acurácia: 77%
Precisão: 77%
Revocação: 90%
F1-Score: 83%
Para ser calculado, existem duas maneiras que recomendadas:
- Caso você queira apenas testar com valores prontos como eu fiz, o site Online Confusion Matrix gera o cálculo apenas inserindo os valores na matriz. Vale o cuidado de notar que a matriz apresenta os eixos invertidos, mudando FP por FN. Note também que a medida de Revocação é chamada de Sensibility.
2. Já pensando em implementação em Python, podemos gerar com o seguinte código:
from sklearn.metrics import confusion_matrix
#1=Gato | 0=Não é um gato
fotos_gatos = [1, 0, 1, 1, 0, 0, 1, 1, 1] #Lista com o valor real
pred_gatos = [0, 0, 1, 1, 0, 1, 1, 1, 0] #lista com a saída do modelo
matriz = confusion_matrix(fotos_gatos, pred_gatos)
print("Matriz de Confusão: \n", matriz)
Neste exemplo, as fotos seriam a primeira lista (fotos_gatos) onde o 1 indica que a foto possui um gato, e 0 confirma que não possui nenhum gato. Na lista pred_gatos estão as predições geradas pelo modelo. Ambos possuem 10 elementos, e cada posição da lista se refere a mesma foto.
Ao executar o código ele fornecerá a seguinte saída:
Com outras bibliotecas, podemos deixar essa exibição um pouco mais apresentável e até personalizável:
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.metrics import confusion_matrix
#1=Gato | 0=Não é um gato
fotos_gatos = [1, 0, 1, 1, 0, 0, 1, 1, 1] #Lista com o valor real
pred_gatos = [0, 0, 1, 1, 0, 1, 1, 1, 0] #lista com a saída do modelo
conf_matriz = confusion_matrix(fotos_gatos, pred_gatos)
sns.heatmap(conf_matriz, annot=True, fmt='d')
plt.xlabel('Foi apontado')
plt.ylabel('O que se espera')
plt.show()
Por último e não menos importante, podemos imprimir as métricas usando funções disponibilizadas pelo sklearn.
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
acuracia = accuracy_score(fotos_gatos, pred_gatos)
precisao = precision_score(fotos_gatos, pred_gatos)
revocacao = recall_score(fotos_gatos, pred_gatos)
f1 = f1_score(fotos_gatos, pred_gatos)
print("Acurácia: ", acuracia)
print("Precisão: ", precisao)
print("Revocação: ", revocacao)
print("F1-score: ", f1)
Executando o código, temos a saída com as métricas:
Conclusões
Entender como funciona uma matriz de confusão é o primeiro passo para entender como são classificadas as predições geradas por um modelo de Machine Learning. Em seguida é possível obter suas métricas para compreender se o desempenho está satisfatório. As vezes por inocência, entendemos que a Acurácia é a melhor medida para avaliarmos o desempenho. Ainda que ela seja simples e mostre um pouco do que queremos, é necessário entendermos o que devemos priorizar nas nossas predições e analisar as outras métricas disponíveis.
Em casos mais delicados como uma predição de doenças, como o câncer, se baseando em imagens, não basta ter apenas uma Acurácia boa. É preciso evitar que haja Falsos Negativos, pois isso poderia comprometer ou impactar uma vida. Um caso de um Falso Positivo poderia ser algo igualmente ruim, porém com uma análise médica mais cuidadosa e outros testes em separado, poderia se entender que não passou de uma falha isolada do modelo, assim se tornando algo mais contornável.
Dentro dos modelos de predições, erros são normais. Modelos que acertam 100%, tendem a estar 100% errados. Ainda que buscamos o modelo mais eficiente para previsões, é importante saber onde o modelo pode errar para alguns casos mais difíceis. Se todos os gatos precisariam ser identificados nas fotos, é importante saber que alguns casos podem ser classificadas fotos de pelúcias ou outros animais como gatos. Ou se o caso seria garantir que apenas gatos serão apontados como gatos, assim dando chance de uma foto de um gato de costas, não ser classificado como um verdadeiro gato.
Usando modelos de predição e calculando desempenho através das métricas listadas, é possível compreender os pontos fortes e fracos do nosso código. Como Cientista de Dados, fica a cargo não só de implementar as métricas, mas também de entender quais conclusões podemos tirar delas, além de priorizar onde o nosso modelo precisa aprender, para identificar da melhor forma.