Las anomalías son pocas y diferentes
No modelamos lo "normal": buscamos lo que se aleja de la masa de datos.
Detección de anomalías · Laboratorio 01
Un curso interactivo. El modelo se entrena en tu navegador, en tiempo real: cambias un hiperparámetro y ves qué pasa con el mapa, las métricas y las gráficas. Al señalar cualquier control, indicador o término subrayado aparece su definición.
Los tiempos son estimaciones. Puedes saltar entre capítulos, pero cada uno usa conceptos de los anteriores.
Capítulo 1 · ≈ 4 min
No modelamos lo "normal": buscamos lo que se aleja de la masa de datos.
Cada árbol elige una variable y un valor de corte aleatorios hasta dejar cada punto solo en su celda.
Se promedia el nº de cortes sobre muchos árboles (un bosque) y se normaliza a un score entre 0 y 1.
Elige un punto y haz cortes aleatorios hasta dejarlo solo. Compara al punto anómalo con uno normal.
Si E[h(x)] es el promedio de cortes para aislar x y c(ψ) es el nº esperado de cortes de un punto "promedio" (depende del tamaño de la muestra ψ), el score es
s(x) = 2−E[h(x)] / c(ψ)
Para decidir qué es "anómalo" se elige un umbral sobre el score (lo verás en el capítulo 2). Hay dos fuentes de azar: qué puntos ve cada árbol (submuestra) y dónde corta (variable y valor). De ahí salen los hiperparámetros del capítulo 2. (Liu et al., 2008).
Capítulo 2 · ≈ 12 min
Cada uno carga datos y parámetros para ver un concepto concreto. Después explora libremente.
Los ejes son las dos variables medidas (x₁ y x₂), sin reducción de dimensionalidad: cada punto es una observación y sus dos valores, reescalados a [0, 1]. En un caso real serían, por ejemplo, monto y hora de una transacción, o temperatura y presión de una pieza. Usamos 2 columnas solo para poder dibujarlo; el algoritmo funciona igual con cientos.
¿Cuánto se separan normales y anómalos? La línea vertical es el umbral.
Cada punto de la curva es un umbral posible. El punto naranja es el umbral actual.
Reentrena el modelo con distintos valores del hiperparámetro activo (varias semillas cada uno) para ver su efecto real, su variabilidad y su costo.
¿En qué profundidad se aísla el punto seleccionado, árbol por árbol?
Score de tres puntos a medida que se promedian más árboles. Si las líneas aún se mueven, faltan árboles; si están planas, ya estás en el plateau.
Solo hasta el plateau. Más árboles reduce la varianza (≈ 1/√T), pero no corrige el sesgo del modelo y cuesta tiempo y memoria de forma lineal. Pasar de 100 a 400 árboles solo divide el ruido entre 2 y multiplica el costo por 4. Por eso n_estimators no se "optimiza": se fija en un valor suficientemente alto. Compruébalo en el Barrido de n_estimators (escenario Más árboles: ¿hasta cuándo?). El argumento formal se demostró para Random Forest (Probst & Boulesteix, 2018) y en el paper original los autores observan que las longitudes de camino convergen bastante antes de 100 árboles (Liu et al., 2008).
Capítulo 3 · ≈ 8 min
Tienes algunos casos confirmados (anomalías y normales). Puedes medir el acierto: ROC-AUC, AP, Precisión@k. Es lo ideal, pero en la vida real las etiquetas escasean, llegan tarde o no cubren todos los tipos de anomalía (Campos et al., 2016).
No conoces la verdad. No puedes medir el acierto, solo proxies de calidad: cuánto cambia el resultado entre semillas (estabilidad), cuánto se concentra la masa (Mass-Volume) o si otros métodos coinciden. Ayudan, pero cada uno tiene puntos ciegos.
| Indicador | ¿Necesita etiquetas? | Qué mide | Úsalo cuando… | Cuidado con… |
|---|---|---|---|---|
| ROC-AUC | Sí | Calidad del ranking completo | Comparar hiperparámetros o modelos con etiquetas | Optimista si las anomalías son muy raras (Saito & Rehmsmeier, 2015) |
| AP / PR-AUC | Sí | Ranking penalizando falsas alarmas | Anomalías raras; una falsa alarma cuesta | Su línea base es la prevalencia: compara contra ella |
| Precisión@k | Sí | Aciertos en la lista corta que revisarás | Capacidad de revisión limitada (k alertas) | Depende de k y es ruidosa con pocas anomalías (Campos et al., 2016) |
| Precisión, Recall, F1 | Sí | Calidad de la decisión con un umbral | Ya fijaste el umbral / contamination | Cambian con el umbral; F1 da igual peso a errores de costo distinto |
| Estabilidad Jaccard@k | No | Cuánto cambia la lista de alertas entre semillas o reentrenos | Siempre: control de cordura y monitoreo | Estable ≠ correcto (mira el anillo con max_features = 0.5) |
| Correlación de rangos (Spearman) | No | Coincidencia del orden completo | Comparar ejecuciones o versiones del modelo | Pesa igual el orden de los normales, que no importa |
| Mass-Volume / Excess-Mass | No | Concentración de la masa en poco volumen (Goix, 2016) | Comparar detectores o configuraciones en pocas dimensiones | Volumen difícil de estimar en alta dimensión; falla con cúmulos anómalos densos |
| Acuerdo con otro detector | No | Consenso entre métodos distintos | Señal de estructura real | Si comparten el mismo punto ciego, el acuerdo engaña |
| IREOS (evaluación interna) | No | Qué tan separables son las anomalías marcadas del resto (Marques et al., 2020) | Comparar soluciones sin etiquetas | Costoso; no está implementado en este laboratorio |
| Histograma de scores | No | Separación visual: masa de scores bajos + cola separada | Primer vistazo, siempre | Subjetivo |
| Retroalimentación de analistas | Parcial | Utilidad real de las alertas | Ya en producción | Lenta y sesgada hacia lo ya alertado |
J(A,B) = |A∩B| / |A∪B|. Se entrena el modelo con 5 semillas y se compara la lista de las k alertas más altas de cada par. Usa la configuración actual del laboratorio (capítulo 2).
Volumen mínimo necesario para capturar una fracción α de los datos con el score actual. Cuanto más baja la curva, más concentrada está la masa (Goix, 2016).
Ejemplo de Jaccard: dos listas de 25 alertas que comparten 20 puntos tienen J = 20 / 30 = 0.67, no 0.8: la unión es 30 puntos distintos.
Cada punto es una configuración de Isolation Forest (60 combinaciones de ψ, max_features y bootstrap; T = 300). El eje vertical es el AP real; el horizontal, un indicador que no usa etiquetas. Si los puntos suben hacia la derecha, el indicador sirve para elegir configuraciones sin conocer la verdad. max_features = 1.0 max_features = 0.5 valores por defecto
Ningún indicador sin etiquetas es suficiente por sí solo. Combínalos: estabilidad (¿depende del azar?), Mass-Volume o consenso (¿tiene sentido geométrico?) y, sobre todo, revisión manual del top-k por un experto o un pequeño conjunto de anomalías conocidas/inyectadas. Resultados sobre estas limitaciones: (Goix, 2016; Marques et al., 2020; Domingues et al., 2018).
Capítulo 4 · ≈ 10 min
Un hiperparámetro se fija antes de entrenar y define cómo aprende el algoritmo; los parámetros (aquí, dónde corta cada árbol) los aprende él. Los valores por defecto son un compromiso para "datos promedio"; tus datos no lo son. Ajustarlos busca la configuración que mejor sirve a tu problema. Pero ojo: cuánto se gana depende de los datos (Probst et al., 2019, llaman a esa ganancia tunabilidad).
AP con los valores por defecto (ψ = 256, max_features = 1.0, bootstrap = False, T = 300) frente a la mejor configuración del espacio explorado.
Más aciertos en el ranking (AP, ROC-AUC).
Menos dependencia del azar entre reentrenos.
Tiempo de entrenamiento y de scoring, memoria y latencia.
Comparar modelos con configuraciones sin ajustar es injusto.
El umbral (contamination) determina alertas, no la calidad del ranking.
No todo parámetro configurable es un hiperparámetro que debas buscar. Tres categorías que se repiten en todos los modelos de este sitio:
Tú, tu intuición y experimentos como los del capítulo 2. Excelente para entender; poco reproducible y no escala.
Prueba todas las combinaciones de una malla. Simple y paralelizable, pero el costo crece exponencialmente con el nº de hiperparámetros y malgasta evaluaciones en los que no importan (Bergstra & Bengio, 2012).
Muestrea configuraciones al azar. Con el mismo presupuesto explora más valores distintos de cada hiperparámetro; es el punto de comparación obligado (Bergstra & Bengio, 2012).
Aprende un modelo (proceso gaussiano, TPE…) de cómo el hiperparámetro afecta la métrica y elige la siguiente prueba con más potencial. Ideal cuando cada evaluación es cara (Snoek et al., 2012; Bergstra et al., 2011).
Evalúa muchas configuraciones con poca fidelidad (pocos árboles) y solo promueve a las mejores a más recurso. Puede ser un orden de magnitud más rápido (Li et al., 2018; Jamieson & Talwalkar, 2016).
Poblaciones de configuraciones que "mutan" y se seleccionan. Útiles en espacios complejos o mixtos; Optuna los ofrece (Akiba et al., 2019). Panorama completo: Bischl et al. (2023); libro de referencia: Hutter et al. (2019).
Con 9 evaluaciones y un solo hiperparámetro que importa (eje horizontal; la franja azul es la zona buena), el grid prueba solo 3 valores de él; el random prueba 9 distintos. Cuantos más hiperparámetros irrelevantes, mayor la diferencia (Bergstra & Bengio, 2012).
Isolation Forest con tres hiperparámetros a optimizar (ψ, max_features, bootstrap). Como el paisaje ya está calculado, se simulan 60 búsquedas por método. El costo se mide en árboles entrenados. Cambia el objetivo del tuner a un indicador sin etiquetas y mira qué ocurre. Prueba «Anomalías agrupadas» con Mass-Volume.
El paisaje se calculó con 3 semillas por configuración sobre los conjuntos del laboratorio (500 puntos, 6 % de anomalías). Es un benchmark tabular, la técnica estándar para comparar optimizadores sin repetir entrenamientos; el script tools/build-landscape.js lo reproduce.
from sklearn.ensemble import IsolationForest
from sklearn.model_selection import RandomizedSearchCV, StratifiedKFold
from sklearn.metrics import average_precision_score
def ap_scorer(est, X, y): # y: 1 = anomalía (solo para validar)
return average_precision_score(y, -est.score_samples(X))
search = RandomizedSearchCV(
IsolationForest(n_estimators=300, random_state=0), # T fijo y alto
{"max_samples": [16, 32, 64, 128, 256, 500],
"max_features": [0.5, 1.0], "bootstrap": [False, True]},
n_iter=12, scoring=ap_scorer, random_state=0,
cv=StratifiedKFold(3, shuffle=True, random_state=0))
search.fit(X, y) # el modelo ignora y al entrenar; solo se usa al puntuar
La API es la de scikit-learn (Pedregosa et al., 2011). Para búsquedas más largas: Optuna (Akiba et al., 2019) ofrece muestreadores bayesianos y pruning.
Capítulo 5 · ≈ 6 min
Los conjuntos del laboratorio son sintéticos; estos casos muestran cómo se traducen los conceptos. Los datos citados con cifras provienen de las referencias; el resto son situaciones típicas descritas de forma ilustrativa.
Capítulo 6 · ≈ 4 min
n_estimators en el plateau y random_state.max_samples y max_features (random search, ≥ 3 semillas, ~30–60 pruebas).contamination como si fuera del modelo → es el umbral.Referencias
✔ = ficha y contenido consultados en la fuente (texto completo o resumen oficial) al preparar este material. Datos menores como páginas, volumen o año de la versión final conviene contrastarlos con la fuente antes de una cita formal. Sin ✔: referencias estándar que no se consultaron directamente en esta revisión.
sklearn.ensemble.IsolationForest.)