Dados Desbalanceados — O que são e como lidar com eles
Escrito por Felipe Azank e Gustavo Korzune Gurgel
De acordo com os últimos levantamentos, atualmente nós humanos produzimos mais de 2,5 quintilhões de bytes de dados todos os dias. Apesar de parecer assustador, uma vez que esse número é aproximadamente 100 mil vezes o número de células de um corpo humano, esse fato levanta a possibilidade de analisarmos e estudarmos cada vez mais dados e aspectos da vida humana. Contudo, não é incomum, em nossas idas e vindas no mundo dos dados, nos deparamos com datasets que demonstram categorias muito mais frequentes que as demais e que prejudicam nossas previsões e modelos.
Tendo isso em vista, hoje conheceremos em detalhe sobre esse tipo de dataset, além de sua identificação, seus problemas e como evitar que esse fenômeno prejudique o seu modelo e suas previsões. Hoje vamos falar de Dados Desbalanceados.
Para isso, seguiremos a seguinte estrutura:
- Definição
- Problemas ocasionados
- Ressalvas
- Lidando com Dados Desbalanceados
- Conclusão
Definição
Dados Desbalanceados podem ser definidos pela pequena incidência de uma categoria dentro de um dataset (classe minoritária) em comparação com as demais categorias (classes majoritárias). Na maioria dos casos, isso faz com que tenhamos muitas informações a respeito das categorias mais incidentes, e menos das minoritárias, o que pode, em muito casos, interferir no workflow padrão de um Cientista de Dados.
O desbalanceamento nos dados mostra-se presente em diversos setores e campos do conhecimento, não sendo incomum encontrarmos eles regularmente e em contextos variados. Como em dados de diagnóstico e prognostico de câncer, em que a maioria das pessoas que realizam o experimento apresentam um resultado negativo; fraudes de pagamento, as quais costumam ocorrer em menor incidência do que não-fraudes; e até em sua caixa de spam, na qual a maioria dos e-mails são legítimos.
Problemas ocasionados
Contudo, mesmo sendo bem presentes no cotidiano de um cientista de dados, se não lidados de alguma maneira, dados desbalanceados podem acarretar em problemas na construção de modelos e na geração de previsões.
Se desenvolvermos um modelo sem considerar essa desproporcionalidade nos dados, o modelo será vítima do Paradoxo da Acurácia (explicado no último Turing Talk), em que os parâmetros do algoritmo não diferenciarão a classe minoritária das demais categorias, acreditando que estão agregando resultado devido à aparente alta acurácia.
Essa falta de diferenciação pode ocasionar problemas sérios, uma vez que a identificação desses casos minoritários podem ser o cerne do desafio a ser resolvido. Vamos usar como exemplo o caso citado acima: Se nosso modelo não diferencia com sucesso os diagnósticos positivos para câncer, classificando-os como casos negativos (classe majoritária), estaríamos mandando pacientes com câncer para casa, o que apenas agregaria prejuízos.
Ressalvas
Apesar de seu potencial destrutivo na criação de modelos, os dados desbalanceados nem sempre mostram-se tão nocivos em determinadas áreas da Ciência de Dados. Segue portanto, algumas ressalvas que podemos levantar sobre os dados desbalanceados:
Para análise de dados, dados desbalanceados nem sempre são um problema
Antes de montarmos qualquer modelo, explorar os dados e buscar insights lógicos a respeito dos dados que temos é sempre importante (quando se não, a tarefa principal). Em muitos casos, o fato de estarmos trabalhando com dados desbalanceados durante a análise nem sempre trás prejuízos aos seus insights uma vez que algumas conclusões não necessitam de uma quantidade elevada (porém suficiente) de dados. Ademais, é de se perceber que, em muitos casos, descobrir o “porquê” do desbalanceamento pode trazer informações válidas para a resolução do problema.
Com classes muito diferentes, lidar com o desbalanceamento é desnecessário
Outra ressalva importante e destacar se relaciona com a diferença entre as categorias majoritária e minoritária: em alguns casos sua diferença é tão grande que alguns modelos conseguem distinguir as classes mesmo com uma quantidade pequena de dados.
Um exemplo simples que retrata esse cenário seria na criação de um modelo que diferencia humanos e girafas com base na altura, mesmo com poucos humanos no dataset, a maioria dos modelos captará a grande diferença de altura entre as espécies.
Porém, para trabalhar da melhor forma com os dados e eliminar as incertezas, lidar com os dados desbalanceados de alguma maneira sempre é a melhor escolha a se fazer.
Lidando com Dados Desbalanceados
Após essa introdução e apresentação dos problemas causados pelos Dados Desbalanceados, vamos agora estudar algumas das formas mais comuns que existem para resolver esse empecilho.
1-Reestruturação dos Dados
Uma forma de tirar o viés causado pela diferença de proporção das categorias consiste em manipular a quantidade de dados que são efetivamente utilizados pelo modelo de Machine Learning, tentando igualar o número de observações entre as classes.
1.1-Undersampling
Esse método consiste em reduzir o número de observações da classe majoritária para diminuir a diferença entre as categorias.
Há duas formas de realizar o Undersampling:
- Random Undersampling, que consiste na retirada aleatória de dados da classe majoritária (o que acarreta em uma perda grave de informação), ou;
- Utilizar métodos para “unir” duas ou mais observações de classes majoritárias em apenas uma, o que acarreta em uma menor perda de informação. Entre os métodos de fusão de dados mais famosos, podemos encontrar os algoritmos clássicos de clusterização, algoritmos de k-NN (K-Nearest Neighbors Algorithm), NearMiss, entre outros.
A implementação básica desses métodos podem ser encontradas na biblioteca imbalanced-learn, com aplicações que podem ser vistas a seguir.
É importante ressaltar que independentemente do método usado para o Undersampling a frequência dos dados acaba igual, mas a distribuição deles é diferente, e isso é o que se reflete na performance do modelo. Segue a frequência dos dados após o Undersampling.
1.2-Oversampling
Ao contrário do Undersampling, o Oversampling consiste em criar sinteticamente novas observações da classe minoritária, com o objetivo de igualar a proporção das categorias.
A maneira mais primitiva de fazer um Oversampling é por meio de cópias de dados já existentes na classe minoritária. Por exemplo, se nossos dados possuem três parâmetros (x, y e z) o Oversampling poderia ser feito escolhendo algumas entries e simplesmente duplicando o número de vezes que essas entries aparecem. A conduta descrita acima pode oferecer bons resultados quando a classe minoritária não tem uma variação quantitativa muito grande nos seus parâmetros, caso contrário o modelo pode ficar muito bom em identificar casos específicos da classe minoritária e não a categoria como um todo.
1.2.1-SMOTE
Com o objetivo de resolver o problema acima, foi proposta uma técnica mais sofisticada conhecida como SMOTE. A ideia por trás dela consiste em criar observações intermediárias entre dados parecidos, ou seja, se no dataset existem 2 pessoas, uma com altura 1,80 m e pesando 78 kg, a outra com 1,82 m e pesando 79 kg; o algoritmo do SMOTE adiciona uma “pessoa” intermediária medindo 1,81 m e pesando 78,3 kg. Vale notar que o SMOTE não seleciona necessariamente a média entre ambas as informações preexistentes.
Veja abaixo a implementação desses dois métodos.
Concluindo, enquanto o Random Oversampling simula a existência de casos específicos e aleatório da classe minoritária, o SMOTE tenta simular a classe minoritária como um todo. Tal diferente de implementação gera um aumento na performance do modelo como ainda será demostrado neste texto.
Segue o gráfico da frequência dos dados após o Oversampling:
2-Escolher um algoritmo mais resiliente
Existem diversos algoritmos de classificação, todos com suas peculiaridades, fraquezas e vantagens. Em tratar-se de Dados Desbalanceados, há algoritmos mais robustos e que agregam mais resultado no modelo do que outros. Modelos como Gradient Boosting, por exemplo, demonstram um desempenho melhor lidando com dados desbalanceados do que modelos como o KNN e SVM.
Para decidir que algoritmo usar e qual é mais robusto para determinada situação, é sempre bom conhecer um pouco sobre a parte teórica de cada um deles. Por sorte, temos uma coleção de Turing Talks que tratam em detalhe sobre os principais.
3-Coletar mais dados
Se você se encontra em uma situação em que é de fato possível coletar mais dados da classe minoritária, não deixe de fazê-lo. Pode não ser o método mais fácil, mas com certeza é o mais eficaz para atingir o balanceamento.
Entretanto, é de extrema importância utilizar essa técnica apenas em situações que os dados a serem adicionados são similares o suficiente com a sua base inicial. Haja vista que dados distintos podem prejudicar os parâmetros do modelo.
Um exemplo simples do uso correto e incorreto desse método pode ser visto em um hipotético estudo de altura entre homens e mulheres da cidade de São Paulo (média: 162,0 cm). Se, na tentativa de aumentar a quantidade de dados referentes à mulheres, você adicionasse mais alturas de garotas da cidade de Campinas (média: 161,8 cm), esses dados apresentariam uma alta probabilidade de serem semelhantes em relação à sua distribuição. Entretanto, se, no lugar de garotas de Campinas, você adicionasse alturas referentes a mulheres da Grécia (média: 169,1 cm), talvez esses dados não ajudariam o modelo a atingir resultados melhores.
4-Usar modelos Penalizados (diferentes funções de custo)
Usualmente, os modelos de Machine Learning, enquanto atualizam seus parâmetros na base de treino, penalizam erros de classificação da mesma forma para todas as classes, isto é, classificar A como B ou B como A será penalizado da mesma maneira pela função de custo.
Para que seja possível fazer um modelo mais resistente aos Dados Desbalanceados, adicionar uma penalidade maior para erros de classificação da categoria minoritária faz com que o algoritmo “tome mais cuidado” em errar essa classe. Dessa forma, teremos um modelo que evitará entregar resultados que ignorem as categorias com menores observações.
5-Utilizar outras métricas para o Treino
Como padrão para a maioria dos modelos “clássicos” de Machine Learning, a métrica utilizada para treino dos parâmetros é a acurácia, contudo, com, como vimos anteriormente, problemas com Dados Desbalanceados costumam ser vítimas do Paradoxo da Acurácia.
Uma maneira que visa resolver isso consiste em alterar a acurácia como métrica de treino, substituindo-a por outra mais estratégica para que seu modelo tenha parâmetros que “tome mais cuidado” em errar a classe minoritária, assim como o método anterior de mudança da função de custo.
6-Utilizar as métricas corretas de avaliação
Por fim, assim como a construção de qualquer modelo de Machine Learning, verificar o desempenho de seu modelo com diferentes métricas pode te ajudar a encontrar eventuais problemas com Dados Desbalanceados, assim como verificar posteriormente se o modelo efetivamente soluciona esses problemas.
Caso ainda não tenha visto, não deixe de consultar nosso Turing Talks sobre as métricas de avaliação para problemas de Classificação e Regressão.
Como foi comentado no Turing Talks de métricas de avaliação, as métricas clássicas nem sempre são um meio confiável de avaliar um modelo treinado em dados desbalanceado.
Implementando os intens 4,5 e 6
As práticas descritas nos itens 4,5 e 6 são muito interdependentes e quando se deseja implementá-las é possível adicionar muita substância ao modelo com algumas poucas funções da bilbioteca scikit-learn. O uso dos parâmetros corretos nas funções é de suma importante para isso. Veja a implementação abaixo, e os resultados que ela gera:
O mais interessante de ser visto no código acima é que o manejo correto de dados desbalanceados pode resultar em melhorias muito expressivas na qualidade de predições. Perceba que em todos os casos os dados foram treinados com o mesmo modelo (SVM), mas após o resampling a performance do modelo nas métricas escolhidas cresceu fortemente.
Conclusão
Dados Desbalanceados estão por toda parte e podem causar inúmeros problemas na sua jornada como Cientista de Dados se não forem levados em consideração. Portanto, saber como lidar com eles e como melhorar o seu modelo perante essa adversidade torna-se uma ferramenta muito útil.
Esperamos que você tenha gostado e muito obrigado por chegar até aqui. Se quiserem conhecer um pouco mais sobre o que fazemos no Grupo Turing, não deixem de nos seguir nas redes sociais: Facebook, Instagram, LinkedIn e, claro, acompanhar nossos posts no Medium. Para acompanhar também um pouco de nosso projetos, acesse nosso GitHub.
Até a próxima!