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

Cómo detectar outliers con Isolation Forest en Machine Learning

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

Este tutorial muestra cómo detectar outliers (valores anómalos) en una base de datos numérica usando Isolation Forest en Machine Learning. Es útil para limpiar datos antes de entrenar modelos, evitar que los outliers sesguen resultados y automatizar la detección de anomalías en pipelines de producción. A lo largo del artículo explico por qué el algoritmo funciona, doy un ejemplo sintético controlado y muestro cómo validar visual y numéricamente los resultados.

Prerequisitos

  • Python 3.8+ instalado (recomiendo usar un entorno virtual)
  • Bibliotecas: scikit-learn, pandas, numpy, matplotlib (instalar vía pip: pip install scikit-learn pandas numpy matplotlib)
  • Conocimientos básicos de Python y manipulación de DataFrame con pandas

Paso 1: Entender qué es Isolation Forest

Isolation Forest es un algoritmo basado en árboles que 'aísla' puntos anómalos más rápidamente que puntos normales. La idea intuitiva es simple: las anomalías son raras y distintas, por eso necesitan menos particiones para quedar aisladas en un árbol de particiones aleatorias. El algoritmo construye varias trees (bosque) con particiones aleatorias y usa la profundidad media a la que un punto queda aislado como medida de anomalía.

Ventajas: escala relativamente bien con el número de muestras (en muchos casos cercano a O(n log n) en la práctica), no asume distribuciones paramétricas y funciona para datos multidimensionales. Limitaciones: sensible a la elección de contamination (fracción esperada de outliers) y puede necesitar normalización de las features si las escalas son muy diferentes.

Paso 2: Preparar un ejemplo de datos

Crear un pequeño conjunto sintético permite ver claramente cómo el algoritmo separa normales de outliers. Aquí creamos 300 puntos normales con distribución normal y 20 outliers uniformes dispersos por un área mayor. Esto da un total de 320 muestras y un porcentaje 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())

Paso 3: Entrenar Isolation Forest

Usar la implementación de scikit-learn es directo. Parámetros comunes a ajustar: n_estimators (número de árboles, típicamente 100), contamination (fracción esperada de outliers, aquí 0.06), max_samples o subsample para grandes bases de datos, y random_state para reproducibilidad.

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

Paso 4: Interpretar los resultados y ajustar parámetros

Tras entrenar, empieza por contar cuántos outliers fueron detectados e inspeccionar una muestra. Si definiste contamination=0.06 y tienes 320 muestras, se espera detectar alrededor de 19–20 outliers. Si detectas muchos más o muchos menos, ajusta contamination o examina las features: quizá sea necesaria normalización o eliminación de colinealidad.

# 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))

Consejo práctico: no confíes solo en la etiqueta binaria. Verifica la distribución de los scores (decision_function): los outliers típicamente tienen scores muy negativos. Si tienes etiquetas verificadas, calcula métricas como precision/recall. En bases de datos muy grandes, usa max_samples para reducir costes computacionales y mantener buena sensibilidad.

Paso 5: Visualizar para confirmar (ejemplo 2D)

Una visualización simple en 2D ayuda a confirmar si los outliers tienen sentido. Si tienes más dimensiones, reduce con PCA antes de plotear para ver una proyección representativa. Más abajo mostramos tanto un scatter simple como un ejemplo con 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('Detección de outliers con 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 (proyección)')
plt.show()

Verificar el resultado

Confirma que los 20 puntos generados uniformemente están, en su mayoría, marcados como outliers y que el porcentaje detectado se aproxima a contamination. En un experimento como este, es plausible obtener 18–22 outliers detectados; si obtienes un número muy diferente, revisa el preprocesamiento y los parámetros. En datos reales, valida con conocimiento del dominio, muestras etiquetadas o reglas de negocio antes de eliminar o actuar sobre puntos marcados como outliers.

Conclusión

Isolation Forest es una solución práctica para detectar outliers en datos numéricos y escala relativamente bien para conjuntos medianos a grandes. Próximos pasos recomendados: experimentar con distintos valores de contamination, variar n_estimators (100–500) y max_samples, combinar con normalización de features y usar PCA para visualización. Siempre valida la salida con muestras conocidas o reglas de negocio para evitar eliminar puntos válidos y documenta las elecciones de parámetros para reproducibilidad.