Detecção de anomalias em aprendizado de máquina usando Python

Nos últimos anos, muitas das nossas aplicações vêm sendo orientadas pelo grande volume de dados que podemos coletar e processar. Pode-se dizer que estamos na era dos dados. Um dos aspectos essenciais de se lidar com um volume tão grande de dados é a detecção de anomalias — processos que nos permitem identificar valores atípicos, dados que estão fora dos limites esperados e têm um comportamento fora da norma. Na pesquisa científica, pontos de dados anômalos podem causar problemas técnicos e talvez precisem ser descartados ao tirar conclusões, mas também podem levar a novas descobertas.
Nesta postagem de blog, veremos por que é útil usar o aprendizado de máquinas para detectar anomalias e exploraremos as principais técnicas de detecção de anomalias usando Python. Você aprenderá como implementar métodos populares, como o OneClassSVM e o Isolation Forest, verá exemplos de como visualizar seus resultados e compreenderá como aplicá-los a problemas do mundo real.
Onde se usa a detecção de anomalias?
A detecção de anomalias também tem sido uma parte crucial da inteligência de negócios moderna, pois ela fornece insights sobre o que poderia dar errado e também pode identificar problemas em potencial. Veja alguns exemplos de usos atuais da detecção de anomalias nos negócios:
Alertas de segurança
Alguns ataques de segurança cibernética podem ser identificados através da detecção de anomalias; por exemplo, um pico no volume de solicitações pode indicar um ataque de DDoS, enquanto um comportamento suspeito de login, como várias tentativas fracassadas, pode indicar acesso não autorizado. Quando detectado, um comportamento suspeito por parte de usuários pode indicar ameaças em potencial à segurança cibernética e as empresas podem reagir de acordo para evitar ou minimizar os danos.
Detecção de fraudes
Organizações financeiras, como bancos, por exemplo, podem usar a detecção de anomalias para destacar atividades suspeitas em uma conta, que podem indicar atividades ilegais, como lavagem de dinheiro ou furto de identidade. Transações suspeitas também podem ser um sinal de fraude com cartões de crédito.
Observabilidade
Uma das práticas comuns em serviços de Web é coletar métricas sobre o desempenho em tempo real do serviço se ocorrer algum comportamento anormal no sistema. Por exemplo, um pico no uso de memória pode indicar que algo não está funcionando adequadamente no sistema e os engenheiros podem precisar resolver isso imediatamente, para evitar uma interrupção do serviço.
Por que usar aprendizado de máquina para detectar anomalias?
Embora os métodos estatísticos tradicionais também possam ajudar a encontrar valores atípicos, o uso do aprendizado de máquina para detectar anomalias mudou tudo. Com os algoritmos de aprendizado de máquina, é possível analisar mais dados complexos (por exemplo, com vários parâmetros) de uma só vez. As técnicas de aprendizado de máquina também fornecem um meio de analisar dados categóricos, que não são fáceis de analisar com os métodos estatísticos tradicionais, mais adequados para dados numéricos.
Muitas vezes, esses algoritmos de detecção de anomalias são programados e podem ser implementados como aplicativos (veja o nosso tuturial sobre FastAPI para aprendizado de máquina) e executados sob demanda ou a intervalos agendados para detectar quaisquer anomalias. Isso significa que eles podem desencadear ações imediatas dentro da empresa e também podem ser usados como ferramentas de geração de relatórios, para que equipes de inteligência de negócios os revisem e ajustem suas estratégias.
Tipos de técnicas e algoritmos de detecção de anomalias
Em linhas gerais, há dois tipos principais de detecção de anomalias: a detecção de valores atípicos e a de novidades.
Detecção de valores atípicos
Às vezes, a detecção de valores atípicos é chamada de detecção não supervisionada de anomalias, pois se presume que nos dados de treinamento haja algumas anomalias não detectadas (portanto, não rotuladas) e a abordagem consiste em usar algoritmos não supervisionados de aprendizado de máquina para identificá-las. Alguns desses algoritmos são as máquinas de vetor de suporte (SVMs) de classe única, o Isolation Forest, o Local Outlier Factor e o Elliptic Envelope.
Detecção de novidades
Por outro lado, às vezes se chama a detecção de novidades de detecção de anomalias semissupervisionada. Já que presumimos que nem todos os dados de treinamento consistem apenas de anomalias, eles são todos rotulados como nomais. O objetivo é detectar se novos dados são ou não anomalias, o que costuma ser chamado de “novidade”. Os algoritmos usados para detectar valores atípicos também podem ser usados para detectar novidades, desde que não haja anomalias nos dados de treinamento.
Além das já mencionadas detecções de valores atípicos e de novidades, também é muito comum que seja necessário detectar anomalias em dados de séries temporais. Porém, como a abordagem e as técnicas usadas nesses dados costumam ser diferentes dos algoritmos mencionados acima, nós as discutiremos em detalhes em outra ocasião.
Exemplo de código: encontrando anomalias no conjunto de dados de colmeias de abelhas
Nesta postagem, usaremos este conjunto de dados de colmeias de abelhas como exemplo para detectar quaisquer anomalias nas colmeias. Este conjunto de dados fornece várias medições da colmeia (incluindo a temperatura e a umidade relativa) em diferentes momentos.
Aqui mostraremos dois métodos muito diferentes para descobrir anomalias: o OneClassSVM, baseado na tecnologia de máquinas de vetores de suporte, que usaremos para traçar limites de decisão, e o Isolation Forest, um método de conjunto semelhante ao Random Forest.
Exemplo: OneClassSVM
Neste primeiro exemplo, usaremos os dados da colmeia 17, presumindo que as abelhas manterão sua colmeia como um ambiente constantemente agradável para a colônia. Podemos ver se isso é verdade ou se há momentos em que a colmeia tem níveis anômalos de temperatura e umidade relativa. Usaremos o OneClassSVM para encaixar nossos dados e olharemos os limites de tomada de decisão em um gráfico de dispersão.
O “SVM” em “OneClassSVM” vem do inglês support vector machine (“máquina de vetor de suporte”), um algoritmo popular de aprendizado de máquina para classificação e regressões. Embora máquinas de vetor de suporte possam ser usadas para classificar pontos de dados em dimensões altas, escolhendo um kernel e um parâmetro escalar para definir um limite, podemos criar um limite de decisão que inclui a maioria dos pontos de dados (dados normais), mas retém um pequeno número de anomalias fora desse limite, representando a probabilidade (nu) de encontrar uma nova anomalia. O método de usar máquinas de vetor de suporte para detectar anomalias foi examinado em um artigo de Scholkopf et al., com o título de Estimating the Support of a High-Dimensional Distribution (“Estimando o suporte de uma distribuição de dimensões altas”).
1. Inicie um projeto do Jupyter
Inicie um novo projeto no PyCharm (Professional 2024.2.2), selecionando Jupyter sob Python.

O benefício de usar um projeto do Jupyter (antes também conhecido como “projeto Scientific”) no PyCharm é que isso gera uma estrutura de arquivos para você, incluindo uma pasta para armazenar os seus dados e outra para armazenar todos os notebooks do Jupyter, para que você possa manter todos os seus experimentos no mesmo lugar.

Outro grande benefício é que podemos traçar gráficos muito facilmente com a Matplotlib. Você verá isso nas etapas abaixo.
2. Instale as dependências
Baixe este arquivo requirements.txt do repositório apropriado no GitHub. Depois de colocá-lo no diretório do projeto e abri-lo no PyCharm, você verá um prompt pedindo que você instale as bibliotecas que faltam.

Clique em Install requirements e todos os requisitos serão instalados para você. Neste projeto, usaremos o Python 3.11.1.
3. Importe e inspecione os dados
Você pode baixar o conjunto de dados “Beehives” do Kaggle ou deste repositório do GitHub. Coloque todos os três arquivos em CSV na pasta Data. Depois, digite o código a seguir no main.py:
import pandas as pd df = pd.read_csv('data/Hive17.csv', sep=";") df = df.dropna() print(df.head())
Por fim, clique no botão Run, no canto superior direito da tela, e nosso código será executado no console do Python, dando-nos uma ideia geral da aparência dos dados.

4. Encaixe os pontos de dados e inspecione-os em um gráfico
Como estaremos usando o OneClassSVM do scikit-learn, vamos importá-lo, juntamente com DecisionBoundaryDisplay e Matplotlib, usando o código abaixo:
from sklearn.svm import OneClassSVM from sklearn.inspection import DecisionBoundaryDisplay import matplotlib.pyplot as plt
Sabemos pela descrição dos dados que a coluna T17 representa a temperatura e RH17 representa a umidade relativa da colmeia. Vamos extrair o valor dessas duas colunas como nossa saída:
X = df[["T17", "RH17"]].values
Depois, vamos criar e encaixar o modelo. Observe que primeiro vamos experimentar a configuração-padrão:
estimator = OneClassSVM().fit(X)
Em seguida, vamos mostrar o limite de decisão, juntamente com os pontos de dados:
disp = DecisionBoundaryDisplay.from_estimator( estimator, X, response_method="decision_function", plot_method="contour", xlabel="Temperature", ylabel="Humidity", levels=[0], ) disp.ax_.scatter(X[:, 0], X[:, 1]) plt.show()
Agora, salve, clique novamente em Run e você verá que o gráfico será mostrado em uma janela separada para ser inspecionado.

5. Faça o ajuste fino dos hiperparâmetros
Como mostra o gráfico acima, o limite de decisão não se encaixa muito bem nos pontos de dados. Esses pontos consistem de umas formas irregulares, em vez de uma oval. Para fazermos o ajuste fino do nosso modelo, teremos que fornecer um valor específico de “nu” e “gama” ao modelo OneClassSVM. Você pode experimentar você mesmo, mas depois de alguns testes, parece que a combinação “nu=0,1, gama=0,05” dá o melhor resultado.

Exemplo: Isolation Forest
O Isolation Forest é um método baseado em conjunto, semelhante a um método de classificação mais popular, o Random Forest. Ele seleciona recursos e valores de separação aleatoriamente e assim cria muitas árvores de decisão. Em seguida, é calculada a média do tamanho dos caminhos da raiz de cada árvore ao nó que toma aquela decisão (por isso o nome de “Forest”, “floresta”). Um tamanho médio curto dos caminhos indica anomalias.

Agora, vamos comparar os resultados do OneClassSVM com os do IsolationForest. Para isso, vamos criar dois gráficos dos limites de decisão obtidos pelos dois algoritmos. Nas próximas etapas, vamos modificar o script acima, usando os mesmos dados da colmeia 17.
1. Importe o IsolationForest
O IsolationForest pode ser importado das categorias de conjunto do Scikit-learn:
from sklearn.ensemble import IsolationForest
2. Refatore e adicione um novo estimador
Já que agora teremos dois estimadores diferentes, vamos colocá-los em uma lista:
estimators = [ OneClassSVM(nu=0.1, gamma=0.05).fit(X), IsolationForest(n_estimators=100).fit(X) ]
Depois, vamos usar um loop “for” para iterar através de todos os estimadores.
for estimator in estimators: disp = DecisionBoundaryDisplay.from_estimator( estimator, X, response_method="decision_function", plot_method="contour", xlabel="Temperature", ylabel="Humidity", levels=[0], ) disp.ax_.scatter(X[:, 0], X[:, 1]) plt.show()
Como toque final, também vamos adicionar um título a cada gráfico, para facilitar a inspeção. Para isso, vamos adicionar o seguinte código depois de disp.ax_.scatter:
disp.ax_.set_title( f"Decision boundary using {estimator.__class__.__name__}" )
Você deve achar muito fácil refatorar com o PyCharm, com as sugestões de complementação automática que ele oferece.


3. Execute o código
Como antes, para executar o código, basta clicar no botão Run, no canto superior direito. Desta vez, depois de executarmos o código, devemos obter dois gráficos.

Você pode facilmente alternar entre os dois gráficos na pré-visualização à direita. Como você pode ver, o limite de decisão fica muito diferente quando se usam diferentes algoritmos. Ao detectar anomalias, vale a pena experimentar vários algoritmos e parâmetros até encontrar os mais adequados àquele caso de uso.
Próxima etapa: detecção de anomalias em dados de séries temporais
Se os dados forem como os nossos das colmeias de abelhas, que são uma série temporal, há ainda outros métodos para identificar anomalias. Como séries temporais têm tendências e períodos, qualquer coisa fora desse padrão de tendências e períodos pode ser considerada anômala. Dois métodos populares para detectar anomalias em séries temporais são a decomposição de STL e a previsão com LSTM.
Saiba como usar esses métodos para detectar anomalias em séries temporais nesta postagem no blog.
Resumo
A detecção de anomalias provou ser um aspecto importante da inteligência de negócios. Em alguns setores de atividade, é essencial poder identificar anomalias e fazer com que sejam tomadas ações imediatas. Usar um modelo adequado de aprendizado de máquina para detectar anomalias automaticamente pode ajudar a analisar dados complicados e em altos volumes em pouco tempo. Nesta postagem de blog, demonstramos como identificar anomalias usando modelos como o OneClassSVM.
Para saber mais sobre como usar o PyCharm no aprendizado de máquina, confira “Comece a estudar aprendizado de máquina com o PyCharm” e “Como usar notebooks do Jupyter no PyCharm“.
Detecte anomalias usando o PyCharm
Com um projeto do Jupyter no PyCharm Professional, você pode facilmente organizar projetos de detecção de anomalias com muitos arquivos de dados e notebooks. Pode ser gerada uma saída na forma de gráficos para inspecionar anomalias, e gráficos são de muito fácil acesso no PyCharm. Outros recursos, como sugestões de complementação automática, tornam facílimo navegar por todos os modelos do Scikit-learn e configurações de gráficos da Matplotlib.
Incremente o seu projeto de ciência de dados usando o PyCharm. Confira os recursos de ciência de dados oferecidos para otimizar o seu fluxo de trabalho nessa área.
Artigo original em inglês por: