8 · LOF: factor de outlier local
Local Outlier Factor compara la densidad de cada punto con la de sus vecinos — captando anomalías dependientes del contexto que Isolation Forest podría pasar por alto.
LOF mide cuánto MÁS aislado está un punto que sus vecinos — detecta outliers DENTRO de regiones densas que Isolation Forest podría pasar por alto.
Sin esto:
Sin LOF pierdes las anomalías locales — puntos que parecen normales a nivel global pero son inusuales en el contexto de su cluster.
Isolation Forest puntúa los puntos de forma global — pregunta qué tan difícil es aislar un punto del dataset completo. Funciona muy bien para outliers globales (un punto inusual en todas partes), pero falla con los outliers locales: puntos que parecen perfectamente normales desde una perspectiva global pero son inusuales en relación con su vecindario.
Imagina un dataset con dos clusters — uno muy compacto (100 transacciones casi idénticas) y uno muy disperso (100 mediciones esparcidas). Un punto en el borde del cluster compacto puede ser una anomalía local sospechosa aunque globalmente no sea tan extremo como los puntos dispersos del cluster suelto.
Local Outlier Factor (LOF) resuelve esto calculando una densidad local para cada punto y comparándola con las densidades de sus k vecinos más cercanos.
Conceptos clave:
-
k-distance(x): distancia de x a su k-ésimo vecino más cercano.
-
Distancia de alcanzabilidad:
reach_dist_k(x, y) = max(k-distance(y), dist(x, y))— una distancia suavizada que evita inestabilidades con pares muy cercanos. -
Densidad de alcanzabilidad local (LRD): inverso de la distancia de alcanzabilidad media a los k vecinos:
LRD_k(x) = 1 / (Σ_{y ∈ N_k(x)} reach_dist_k(x, y) / k)
LRD alto = punto en región densa. LRD bajo = punto en región dispersa.
-
Puntuación LOF: razón entre la LRD media de los k vecinos y la LRD de x:
LOF_k(x) = (Σ_{y ∈ N_k(x)} LRD_k(y) / k) / LRD_k(x)
- LOF ≈ 1 → el punto tiene densidad similar a sus vecinos → inlier.
- LOF >> 1 → el punto es mucho menos denso que sus vecinos → outlier.
- LOF < 1 → el punto es más denso que sus vecinos (raro, ocurre en centros de cluster).
Esta razón local es lo que separa a LOF de los métodos globales: un punto en el cluster disperso con LOF ≈ 1 es normal para ese vecindario, aunque parecería "outlier" para un evaluador global.
Python (in browser)
LOF en un dataset de doble densidad — el color codifica la puntuación LOF. Los puntos cerca del cluster compacto que son ligeramente demasiado dispersos para ese vecindario se marcan, aunque no sean extremos globales.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Python (in browser)
Comparación lado a lado — Isolation Forest tiende a marcar extremos globales; LOF marca puntos cuyo vecindario local es significativamente más denso que el punto mismo, detectando los outliers locales cerca del cluster compacto.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Python (in browser)
Barrido de n_neighbors [5, 20, 50] — k pequeño da detección local muy granular; k grande suaviza la variación local y se acerca al comportamiento global.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Guía de decisión LOF vs Isolation Forest — cuándo importa el contexto local y cómo usar LOF para inferencia en línea con novelty=True.
Un punto con puntuación LOF de 3 es...
- LOF compara la densidad de alcanzabilidad local de un punto con la de sus vecinos — LOF >> 1 significa que el punto es mucho menos denso que su vecindario → outlier local.
- LOF detecta anomalías dependientes del contexto que Isolation Forest pierde — útil cuando coexisten clusters de densidades muy distintas.
- n_neighbors controla la escala del vecindario: k pequeño = local muy granular; k grande = se acerca al comportamiento global.
- Para inferencia en datos nuevos, usa novelty=True; sin ello LOF es solo transductivo.
- LOF es O(n²) — prefiere Isolation Forest para datasets grandes (>100k filas) a menos que el contexto local sea crítico.
Detección de fraude por usuario (cada usuario tiene su propio patrón de gasto normal), monitoreo industrial por máquina (cada máquina tiene su propia vibración/temperatura de referencia), monitoreo clínico de pacientes (anomalías relativas al historial propio del paciente).
Si lo quitas: Perderías las anomalías dependientes del contexto — una transacción normal para un cliente de alto gasto pero sospechosa para uno de bajo gasto pasaría desapercibida para un detector global.