Enfoque guía: Detección de anomalías (no supervisada)
Isolation Forest y puntajes de rareza — alerta sin etiqueta de espuma
Ver concepto general MathPlay · Ruta IA matemática (MathPlay) →Detección de anomalías (no supervisada)
Cuando no hay bitácora de espuma — marcar horas raras solo con sensores
Puente desde unidad 18
En la unidad 18 combinamos distancia + clasificador con etiqueta sobre_espumacion. Aquí el modelo no ve esa columna: aprende qué es “normal” y puntúa rareza.
Caso real: planta nueva, historiador lleno, pocos eventos documentados. Necesitas una primera alarma antes de tener 50 espumas etiquetadas.
1. Matemática — tres enfoques sin etiqueta
score(x) alto ⇒ más anómalo · alerta si score > percentil 90
Demo (Isolation Forest, contam=0,12 ≈ 14/120)
| Métrica | Referencia | Lectura |
|---|---|---|
| Horas marcadas anómala | ~14 | Cercano a eventos reales |
| Rec. media anómala | ~76 % | Coincide con cluster estrés (U20) |
| Rec. media normal | ~86 % | Operación estable |
2. Panel integrado Módulo 2
Cierre Curso 2 Módulo 2: sin etiquetas aún puedes explorar la planta (clusters, PCA) y alertar rarezas. Cuando documentes eventos, subes al Módulo 1 supervisado para más precisión.
3. Excel — puntaje de rareza simple
CSV demo · distancia estandarizada a la mediana (como unidad 18).
=' Distancia d (6 sensores estandarizados):
=RAIZ(SUMAPRODUCTO(...))
=' Puntaje anomalía = PERCENTIL.INC de d en toda la serie
=PERCENTIL.INC(d_col; 0,9)
=' Alerta:
=SI(d2 > umbral_p90; "ANOMALIA"; "OK")
=' Validar: ¿coincide con sobre_espumacion?
4. Python — Isolation Forest
import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import IsolationForest
features = ["ph","p80_um","flujo_aire","dosif_espumante_ml_min","nivel_celda_pct","ley_cabeza_cu_pct"]
df = pd.read_csv("datos_flotacion_demo.csv")
X = StandardScaler().fit_transform(df[features])
iso = IsolationForest(contamination=0.12, random_state=42)
df["anom"] = iso.fit_predict(X) # -1 = anómala, 1 = normal
df["score"] = -iso.score_samples(X) # mayor = más rara
print("Anómalas detectadas:", (df["anom"] == -1).sum())
print("Espuma real en anómalas:",
df.loc[df["anom"] == -1, "sobre_espumacion"].mean())
print("Rec. media anómala:",
df.loc[df["anom"] == -1, "recuperacion_cu_pct"].mean().round(1))
# Comparar con distancia unidad 18
from numpy.linalg import norm
import numpy as np
med = np.median(X, axis=0)
d = norm(X - med, axis=1)
print("Corr score vs distancia:", np.corrcoef(df["score"], d)[0,1].round(2))
5. Investigación sugerida
De las 14 horas con espuma real, ¿cuántas detecta Isolation Forest vs umbral de distancia vs cluster estrés (U20)? Arma una tabla de comparación para el comité de metalurgia.
Regístrate al boletín MathPlay
Datos, simulación, visualización, IA y tecnología aplicada a problemas reales de industria y minería.
Sin calendario fijo. Sin spam.
Listo. Te escribo cuando haya algo nuevo.
