(+351) 21 24 10006  ·  info@bconcepts.pt
Carnaxide, Lisboa

Como detetar outliers com Isolation Forest em Machine Learning

João Barros 13 de September de 2026 5 min de leitura

Este tutorial mostra como detetar outliers (valores anómalos) numa base de dados numérica usando Isolation Forest em Machine Learning. É útil para limpar dados antes de treinar modelos, evitar que outliers enviesem resultados e automatizar a deteção de anomalias em pipelines de produção. Ao longo do artigo explico o porquê do algoritmo funcionar, dou um exemplo sintético controlado e mostro como validar visualmente e numericamente os resultados.

Pré-requisitos

  • Python 3.8+ instalado (recomendo usar um ambiente virtual)
  • Bibliotecas: scikit-learn, pandas, numpy, matplotlib (instalar via pip: pip install scikit-learn pandas numpy matplotlib)
  • Conhecimentos básicos de Python e manipulação de DataFrame com pandas

Passo 1: Entender o que é Isolation Forest

Isolation Forest é um algoritmo baseado em árvores que 'isola' pontos anómalos mais rapidamente que pontos normais. A ideia intuitiva é simples: anomalias são raras e distintas, por isso precisam de menos divisões para ficarem isoladas numa árvore de partições aleatórias. O algoritmo constrói várias árvores (floresta) com partições aleatórias e usa a profundidade média a que um ponto fica isolado como medida de anomalia.

Vantagens: escala relativamente bem com o número de amostras (em muitos casos próximo de O(n log n) na prática), não assume distribuições paramétricas e funciona para dados multidimensionais. Limitações: sensível à escolha de contamination (fração esperada de outliers) e pode necessitar de normalização das features se as escalas forem muito diferentes.

Passo 2: Preparar um exemplo de dados

Criar um pequeno conjunto sintético permite ver claramente como o algoritmo separa normais de outliers. Aqui criamos 300 pontos normais com distribuição normal e 20 outliers uniformes espalhados por uma área maior. Isto dá um total de 320 amostras e uma percentagem real de outliers de 20/320 ≈ 0.0625 (~6.25%).

import numpy as np
import pandas as pd

rng = np.random.RandomState(42)
# Dados normais: duas features com distribuição normal
X_normal = rng.normal(loc=0, scale=1, size=(300, 2))
# Outliers: pontos distantes
X_outliers = rng.uniform(low=-8, high=8, size=(20, 2))
# Combinar
X = np.vstack([X_normal, X_outliers])
df = pd.DataFrame(X, columns=['x1', 'x2'])
print(df.shape)  # (320, 2)
print(df.head())

Passo 3: Treinar Isolation Forest

Usar a implementação de scikit-learn é direto. Parâmetros comuns a ajustar: n_estimators (número de árvores, tipicamente 100), contamination (fração esperada de outliers, aqui 0.06), max_samples ou subsample para grandes bases de dados, e random_state para reprodutibilidade.

from sklearn.ensemble import IsolationForest

# Criar e ajustar o modelo
clf = IsolationForest(n_estimators=100, contamination=0.06, random_state=42)
clf.fit(df)
# Predição: -1 = outlier, 1 = normal
preds = clf.predict(df)
# Score (quanto menor, mais anómalo)
scores = clf.decision_function(df)

df['is_outlier'] = (preds == -1)
df['score'] = scores

Passo 4: Interpretar os resultados e ajustar parâmetros

Depois de treinar, comece por contar quantos outliers foram detectados e inspecionar uma amostra. Se definiu contamination=0.06 e tem 320 amostras, espera-se detectar cerca de 19–20 outliers. Caso detete muito mais ou muito menos, ajuste contamination ou examine as features: talvez seja necessária normalização ou remoção de colinearidade.

# Contagem de outliers
print(df['is_outlier'].value_counts())
# Amostra dos outliers detectados
print(df[df['is_outlier']].head())
# Valores extremos de score
print(df['score'].nsmallest(10))

Dica prática: não confie apenas no rótulo binário. Verifique a distribuição dos scores (decision_function): outliers tipicamente têm scores bem negativos. Se tiver rótulos verificados, calcule métricas como precision/recall. Em bases de dados muito grandes, usar max_samples para reduzir custos computacionais e ainda ter boa sensibilidade.

Passo 5: Visualizar para confirmar (exemplo 2D)

Uma visualização simples em 2D ajuda a confirmar se os outliers fazem sentido. Se tiver mais dimensões, reduza com PCA antes de plotar para ver uma projeção representativa. Abaixo mostramos tanto um scatter simples como um exemplo com PCA.

import matplotlib.pyplot as plt
from sklearn.decomposition import PCA

# Scatter simples (2D)
plt.figure(figsize=(7, 5))
plt.scatter(df['x1'], df['x2'], c=df['is_outlier'], cmap='coolwarm', s=30)
plt.title('Deteção de outliers com Isolation Forest')
plt.xlabel('x1')
plt.ylabel('x2')
plt.show()

# Se tivesse mais features:
pca = PCA(n_components=2, random_state=42)
proj = pca.fit_transform(df[['x1', 'x2']])
plt.figure(figsize=(7,5))
plt.scatter(proj[:,0], proj[:,1], c=df['is_outlier'], cmap='coolwarm', s=30)
plt.title('PCA + Isolation Forest (projeção)')
plt.show()

Verificar o resultado

Confirme que os 20 pontos gerados uniformemente estão, na sua maioria, marcados como outliers e que a percentagem detectada aproxima-se de contamination. Num experimento como este, é plausível obter 18–22 outliers detectados; se obtiver um número muito diferente, revise pré-processamento e parâmetros. Em dados reais, valide com conhecimento do domínio, amostras rotuladas ou regras de negócio antes de remover ou agir sobre pontos marcados como outliers.

Conclusão

Isolation Forest é uma solução prática para detetar outliers em dados numéricos e escala relativamente bem para conjuntos médios a grandes. Próximos passos recomendados: experimentar diferentes valores de contamination, variar n_estimators (100–500) e max_samples, combinar com normalização de features e usar PCA para visualização. Sempre valide a saída com amostras conhecidas ou regras de negócio para evitar remover pontos válidos e documente as escolhas de parâmetros para reproducibilidade.