Dados Desbalanceados
Oversampling ou Undersampling? Por que não os dois juntos?
Entenda como o SMOTEENN combina os dois métodos de balanceamento e porque você deveria usá-lo.
Todo Cientista de Dados provavelmente já se esbarrou com um conjunto de dados desbalanceado, seja detectando fraudes em transações bancárias, prevendo o churn dos clientes, classificando emails como spam, ou até mesmo em modelagem de risco de crédito ao conceder um empréstimo.
Dados desbalanceados geralmente requerem um tratamento antes de alimentarem um modelo de machine learning. Isso porque modelos treinados com dados assim, não conseguem generalizar tão bem as previsões para a classe minoritária. Mas então, o que fazer nestes casos? Aí é onde entram os dois principais métodos de balanceamento: oversampling e undersampling.
Mas antes de entrarmos na explicação de cada um, vamos criar um conjunto de dados desbalanceado e visualizá-lo:
O conjunto que criamos acima possui 91 exemplos da classe 0 e apenas 9 exemplos da classe 1. Agora que já temos nosso conjunto de dados de exemplo, vamos entender o que podemos fazer para tratá-lo antes de alimentarmos o modelo preditivo.
Oversampling
O que essa técnica faz é basicamente aumentar o número de exemplos da classe minoritária, no nosso caso seria a classe 1. Existem vários métodos que fazem isso de formas diferentes, mas aqui nos concentraremos no SMOTE (Synthetic Minority Oversampling Technique)¹.
Basicamente, o que o SMOTE faz é gerar novos exemplos da classe minoritária através de interpolação entre os pontos mais próximos. Caso queira entender como o SMOTE funciona com mais detalhes, você pode acessar o paper original clicando aqui².
Vamos aplicá-lo ao nosso conjunto de dados gerado acima e vejamos o resultado:
Ao aplicar o SMOTE resolvemos um problema, porém criamos outro. O desbalanceamento não está mais presente (ambas as classes possuem 91 exemplos), porém o SMOTE gera novos exemplos sem se preocupar com os pontos vizinhos da classe majoritária, aumentando assim a transposição entre as classes, o que pode acabar introduzindo ruído³ nos dados.
Undersampling
Enquanto o oversampling aumenta a quantidade de exemplos da classe minoritária, o undersampling faz o contrário: ele diminui a quantidade de exemplos da classe majoritária. Um dos métodos mais utilizados é chamado de ENN (Edited Nearest Neighbours)⁴.
O ENN elimina exemplos de onde é mais provável que haja ruído de classe. O que geralmente ocorre em regiões onde as classes se sobrepõem ou quando se tratam de outliers. Ao eliminar estes pontos, a distinção entre as classes fica mais evidente.
Vamos aplicar o ENN aos nossos dados e visualizar o resultado:
Após a aplicação do ENN, a classe majoritária (classe 0) passou de 91 para 84 exemplos (a minoritária permanece intacta). Ao observar o gráfico, podemos perceber que os pontos que foram eliminados foram aqueles que estão mais próximos da classe 1, criando assim uma divisão mais clara entre as classes.
Mas o que eles têm em comum?
Vimos que o SMOTE resolve o nosso problema de desbalanceamento gerando novos exemplos para a classe minoritária, porém introduz ruído ao conjunto de dados. Também vimos que o ENN elimina exemplos que possuem mais chance de estar causando ruído nos dados, porém não resolve o problema de desbalanceamento do jeito que precisamos.
Dessa forma, podemos notar que um método complementa o outro. Não é uma questão de um ou outro, mas sim de “por que não um e outro?”. Com isso em mente, apresento-lhes o SMOTEENN (SMOTE + ENN)⁵.
SMOTEENN (SMOTE + ENN)
O SMOTEENN funciona da seguinte forma:
- Primeiro é aplicado o SMOTE ao conjunto de dados. Desta forma teremos novos exemplos gerados e um conjunto de dados balanceado, porém com mais ruído (provavelmente);
- Em seguida é aplicado o ENN, eliminando exemplos que possuem mais chance de estar causando ruído ao conjunto de dados.
Depois de aplicado, teremos um conjunto de dados balanceado e com menos ruído do que teríamos se tivéssemos aplicado apenas o SMOTE.
Vejamos a aplicação do SMOTEENN ao nosso conjunto de dados, e vamos comparar com os outros métodos:
Podemos ver que após aplicar o SMOTEENN, a separação entre as classes fica muito mais evidente, além de o conjunto de dados estar balanceado.
Mas então, qual o melhor afinal?
A Ciência de Dados não se trata de uma ciência exata, logo, a resposta para a pergunta acima (como você já deve imaginar) é: depende.
Não existe um método melhor ou pior, mas sim o melhor método para cada tipo de situação. O SMOTEENN geralmente traz resultados melhores do que o SMOTE ou ENN quando aplicados individualmente, mas isso não garante que ele se sairá melhor em 100% das vezes. É aí que entra o trabalho do Cientista de Dados de avaliar as métricas definidas e escolher o método que fornece o melhor desempenho naquela situação específica.
Referências e Notas
[1] Documentação do SMOTE no imblearn: Clique aqui
[2] Paper original do SMOTE: Clique aqui
[3] Nota sobre ruído: Existem vários tipos de ruído, este em específico é chamado de ruído de classe. Este tipo de ruído ocorre quando temos exemplos classificados erroneamente, ou seja, um ponto que deveria ser da classe “A” está rotulado como classe “B”. O SMOTE pode acabar introduzindo dados com este tipo de ruído ao gerar novos exemplos onde as classes se sobrepõem.
[4] Documentação do ENN no imblearn: Clique aqui
[5] Documentação do SMOTEENN no imblearn: Clique aqui