Detecção e Resolução de Anomalias em Dados com Machine Learning
Detecção e Resolução de Anomalias em Dados com Machine Learning
Anomalias em dados são um desafio crítico em pipelines de limpeza avançados. Enquanto técnicas estatísticas simples (z-score, IQR) funcionam bem para distribuições normais, dados reais frequentemente violam essas suposições. Este artigo explora três abordagens de ML que lidam com anomalias multidimensionais, não-lineares e contextuais.
Isolation Forest: Isolamento por Particionamento Recursivo
O Isolation Forest explora um princípio fundamental: anomalias são isoláveis. O algoritmo constrói árvores de decisão aleatórias que particionam o espaço de features, e anomalias requerem menos partições para serem isoladas que observações normais.
from sklearn.ensemble import IsolationForest
import pandas as pd
df = pd.read_csv('dados.csv')
iso_forest = IsolationForest(contamination=0.05, random_state=42)
df['anomalia_if'] = iso_forest.fit_predict(df[['valor', 'frequencia', 'duracao']])
# -1 indica anomalia, 1 indica normal
anomalias = df[df['anomalia_if'] == -1]
print(f"Anomalias detectadas: {len(anomalias)}")Vantagens: Escalável para alta dimensionalidade, não assume distribuição, eficiente computacionalmente (O(n log n)). Desvantagens: Sensível ao parâmetro contamination (taxa esperada de anomalias); assume que anomalias ocupam regiões esparsas do espaço.
Trade-off crítico: Se você subestimar contamination, anomalias genuínas passam despercebidas. Se superestimar, registros legítimos são marcados como suspeitos. Valide com dados rotulados quando possível.
Local Outlier Factor: Densidade Relativa
LOF mede a densidade local de um ponto em relação aos seus vizinhos. Pontos em regiões de baixa densidade relativa são anomalias, mesmo que não sejam globalmente extremos. Isso detecta anomalias contextuais—valores anormais apenas em seu contexto local.
from sklearn.neighbors import LocalOutlierFactor
lof = LocalOutlierFactor(n_neighbors=20, contamination=0.05)
df['anomalia_lof'] = lof.fit_predict(df[['valor', 'frequencia', 'duracao']])
# Scores negativos mais extremos = anomalias mais severas
df['lof_score'] = lof.negative_outlier_factor_
df_sorted = df.sort_values('lof_score').head(10)Vantagens: Detecta anomalias locais (clusters com padrões diferentes), não requer suposições globais. Desvantagens: Complexidade O(n²) para grandes datasets; sensível ao parâmetro n_neighbors; computacionalmente custoso em produção.
Edge case importante: Em datasets com múltiplos clusters legítimos (ex: dados sazonais), LOF pode marcar transições entre clusters como anomalias. Combine com análise de clustering para contexto.
Clustering para Detecção de Inconsistências
Técnicas de clustering (DBSCAN, K-means) identificam grupos naturais. Registros que não se encaixam bem em nenhum cluster ou formam clusters muito pequenos são candidatos a anomalias. Além disso, duplicatas aparecem como pontos idênticos ou extremamente próximos.
from sklearn.cluster import DBSCAN
import numpy as np
dbscan = DBSCAN(eps=0.5, min_samples=5)
df['cluster'] = dbscan.fit_predict(df[['valor', 'frequencia', 'duracao']])
# Cluster -1 = ruído/anomalias
anomalias_dbscan = df[df['cluster'] == -1]
# Detectar duplicatas exatas
duplicatas = df[df.duplicated(subset=['id', 'timestamp'], keep=False)]
print(f"Duplicatas: {len(duplicatas)}")Vantagens: Detecta tanto anomalias quanto duplicatas; interpretável (clusters = grupos naturais). Desvantagens: DBSCAN requer calibração de eps; K-means assume clusters esféricos.
Orquestração e Remediação
Combine múltiplas técnicas via votação. Se 2 ou 3 métodos concordam, a confiança é alta. Para remediação: anomalias podem ser removidas, imputadas (com valores de vizinhos LOF), ou sinalizadas para revisão manual em dashboards Power BI.
df['anomalia_count'] = (df['anomalia_if'] == -1).astype(int) + \
(df['anomalia_lof'] == -1).astype(int) + \
(df['cluster'] == -1).astype(int)
# Consenso: 2+ métodos concordam
df['anomalia_consenso'] = df['anomalia_count'] >= 2
# Remediação: imputar com mediana de vizinhos normais
for col in ['valor', 'frequencia']:
normal_median = df[~df['anomalia_consenso']][col].median()
df.loc[df['anomalia_consenso'], col] = normal_medianConsideração final: Anomalias legítimas (fraudes, eventos raros) devem ser preservadas para análise. Crie pipelines que sinalizam em vez de deletar automaticamente. Use data storytelling em Power BI para comunicar decisões de limpeza aos stakeholders.
Key Takeaways
- Isolation Forest é ideal para anomalias multidimensionais em alta dimensionalidade, mas requer calibração cuidadosa do parâmetro contamination para evitar falsos positivos/negativos
- Local Outlier Factor detecta anomalias contextuais (anormais apenas localmente), mas com custo computacional O(n²)—combine com clustering para datasets grandes
- Orquestração via votação entre múltiplos algoritmos aumenta confiança; remediação deve sinalizar em vez de deletar automaticamente para preservar anomalias legítimas
Enjoyed this reading?
SharpStack delivers personalized tech readings every day, calibrated to your skill level. 5 minutes a day to stay sharp.
“Stay sharp. At your pace. Everyday.”