Como Avaliar Seu Modelo de Classificação

As principais métricas de avaliação de classificadores

Gustavo Korzune Gurgel
Turing Talks
9 min readJul 6, 2020

--

Texto escrito por Gustavo Gurgel e Guilherme Fernandes.

Introdução

Imagine que você foi selecionado por um hospital para desenvolver um programa que identifique quais pacientes são portadores de COVID-19 usando seus exames, e que para fazer isso você decide criar um classificador.

Ao pensar que esse classificador pode ser determinante na vida de inúmeras pessoas, você se faz a seguinte pergunta: como saber se meu modelo é uma maneira segura de dizer se alguém realmente está doente?

O objetivo desse Turing Talks é expor as métricas que mais são utilizadas para medir a performance de modelos de Inteligência Artificial, seus prós e contras e quando usá-las.

Acurácia

Depois de treinar seu classificador você decide usar os dados de teste para verificar quão bom está o modelo.

A métrica mais usada para mensurar o desempenho de classificadores é a acurácia. Ela é bem direta e pode ser usada quando se deseja ter uma noção geral de quão bem seu modelo está funcionando. Define-se acurácia pela fórmula abaixo.

No caso do modelo que foi implementado, poderíamos usar uma função do scikit-learn que retorna a acurácia, a partir de uma comparação entre os valores preditos e os verdadeiros. Veja o exemplo abaixo implementado usando a biblioteca scikit-learn:

Problema da Acurácia

Um dos maiores problemas ao usar a acurácia é a falta de flexibilidade para dar ênfase no tipo de projeto que se está realizando, e acabamos por algumas vezes fazendo uma análise muito superficial. Por exemplo, existem projetos onde é mais importante acertar todos os resultados negativos, e.g. no nosso classificador de pacientes, afinal nenhum médico quer que um paciente doente volte para casa acreditando que está saudável. Começaremos a entender em seguida como levar essas considerações em conta.

Matriz de Confusão e Taxas de Desempenho

A matriz de confusão nos permite analisar o desempenho do nosso modelo de forma mais cuidadosa, especialmente no que concerne ao problema da acurácia discutido anteriormente.

Meme exemplo de matriz de confusão para um teste de gravidez

Cada quadrante da matriz de confusão representa uma contagem referente aos tipos de acertos ou erros cometidos.

  • True Positives (TP): modelo prediz corretamente a classe positiva ‘1’;
  • False Positives (FP): modelo prediz incorretamente a classe positiva ‘1’;
  • True Negatives (TN): modelo prediz corretamente a classe negativa ‘0’;
  • False Negatives (FN): modelo prediz incorretamente a classe negativa ‘0’;

Usando a Matriz de Confusão fica mais fácil formalizar o problema anterior, pois se um classificador previsse alguém doente como saudável ele estaria cometendo um erro do tipo False Negative. Então, de acordo com a lógica que estávamos tendo anteriormente, em um classificador de portadores de COVID nosso objetivo não é simplesmente ter o menor número de erros possível; na verdade queremos o menor número de False Negatives possível.

Também existem casos em que o tipo de erro que queremos minimizar são os False Positives. Se pegarmos o exemplo de um classificador de spams, seria pior se um e-mail importante fosse para caixa de spams do que se você recebesse alguns spams na caixa de entrada de vez em quando.

Taxas de Desempenho

Para avaliar um classificador com relação aos False Positives ou False Negatives usam-se algumas taxas de desempenho, cujos valores possíveis variam de 0 a 1, em que 1 é o valor ótimo.

Recall, True Positive Rate (TPR) ou Sensitividade

Mede uma proporção dos valores que são de facto positivos e que foram preditos corretamente.

É uma proporção entre os positivos verdadeiros (TP) e os falsos negativos (FN), conforme apresentado na fórmula.

Precision

Mede a proporção de predições positivas que estão corretas, ou seja, quão bem o modelo predisse os valores positivos.

É uma proporção entre os positivos verdadeiros (TP) e os falso positivos (FP), conforme apresentado na fórmula.

Precision e Recall estão entre os principais indicadores para avaliação de modelos, isso acontece porque ambos comparam TP com os erros cometidos. E conforme vimos anteriormente, dependendo do problema desejamos minimizar apenas um desses erros, FP ou FN.

False Positive Rate (FPR) Diferentemente do Recall, a FPR é uma taxa que caracteriza os valores falso positivos (FP) com relação aos verdadeiro negativos (TN).

Indica, portanto, quanto da classe negativa foi predito incorretamente.

Podemos calcular cada uma dessas taxas usando a matriz de confusão gerada usando o scikit-learn.

Problemas das Taxas de Desempenho

Apesar das Taxas de Desempenho serem uma maneira mais circunspecta de analisar o desempenho de um modelo, não seria interessante usar apenas o Recall e ignorar a Precision, por exemplo. O ideal seria ter um valor que conseguisse integrar ambas as taxas.

F-measure

Como dito anteriormente, às vezes a Precision é mais importante que o Recall ou vice-versa, mas ainda assim não é possível abrir mão de nenhuma delas.

A F-measure é uma média (harmônica) ponderada justamente para resolver esse problema, pois variando os pesos dessa média é possível dar mais ênfase ao valor do Recall ou Precision, ao mesmo tempo que não se fecham os olhos para a nenhuma das duas taxas. Se ponderarmos as taxas com um peso α arbitrário a fórmula geral da F-measure fica assim:

Contudo, nem sempre é trivial determinar o valor desse peso α. Suponha que no projeto no qual você está trabalhando o Recall é n vezes mais importante que a Precision, qual valor de α você deve escolher de modo que a exigência do projeto seja atendida? Para resolver esse problema é usado o parâmetro β, que torna o uso da F-measure bem mais intuitivo.

β é definido de maneira que o valor escolhido seja o número de vezes que o Recall é mais importante do que a Precision para o seu projeto, ou seja,

Por exemplo, em um projeto em que a Precision é duas vezes mais importante que o Recall (i.e. Recall tem metade da importância da Precision). Você teria que usar β = 1/2 para ponderar sua F-measure, enquanto, se estivesse usando α, seria α = 4/5. Usar β é mais conveniente, não?

Vamos supor que no classificador do COVID você queira dar duas vezes mais importância para o Recall do que para a Precision, ou seja, é duas vezes mais importante que as pessoa com Corona Vírus sejam detectadas pelo classificador do que que todas as pessoas detectadas pelo classificador estejam realmente com o vírus. Segue abaixo uma implementação disso no scikit-learn.

Problemas da F-measure

Tanto a Acurácia quanto a F-measure tem um grande problema com datasets desbalanceados. Um dataset está desbalanceado quando existem muito mais entradas (entries) de uma das classes que da outra, e.g. imagine que o hospital tenha nos dado um dataset contendo informações de 5000 pacientes, dos quais 4700 estavam com COVID. Caso nosso modelo fosse fortemente enviesado, ou seja, praticamente sempre classificasse os pacientes como portadores de COVID, ele conseguiria uma acurácia de 94% e um F2 de 98.7%. Veja como podemos ter esses resultados no código abaixo.

Um modelo fortemente enviesado certamente não é bom, apesar disso, caso nosso dataset esteja muito desbalanceado, as métricas que vimos até agora podem nos fazer acreditar o contrário. A relação das métricas numéricas com dados desbalanceados é um tema muito sútil e que mereceria um Turing Talks inteiro para ser discutido.

Métricas Gráficas

Em problemas de classificação binária, precisamos que o modelo distingua uma observação de dados entre 0 e 1. Contudo, os modelos geralmente não retornam esse resultado de maneira discreta, isto é, ou ‘0' ou ‘1’. O que acontece é que a resposta (Y) do modelo é representada por um valor numérico entre zero e um, que garante uma “confiança” para a classificação.

Mas você deve estar se perguntando: se o modelo retorna um (Y) entre zero e um, como se distingue uma resposta entre ‘0’ e ‘1’?

Isso acontece por meio de um limite, ou threshold (t). Esse limite determina qual valor separa um resultado ‘1’ e um ‘0’. Por exemplo, se atribuirmos t = 0.5, significa que os valores abaixo de 0.5 serão ‘0’ e os valores acima serão ‘1’.

O threshold é extremamente importante em modelos de classificação, pois como veremos, ele está diretamente relacionado com a performance de um modelo.

Receiver Operating Characteristic Curve (ROC Curve)

A curva ROC mede a performance de um modelo para diferentes thresholds. Essa curva é definida com os seguintes eixos:

  • y = Recall, ou True Positive Rate (TPR);
  • x = False Positive Rate (FPR);

Dessa forma, para cada variação no threshold que fizermos, obteremos um ponto para a curva ROC a partir de uma matriz de confusão. Ao final do processo, esperamos uma curva similar a abaixo.

Analisando essa curva, podemos decidir qual threshold (t) usar, escolhendo conforme as necessidades do problema.

Por exemplo, para o problema de identificar pessoas com COVID-19 é necessário garantir um TPR (True Positive Rate) alto, para que ninguém que esteja com a doença não seja identificado com a doença. Para isso, poderíamos escolher um ‘t’ de forma que o TPR seja 1.0, ou tão próximo deste valor quanto desejarmos.

Infelizmente, temos o problema de que quanto maior quisermos o TPR, maior será o valor de FPR, aumentando portanto a presença de falso positivos.

Outra maneira de avaliar a curva ROC é analisando a baseline, pois ela representa onde TPR e FPR são iguais, e isso indica que é impossível escolher um threshold ‘t’ que aumente TPR sem piorar o FPR.

Contraste entre modelo Ideal e Real

O ideal seria encontrar um threshold que garante máximo de TPR e mínimo FPR, obtendo uma distribuição de TP e TN disjunta. Assim, teríamos algo similar ao que é apresentado na curva abaixo.

Modelo Ideal

No entanto, o que costumamos encontrar na realidade é uma interferência entre as distribuições de TP e TN, tornando este problema um trade-off, ou seja, para obter melhor resultado em um dos indicadores devemos perder eficácia no outro

Area Under ROC Curve — AUROC

Outra métrica para avaliar a performance de modelos é a AUROC, geralmente tratada como AUC (Area Under The Curve), que é simplesmente a área sob a curva ROC, como indicado ao lado.

Podemos compreender esse indicador como a habilidade do modelo de categorizar corretamente os dados, com valor máximo em 1 e mínimo em 0.

Dado as características dessa métrica, ela é comumente utilizada para comparar a performance de modelos, por exemplo, verificar se uma regressão logística é melhor que um SVM para identificar pessoas com COVID-19.

Assim sendo, desejamos a maior área possível, que por sua vez fornece o melhor modelo para o problema em questão.

Para calcular esse indicador, podemos recorrer novamente ao scikit-learn:

Conclusão

As métricas comentadas nesse Turing Talks são a base da análise de performance da maioria dos classificadores que existem e cada uma delas tem seus pontos fortes e fracos. Portanto, é sempre importante pensar como se pode gerir o modelo a fim de que, em situações importantes como a criação de um classificador de pacientes com COVID-19, seu modelo possa fazer o maior bem possível.

As métricas são as ferramentas que você precisava para que isso seja possível.

Esperamos que vocês tenham gostado do texto! Se quiserem conhecer um pouco mais sobre o que fazemos no Grupo Turing, não deixem de seguir as nossas redes sociais: Facebook, Instagram, LinkedIn e, claro, acompanhar nossos posts no Medium.

Até a próxima!

--

--