Saltar para o conteúdo

Technical

Métricas Difíceis de Otimizar: a ROC AUC

Paulo Maia · 18 de dezembro de 2020

Em muitos problemas de classificação binária, especialmente em domínios com dados altamente desbalanceados (como o domínio médico e detecção de eventos raros), é necessário garantir que o modelo não fica enviesado para a classe predominante.

É possível que tenha ouvido dizer que a precisão não é uma métrica adequada para validar classificadores em contextos desbalanceados. Em alternativa, recorre-se a outras métricas de desempenho robustas ao desbalanceamento, como a ROC AUC e o F1-score. Então, porque não treinar modelos que otimizem estas métricas diretamente? Bem, em alguns casos não é possível ou eficiente fazê-lo, pois não são diferenciáveis. Esta é uma série de artigos em que explicaremos como otimizar o seu modelo para estas métricas (ou versões aproximadas delas), começando pela ROC AUC.

O que é a ROC AUC?

Uma curva ROC é um gráfico que ilustra a capacidade diagnóstica de um classificador binário para diferentes limiares de decisão na sua saída probabilística. Constrói-se variando o limiar das probabilidades previstas pelo modelo entre 0 e 1 e calculando a Taxa de Verdadeiros Positivos (proporção de amostras positivas corretamente previstas como positivas) e a Taxa de Falsos Positivos (proporção de amostras negativas incorretamente previstas como positivas). A curva ROC é o gráfico de todos estes pontos, como se mostra a seguir.

Em machine learning, tipicamente pretendemos obter a curva com a maior área possível. Porquê? Talvez não soubesse, mas a área sob a curva ROC é igual à probabilidade de o classificador ordenar uma instância positiva escolhida aleatoriamente antes de uma instância negativa escolhida aleatoriamente (a prova deste teorema está disponível aqui). Ou seja, qual é a probabilidade de atribuir uma prioridade mais elevada a um doente do que a uma pessoa saudável.

Podemos assim compreender a ROC AUC como a precisão de um modelo de ordenação quando exposto a pares de amostras de classes opostas (por exemplo, um doente e uma pessoa saudável). Sendo a entropia cruzada a abordagem de facto mais comum para treinar classificadores binários quando nos focar em precisão, a entropia cruzada de um modelo de ordenação por pares (por exemplo, uma rede neuronal siamesa) seria uma forma aproximada de aprendizagem que tende a maximizar a ROC AUC.

Como otimizar a ROC AUC?

Digamos que temos um modelo (por exemplo, uma rede neuronal profunda) como o seguinte que, dadas as características de entrada, prevê uma pontuação contínua.

Como discutimos anteriormente, maximizar a ROC AUC é equivalente a maximizar a precisão do sinal da diferença de pontuação para um par positivo-negativo:

Podemos, portanto, usar uma arquitetura Siamese, em que cada ramo conterá o nosso modelo-alvo, treinado em pares positivo-negativo. Na nossa arquitetura, as pontuações serão subtraídas e passadas através de uma ativação sigmoid de forma a aproximar a probabilidade de a amostra positiva ter uma pontuação mais elevada do que a amostra negativa.

Para gerar os lotes de treino, cada par terá uma amostra de cada classe, uma no ramo negativo e outra no ramo positivo, o que significa que a verdade base será sempre 1, uma vez que a probabilidade do ramo positivo deverá ser sempre superior à probabilidade do ramo negativo. O modelo é treinado minimizando a perda de entropia cruzada deste alvo por pares. Não convergiremos para uma solução ingénua aqui, dado que os pesos em cada ramo de uma rede siamesa são partilhados.

Isto significa que o modelo é penalizado sempre que o lado negativo tem uma pontuação superior à do lado positivo. Desta forma, estamos a otimizar o modelo para que sempre atribua uma pontuação mais elevada à classe positiva (input_pos) quando comparada com a classe negativa (input_neg), o que é essencialmente a definição de otimizar a ROC AUC!

Então, como transformamos esta rede num modelo operacional que devolve as classes binárias? Precisamos de reduzir a rede a um único ramo, com os pesos pré-treinados, e determinar um valor de limiar para a pontuação prevista acima do qual o modelo classifica a classe como positiva.

Validação

Esta arquitetura foi testada no dataset CIFAR10 em Keras, criando um problema artificialmente desbalanceado. A classe positiva foi considerada como "aviões", e a classe negativa foi todas as outras classes do dataset. A classe positiva foi depois subamostrada para 5%, criando assim um problema artificialmente desbalanceado.

Depois, utilizámos uma rede neuronal feedforward com camadas internas de dropout e comparámos o desempenho da estratégia simples baseada em entropia cruzada com os modelos baseados em siamesa que discutimos neste artigo. A experiência foi repetida 5 vezes com diferentes sementes aleatórias para obter um valor médio mais independente do processo de seleção de imagens.

O valor médio de ROC AUC para a Rede Siamesa foi (86 ± 1,3)%, enquanto que para a rede de um único ramo o valor foi reduzido para (72,2 ± 7,2)%, mostrando que otimizar o modelo com a arquitetura siamesa foi benéfico para a ROC AUC.

Conclusão

Este artigo explicou como otimizar o seu modelo para uma métrica diferente, com base na interpretação probabilística da ROC AUC.

Na NILG.AI, trabalhámos em muitas aplicações médicas e de marketing, onde as variáveis-alvo tendem a ser extremamente desbalanceadas. Utilizámos esta estratégia em vários projetos, alcançando em cada caso um desempenho superior com esta estratégia de aprendizagem em comparação com abordagens tradicionais. Se enfrenta um problema semelhante, vamos discutir como podemos colaborar com este tipo de estratégias de aprendizagem!