Entendendo o que é Matriz de Confusão com Python

Venha aprender o que são matrizes de confusão, seu uso e confira uma implementação em Python

Thanks by Vinicius Reis pela imagem

Olá, neste post te convido a entender o que é a famosa Matriz de Confusão, uma ferramenta muito usada para avaliações de modelos de classificação em Aprendizado de Máquina (mais comumente chamado de Machine Learning).

Para termos dados de exemplo, imagine que eu tivesse um modelo que, dada as características fisiológicas de uma paciente, dissesse que a mesma está grávida ou não. Porém, para o nosso contexto, eu só trarei uma lista com os dados reais, e uma lista de dados preditos pelo modelo, ambos dados fake.

Listas com valores “fake”

Como saber se meu modelo previu bem? Como saber se ele prevê bem a classe que queremos (Grávida)? Essas e outras questões podemos entender com as matrizes de confusão.


O que são matrizes de confusão?

É um tabela que mostra as frequências de classificação para cada classe do modelo. Pegando o exemplo acima, ela vai nos mostrar as frequências:

  • Verdadeiro positivo (true positive — TP): ocorre quando no conjunto real, a classe que estamos buscando foi prevista corretamente. Por exemplo, quando a mulher está grávida e o modelo previu corretamente que ela está grávida.
  • Falso positivo (false positive — FP): ocorre quando no conjunto real, a classe que estamos buscando prever foi prevista incorretamente. Exemplo: a mulher não está grávida, mas o modelo disse que ela está.
  • Falso verdadeiro (true negative — TN): ocorre quando no conjunto real, a classe que não estamos buscando prever foi prevista corretamente. Exemplo: a mulher não estava grávida, e o modelo previu corretamente que ela não está.
  • Falso negativo (false negative — FN): ocorre quando no conjunto real, a classe que não estamos buscando prever foi prevista incorretamente. Por exemplo, quando a mulher está grávida e o modelo previu incorretamente que ela não está grávida.

Ao final teremos para o conjunto acima

Matriz de Confusão usando os dados que temos
Matriz de Confusão mostrando as categorias

Assim, nosso modelo:

  • Previu grávida 3 vezes corretamente
  • Previu não grávidas 4 vezes corretamente
  • Previu grávida 1 vez incorretamente
  • Previu não grávida 2 vezes incorretamente

A seguir, analisaremos algumas informações úteis que podemos tirar dessa tabela

Alguns conceitos importantes decorrentes da matriz

Acurácia

Diz quanto o meu modelo acertou das previsões possíveis. No contexto acima, nosso modelo teve uma acurácia de 70%, pois acertou 7 das 10 previsões. E a razão entre o somatório das previsões corretas (verdadeiros positivos com verdadeiros negativos) sobre o somatório das previsões.

Mas isso é tudo?

Recall

No material do Google Developers para Machine Learning, podemos ver que recall responde a seguinte pergunta: qual proporção de positivos foi identificados corretamente? Em outras palavras, quão bom meu modelo é para prever positivos, sendo positivo entendido como a classe que se quer prever, no nosso contexto, se a mulher está grávida. É definido como a razão entre verdadeiros positivos sobre a soma de verdadeiros positivos com negativos falsos.

Precisão

Ainda usando o material do Google Developers, eles definem precisão como a resposta para a seguinte pergunta: Qual a proporção de identificações positivas foi realmente correta? Em outras palavras, o qual bem meu modelo trabalhou.

f-score

Já o f-score nos mostra o balanço entre a precisão e o recall de nosso modelo. Sua fórmula é:

Uma observação muito importante. Os cálculos acima visam entender o seu modelo sobre os dados positivos. Ou seja, quero prever se a paciente está grávida, portanto vou olhar métricas para avaliar essa classe. Quando estamos falando de classificação multiclass (mais de duas classes possíveis de resposta), podemos trabalhar sobre a classe que queremos prever, mas também podemos olhar para cada classe em separado. Para tanto, pode ser útil, na hora de fazer a matriz de confusão, considerar a classe que queremos prever como a classe positiva, e todo o restante como negativo, assim, “inferimos” uma classificação binária só para entender o quão bem o nosso modelo está em prever a classe que queremos.

O pacote metrics do sklearn, possui uma função muito interessante: classification_report, que entrega todas as métricas acima prontas em formato tabular, vale a pena a conferida. Tais métricas são consideradas para cada classe do nosso modelo. Um exemplo no print abaixo:

Exemplo em Python

Lembrando que o sklearn já possui a implementação da confusion_matrix. Fuçando o código fonte, verás que na versão atual (0.20.3), eles usam por debaixo do capô, a função coo_matrix, do módulo sparse do pacote scipy.

Calculando para matrizes 2 x 2 (classificação binária)

A seguir, um gist com um código bem simples de como calcular tal matriz. Se preferir, pode acessar também uma versão do código para executar online.


Bem, chegamos ao final. Não deixe de compartilhar e comentar. Se tiver pontos a colocar, exponha, vamos agregar mais conhecimento a este texto. Espero que tenha sido de grande proveito!


Sou Emanuel, Desenvolvedor na decision6 e entusiasta de Inteligência Artificial. Maluco por séries e filmes. Amo programação e tudo que a cerca. Conheça meu trabalho no meu site emanuelgsouza.dev e em meu Github. May the force be with you!