Recentemente me envolvi em um projeto em que eu precisava identificar comportamentos não usuais em quadros societários de empresas. O fato de não ter uma variável resposta me deixou curiosa: como chegaria a uma solução escalável e acurada. Por esse motivo, encontrei o Isolation Forest (iForest), e resolvi compartilhar com vocês sobre detecção de anomalias e o uso desse algoritmo.
Segundo o Dicionário Priberam da Língua Portuguesa, o significado de anomalia é:
1. O que se desvia da norma, da generalidade;
2. Irregularidade;
3. Deformidade, monstruosidade.
Assim como na definição apresentada acima, na ciência de dados, anomalia pode ser considerada qualquer informação que se desvia do padrão normal estabelecido, tanto quanto observações que não se ajustam bem com o resto do conjunto de dados. Um exemplo visual poderia ser um conjunto de robôs e pessoas, em que as pessoas tem claramente características muito distintas dos robôs, e seriam consideradas atípicas, nesse caso.
Anomalias, ou os famosos outliers, muitas vezes podem nos indicar um comportamento diferente do esperado para o conjunto de informações. Isso ajuda na separação de classes, como em uma clusterização, ou para descobrir padrões no perfil de pessoas, em transações ou específicos de algum assunto.
Mas primeiro vamos "aterrissar", pois ainda não está muito concreto porque detectar anomalias pode ser útil.
Identificar informações que se destacam da maioria pode ser útil para:
Imagine um homem de 100 anos, responsável legal por 4 empresas, sendo que, pelo menos uma delas tem faturamento anual alto, apesar do baixo número de funcionários. Ele é um homem rico e com estudos incompletos (nunca chegou a faculdade). As informações sobre esse homem estão em uma base com 100 mil sócios de empresas. Como você consegue encontrá-lo? Podemos achá-lo usando um algoritmo detector de anomalias, aí entra o Isolation Forest!
Pensando nisso quero falar sobre os métodos de detecção de anomalias:
Visualização dessas informações em tabelas, figuras, fotos, gráficos, etc. É possível, através de uma inspeção visual, verificarmos se as regras de negócio correspondem com os dados. Lembrando que humanos são ótimos em detectar anomalias, mas essa não é uma solução escalável.
Podemos usar limiares de detecção, baseados em regras estatísticas que podem nos avisar quando algo sai da normalidade. Nesse caso, é necessário ajuste manual dos limiares, do que está sendo mensurado. Digamos que você trabalha para uma empresa de artigos esportivos e sabe que as compras ocorridas pelo site geralmente ficam entre um determinado intervalo de vendas feitas. Neste caso, você define os valores mínimo e máximo do esperado para as vendas pelo site e só recebe um alerta quando o número ultrapassa esses limites. Esse método leva a uma detecção tardia e erros são comuns, devido a falsos positivos.
Também conhecido como machine learning-based anomaly detection, em que algoritmos de aprendizado de máquina são utilizados para descobrir padrões nos dados, de forma acurada, e que minimizam os casos de falsos positivos. Quando falamos de machine learning, sabemos que existem dois tipos, o aprendizado não supervisionado e o supervisionado.
Para a identificação de informações que se desviam da maior parte dos dados, ambos os tipos podem ser utilizados, no entanto, tudo depende do problema a ser solucionado e do conjunto de dados que você tenha em mãos. Para ajudar na escolha do tipo de aprendizado faço uma breve descrição deles:
O quadro a seguir ajuda na escolha de qual pode ser o melhor método a depender do seu problema, afinal uma solução excelente geralmente é a mais simples.
Com o quadro acima, é possível avaliar qual a melhor solução para o seu problema, porém, estou aqui para falar sobre o Isolation Forest. Então vamos entender o porquê, dentro de tantos outros algoritmos, escolhi este.
Geralmente os algoritmos mais comuns para detecção de outliers se baseiam na construção de um perfil do que são dados típicos, e as anomalias são identificadas como aquelas observações que não se enquadraram no padrão considerado normal. Diferente do mencionado, o Isolation Forest identifica as anomalias isolando-as através de árvores binárias otimizadas. Além de detectar mais rápido usando menos memória em comparação a outros algoritmos de detecção de anomalias.
Como visto anteriormente, dizemos que anomalias são desvios no padrão dos dados, pois, sabemos que se apresentam como minorias, além de possuir valores das características muito diferentes daqueles das observações normais. O iForest tira proveito dessas propriedades para isolar as observações atípicas.
Seu princípio de funcionamento se baseia no algoritmo de árvore de decisão, como o Random Forest ou os modelos do tipo ensamble. Esses tipos mencionados, encontram regiões no espaço de variáveis para fazerem suas divisões (decisões), nas quais o iForest se beneficia das duas propriedades, isolando mais rapidamente os comportamentos anormais das características modeladas.
O algoritmo constrói um grupo de árvores (iTrees) para um determinado conjunto de dados, considerando anomalias naquelas instâncias (observações), que possuem caminhos médios curtos nas iTrees. Existem dois parâmetros para ajuste nessa abordagem: o número de árvores a serem construídas e o tamanho da subamostragem das variáveis. Mas antes de nos aprofundarmos no algoritmo, quero apresentar algumas particularidades que peguei em um artigo sobre ele.
Swamping effect: fenômeno de rotular instâncias típicas como atípicas.
Masking effect: conjuntos de instâncias atípicas e típicas misturadas em um único agrupamento, mascarando as anomalias.
Agora, vamos aos passos seguidos pelo algoritmo:
Além disso as anomalias precisam de menos partições aleatórias para serem isoladas em comparação com os dados típicos.
O pacote sklearn.ensemble.IsolationForest classificará a observação em 1 como típica e -1 como atípica, diferente da maioria dos algoritmos de classificação, que categorizam com valores 0 como não ocorrência do evento de interesse e 1 para o evento. Já a magnitude de anomalia — o quão próxima uma classificação está da melhor classificação possível — se dá pelo intervalo desde valores negativos (anomalia) até valores positivos (não anomalia).
Agora vamos colocar as “mãos à obra” e fazer um exemplo que demonstra a implementação do modelo em Python.
Encontrar um banco de dados para testar algoritmos de detecção de anomalias não é trivial. Por esse motivo, vamos utilizar aqui o conjunto de dados do censo de 1994 sobre a renda de adultos, o Census Income Data Set¹.
Originalmente, esses dados foram utilizados para prever se as pessoas ganharam até 50k por ano ou mais de 50k (nível de renda). Em nosso caso, vamos verificar se existem pessoas que tiveram uma renda atípica em relação às características do dataset.
Banco de dados utilizado:
Iniciamos importando as bibliotecas necessárias:
Salvando os nomes das colunas para adicionar ao dataframe quando carregá-lo:
Carregando os dados:
Fazendo uma inspeção inicial dos dados sabemos que possui 32.561 linhas e 15 colunas. A seguir estão as primeiras linhas:
O Isolation Forest não trabalha com valores ausentes, então devemos nos certificar se existem no banco:
Além de não aceitar valores nulos, o Isolation Forest trabalha apenas com variáveis numéricas, por isso, devemos pré-processar o dado antes de instanciar e treinar o modelo. Diferentes tipos de codificação podem ser realizados. Como muitos cientistas de dados usam o one-hot-encoding, explico porque não fui por esse caminho.
One-hot-encoding transforma as categorias das variáveis em novas variáveis. Por exemplo, a variável cor tem a possibilidade de 3 opções — amarelo, azul ou verde — logo o que era em uma coluna com três tipos de categorias, se transformam em 3 novas colunas. Quando temos um grande número de variáveis, para não aumentar a dimensão dos dados, vale a pena escolher outro tipo de codificação. Não foi o caso do exemplo usado aqui (só 15 variáveis), mas foi o do meu problema original que comentei no início. Baseado no meu problema, aqui utilizamos o pacote Feature-engine, para transformar as variáveis categóricas em float , com o uso do CountFrequencyEncoder , que utiliza a frequência das variáveis categóricas para realizar a transformação:
Instanciamos e treinamos o modelo usando configurações padrão (afinal esse é só um exemplo), menos o argumento de contaminação que estabeleço a 0.0001:
O argumento contamination serve para que a pessoa treinando o modelo estabeleça qual a quantidade de outliers no seu banco de dados. Você pode não saber quais são as observações que podem ser consideradas anomalias, mas um entendimento do problema você precisará ter antes de pegar um “punhado” de dados e rodar uma modelagem. Com base no seu estudo prévio e conversas com especialistas do assunto, você provavelmente chegará a um número que pareça aceitável. Se você tem dúvida de quanto de contaminação colocar, faça uma otimização desse hiperparâmetro.
E finalmente podemos verificar as anomalias que o algoritmo encontrou para esse parâmetro de contaminação:
O Isolation Forest é um algoritmo ideal para ser usado nos casos em que o evento a ser pesquisado é raro. Ideal lembrar que detectar uma anomalia está em nossa capacidade de definir o que pode ser considerado típico ou normal para o nosso conjunto de dados. Temos mais alguns pontos de atenção:
Espero que tenha gostado do artigo! Em caso de dúvidas fico à disposição no LinkedIn. Não deixe de conferir nossos outros artigos em nosso blog.
Para saber mais sobre a Datarisk acesse o nosso site e nossas redes sociais: Linkedin, Instagram e Youtube.
Até mais!
Obs: Se você se interessou pelo Isolation Forest e quer mais informações sobre a biblioteca, métricas e variações, confira os links a seguir:
Thanks to Emanuel Fontelles, Felipe Sassi, Carlos Relvas, and Rodrigo Pasqualucci