Como a Rosie usa machine learning na Serenata de Amor.

O objetivo da Operação Serenata de Amor é usar Machine Learning para detectar corrupção em gastos públicos. Mas como isso é desenvolvido de um ponto de vista técnico?

Podemos observar em várias postagens os resultados de nosso trabalho, então, dessa vez, vou propor uma explicação sobre como esse processo é desenvolvido tecnicamente.

Em uma tarde de sábado, pareando com a Jessica Temporal em uma issue da Rosie — issue pra quem não é da área é como se fosse uma tarefa, que precisa ser adicionada, removida ou corrigida no projeto. Enfim, conversando sobre o projeto, decidimos voltar alguns passos e definir melhor o que estávamos planejando. O resultado foi uma análise completa do processo de como “ensinamos” novas suspeitas para a Rosie.

Testando hipóteses

O método começa quando definimos uma hipótese para ser aplicada à base de dados que estamos trabalhando. No nosso caso a hipótese era existência de despesas realizadas em empresas eleitorais, o que é ilegal segundo a Cota para Exercício da Atividade Parlamentar.

Para começar é desenvolvido um Jupyter Notebook com hipóteses, análises e conclusões. Testamos todas nossas ideias assim, de maneira bem simples. Depois que chegamos numa conclusão válida o suficiente, que retorne bons resultados, começamos a implementar esse conhecimento adquirido à Rosie.

Implementando uma hipóteses no fluxo de trabalho

Esse processo de implementação, é feito usando TDD (Test Driven Development), que é um técnica de desenvolvimento de software em que são criados casos de teste para produzir código. Nessa situação, a partir dos resultados obtidos no notebook criado anteriormente, elaboramos alguns casos de teste para auxiliar na idealização do código da Rosie.

Para começarmos a pensar na solução do problema, pensamos em uma base de dados simples que auxilie a validar nossos testes, ou, definindo tecnicamente, uma Fixture.

Seguindo TDD começamos escrevendo um teste, um caso de uso, e depois produzimos um código que faça esse teste funcionar. Depois que resolvemos a situação criada como teste, refatoramos o código escrito.

Nossos métodos no fluxo de machine learning

Como os nossos classificadores de Machine Learning utilizam apenas Unsupervised Learning atualmente, ou seja, descobre sozinho irregularidades a partir dos dados apresentados, usamos um padrão de desenvolvimento com os seguintes métodos:

  • fit(): ajusta os dados antes de trabalhar com eles, ou seja, faz um pré-processamento da base de dados;
Exemplo de classificador com função fit()
  • transform(): assim como o fit, é utilizado para pré-processamento da base de dados, como por exemplo na análise de limites da cota, faz um filtro no dados;
Exemplo de classificador com função transform()

Nesse caso, a avaliação não precisa de pré-processamento, então apenas passa o método.

  • predict(): é o último método a ser chamado, após os dados estarem prontos para serem avaliados, predict() implementa a classificação dos dados.
Exemplo de classificador com função predict()

Como nosso problema (detecção de corrupção) não se encaixa perfeitamente na interface padrão de desenvolvimento de Machine Learning, usada no scikit-learn, adaptamos o modelo a nossa necessidade. O padrão é implementado da seguinte forma:

  • fit(): aprende os padrões de uma base de dados;
  • transform(): pré-processa a base dados, para acelerar a classificação do predict();
  • predict(): aplica os padrões aprendidos na base de dados pré-processada.

Concluindo, assim desenvolvemos Machine Learning na Rosie, pode segui-la no GitHub.


Tentei adicionar alguns links que utilizamos como guia para desenvolver, e gostaria de agradecer à Jessica Temporal e ao Irio Musskopf pela ajuda a entender melhor o processo. Quem quiser (e puder) apoiar o projeto, estamos com uma campanha de crowdfunding recorrente na plataforma apoia.se.