Detecção de anomalias usando o Isolation Forest
Principalmente quando você não tem uma resposta. Confira para saber mais!
Introdução
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.
Para começar, o que é uma anomalia?
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.
Mas por que nos interessaríamos por anomalias?
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:
- Fraudes financeiras;
- Falhas em sistemas ou na fabricação de peças;
- Aumento ou queda repentina nas vendas;
- Mudança no comportamento do cliente;
- Monitoramento da integridade dos sistemas de software, etc.
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!
E você me pergunta, por que usar machine learning e não outro método?
Pensando nisso quero falar sobre os métodos de detecção de anomalias:
Detecção manual
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.
Detecção estatística
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.
Detecção via modelagem preditiva
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:
- Não supervisionado: neste caso, o tipo de aprendizagem não depende de nenhum dado de treinamento com rotulagem. Baseia-se em uma estimativa estatística de que a maioria dos dados são típicos e que uma porção menor seriam dos dados atípicos. Exemplos comuns de algoritmos incluem: One class SVM, K-nearest neighbors (KNN), K-Means e Isolation Forest.
- Supervisionado: aqui os dados devem ser pré-rotulados. Isto porque precisamos aprender com os exemplos existentes como identificar o que deve ser considerado normal ou anomalia. Envolve o treinamento de um classificador com um conjunto de informações marcadas como dados típicos e atípicos.
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.
Finalmente, vamos falar sobre o Isolation Forest!
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.
- O isolamento de características normais, por exemplo, os pontos azuis mais ao final das árvores do esquema acima, não precisam ser construídos. Essa característica de isolamento das iTrees permite que um modelo parcial seja desenvolvido e que a subamostragem de variáveis sejam percorridas, algo que não seria viável com outros algoritmos. Um tamanho pequeno de amostras produz melhores iTrees, porque os efeitos de swamping e masking são reduzidos.
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.
- O custo computacional de distâncias ou densidade não existe, pois o iForest não utiliza medidas de distância ou densidade para detectar anomalias.
- Volume grande de dados com altas dimensões ou conjunto de variáveis irrelevantes são trabalhados bem pelo iForest, que tem capacidade de escalar verticalmente.
Agora, vamos aos passos seguidos pelo algoritmo:
- As iTrees são construídas por particionamento recursivo do conjunto de dados — isto é, o particionamento ocorre até que as instâncias sejam isoladas ou até que uma altura específica de iTree seja alcançada e o modelo parcial é criado (detalhes nos algoritmos 1 e 2).
- Um escore de anomalia é proveniente do comprimento do caminho esperado — E(h(x)) — para cada instância. Sendo que E(h(x)) são oriundos da passagem de instâncias através de cada iTree em um iForest.
- Com a função tamanho do caminho (PathLength), um comprimento de caminho único se origina contando o número de arestas e do nó raiz até um nó final conforme a instância atravessa uma iTree (detalhes no algoritmo 3).
Isto é, no iForest as anomalias são “poucas e diferentes” tornando-as mais suscetíveis ao isolamento do que as observações normais!
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.
Exemplo de implementação do iForest
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:
age
: idadeworkclass
: tipo de trabalhofnlwgt
: peso final de estimativas da população civil EUA (Current Population Survey — CPS)education
: nível educacionaleducation-num
: tempo em anos de estudomarital-status
: estado civiloccupation
: profissãorelationship
: tipo de relacionamentorace
: raçacapital-gain
: ganho de capitalcapital-loss
: perda de capitalhours-per-week
: número médio de horas no trabalhonative-country
: país de origemincome
: nível de renda
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:
Considerações finais
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:
- É comum encontrar “ruído” entre os eventos atípicos — por isso, é tão importante definirmos o que pode ser considerado normal.
- Por ser um método não supervisionado, não é possível avaliar o algoritmo por métricas como Acurácia, AUC, KS, etc. Existem outras métricas para serem utilizadas e para saber mais vale você conferir os links ao final.
Espero que tenha gostado do artigo! Em caso de dúvidas fico à disposição no LinkedIn. Não deixe de conferir nossos outros posts.
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:
- F. T. Liu, K. M. Ting and Z. Zhou, “Isolation Forest”, 2008 Eighth IEEE International Conference on Data Mining, 2008, pp. 413–422, doi: 10.1109/ICDM.2008.17.
- Isolation Forest com o scikit-learn
- How to Evaluate Unsupervised Anomaly Detection for User Behavior Analytics
- Novel Performance Metrics for Anomaly Detection Algorithms
- PyData: Unsupervised Anomaly Detection with Isolation Forest — Elena Sharova