O novo avanço em dados sintéticos

Como usar GANs para melhorar os seus dados

Ricardo Pinto
Data Hackers
5 min readJun 16, 2021

--

Foto por Siti Rahmanah Mat Daud no Unsplash

Em algum momento na sua carreira de ciência de dados você vai se deparar com um problema onde um evento, geralmente aquele que está tentando prever, é menos frequente que os demais.

Afinal, a realidade é assim — acidentes de carro ou pessoas doentes são mais escassos (ainda bem!) do que trajectórias de carro completadas com sucesso ou pessoas saudáveis.

Este tipo de problema é classificado como dados desbalanceados. E embora não exista um número que defina isso, você sabe que os seus dados são desbalanceados quando a distribuição de classes é enviesada.

Você pode estar pensando, se os meus dados representam a realidade então é um ponto positivo. Porém os seus algoritmos de aprendizado de máquina (ML) discordam de você.

Não vou mergulhar nos detalhes dos problemas associados com classificação desbalanceada (se quiser saber mais sobre este tópico em particular recomendo este artigo), mas imagine o seguinte:

O seu algoritmo de ML precisa “ver” pacientes saudáveis 1000 vezes para reconhecer o que é um paciente saudável, e o rácio de doente para saudável é de 1:1000. No entanto, você quer que ele reconheça pacientes doentes também. O que implica que é necessário ter uma base de dados de 1000000 pacientes para que o seu algoritmo de ML tenha informação suficiente para reconhecer ambos os tipos de pacientes.

Nota: isto é uma mera ilustração, debaixo dos panos as coisas não acontecem exatamente assim.

Aposto que agora está começando a entender como o problema pode escalar rapidamente.

Felizmente os nossos caros amigos estatísticos desenvolveram métodos para nos ajudar a resolver este problema.

Na verdade, desde a década de 1930 que vários métodos existem, cada um com o seu caso de uso, desde permutações a bootstrapping, sendo assim opções não faltam.

Além disso, se você não é novo em ciência de dados, provavelmente já usou alguma técnica de reamostragem durante o processo de treinamento do seu modelo, como a validação cruzada.

Bootstrapping é um dos métodos mais comuns hoje em dia, e:

A ideia por trás do bootstrap é simples: Se reamostrarmos pontos com substituição dos nossos dados, podemos tratar os dados reamostrados como um novo conjunto coletado num universo paralelo.

Manojit Nandi

E para isso precisamos:

Assumir que cada observação é randomicamente selecionada da sua população — Noutras palavras, que qualquer observação tem igual probabilidade de ser selecionada, e que a sua seleção é independente.

— Influentialpoints

Além de outros pressupostos dependendo do tipo específico do método de bootstrapping.

Isto contudo pode ter como resultado valores duplicados, claramente explicado neste vídeo.

Todavia, como no nosso exemplo de pacientes doentes, geralmente estamos tentando adicionar mais exemplos da classe minoritária, afinal já temos suficientes da majoritária, e adicionar valores duplicados não traz informação nova para o modelo.

Mas e se conseguissemos gerar novos dados não duplicados?

É exatamente o que o SMOTE, acrónimo para Synthetic Minority Oversampling Technique, faz.

O SMOTE é provavelmente a abordagem mais utilizada para gerar dados sintéticos e se aproveita do algoritmo de clusterização KNN para:

Selecionar dados que estão perto no espaço das features, desenhando uma linha entre eles nesse espaço e desenhando uma nova amostra num ponto ao longo dessa linha.

Jason Brownlee

Contudo, já que apenas olhamos para a classe minoritária enquanto geramos novos dados, acabamos desconsiderando o efeito que a classe majoritária possa ter, o que pode resultar na produção de exemplos ambíguos se existir uma sobreposição das classes.

Não só isso, mas também como estamos trabalhando com clusterização, a dimensionalidade e os tipos de variáveis podem se tornar um problema, dificultando a obtenção de bons resultados durante a etapa de preparação dos dados.

Podem se encontrar algumas variações que abordam estes problemas de uma forma ou de outra (recomendo olhar a documentação do scikit-learn para um melhor entendimento de como tratar esses problemas) porém todos têm uma coisa em comum: pressupostos.

E se conseguissemos gerar novos dados sem nenhum pressuposto?

Aqui é onde a mais recente técnica entra: Redes Generativas Adversárias (Generative Adversarial Networks), ou GANs para abreviar.

Se você nunca ouviu falar delas, tire um tempo para saber mais sobre elas aqui.

Porém se o seu tempo é curto, ou você gosta de conteúdo simplificado, veja o que as GANs são capazes de fazer (e se você viu o vídeo: sim, acabou de ver pessoas que não existem).

Incrível, não é?

Mas, o que eu vim dizer não é o que são GANs, mas sim como elas podem gerar novos dados para você (afinal imagens são apenas dados)!

Como elas abstraem a parte dos pressupostos devido à sua natureza não supervisionada, elas são capazes de detetar novos padrões adicionando assim uma variabilidade maior nos dados gerados. Tudo isto com a capacidade de lidar com uma escala maior de tipos de variáveis e dimensionalidade.

Não só isso, mas também permitem uma maior liberdade na etapa de preparação dos dados, pois existem várias arquiteturas disponíveis para cada caso de uso.

Ok, mas você deve estar se perguntando como é que eu as posso usar?

Basta começar por:

É isso mesmo, os nossos caros amigos da Ydata lançaram uma ferramenta open source no Github para nos ajudar neste quesito.

E como se não fosse suficiente ainda criaram uma comunidade de dados sintéticos no Slack onde podes falar sobre o tema e tirar dúvidas sobre a ferramenta.

Após a instalação, podes escolher a arquitetura que melhor se adapta aos teus dados e começar com a diversão:

Gist criado usando o exemplo paraTimeGAN

E voilá! Você já tem novos dados para brincar, e finalmente um conjunto balanceado para “alimentar” o seu algoritmo de ML.

Então, sempre que enfrentar uma situação de dados desbalanceados, pare para pensar qual solução melhor se adequa à sua necessidade e faça o balanceamento.

No entanto, leve em consideração que a geração de dados sintéticos não é uma solução mágica para o seu conjunto desbalanceado:

A reamostragem pode melhorar a performance do modelo se as classes alvo são desbalanceadas porém suficientemente representadas. Neste caso, o problema é realmente a ausência de dados. A reamostragem leva por consequência ao over ou underfitting ao invés de uma melhor performance do modelo.

Maarit Widmann

Finalmente, conheça os seus limites e os seus usos, e use a geração de dados com cuidado e responsabilidade.

Adicionalmente, se quiser discutir ou falar mais sobre este tópico eu recomendo que entre na comunidade de dados sintéticos.

P.S: Os criadores do Ydata permitiram o uso do seu exemplo neste artigo.

Fontes de informação adicionais:

  1. Resampling Methods.

--

--

Ricardo Pinto
Data Hackers

Data Scientist with a civil engineering background. Water polo player. Loves ML/AI, data, decision science, gaming, manga.