Enfoque guía: Ingeniería y selección de características
De sensores crudos a variables que el modelo y el turno entienden
Ver concepto general MathPlay · Ruta IA matemática (MathPlay) →Ingeniería y selección de características
Crear, filtrar y elegir variables antes de entrenar — el 80 % del éxito en planta
Puente desde Módulos 1 y 2
En las unidades 16–22 usamos 6 sensores base. En planta real el historiador trae 20–50 columnas. Feature engineering = convertir datos crudos en señales útiles. Selección = quedarse solo con las que aportan, sin ruido.
Problema: meter todas las columnas “porque están ahí” empeora el modelo, confunde al operador y encarece el mantenimiento.
1. Matemática — crear features
xnueva = f(x1, …, xp, t) · selección: S ⊂ {1,…,p}
Features típicas en flotación (demo)
| Feature nueva | Fórmula / idea | Para qué en turno |
|---|---|---|
ratio_esp_nivel | espumante / nivel | Presión de espuma en celda llena |
rec_lag1 | recuperación t−1 | Inercia del KPI (U19) |
rec_ma6 | media móvil 6 h | Tendencia del turno |
turno_B | dummy 0/1 | Efecto cuadrilla |
ph_x_aire | producto pH × aire | Interacción no lineal suave |
Selección (demo referencia)
| Método | Resultado típico | Uso |
|---|---|---|
| Correlación con rec. | espumante r ≈ −0,45 | Filtro rápido Excel |
| Importancia RF | espumante, nivel, rec_lag1 arriba | Priorizar sensores DCS |
| RFE / Lasso | quita P80 si redundante | Modelos finos |
2. Escalera feature → modelo
3. Excel — crear y rankear
CSV demo · ordenar por fecha_hora.
=' Ratio espumante / nivel:
=J2/K2
=' Lag recuperación (fila 3+):
=G2
=' Correlación con recuperación (rango ratio):
=COEF.DE.CORRELACIÓN(ratio_col; G:G)
=' Top features: ordenar |r| de mayor a menor
4. Python — pipeline de features
import pandas as pd
from sklearn.ensemble import RandomForestRegressor
df = pd.read_csv("datos_flotacion_demo.csv")
df["fecha_hora"] = pd.to_datetime(df["fecha_hora"])
df = df.sort_values("fecha_hora")
df["ratio_esp_nivel"] = df["dosif_espumante_ml_min"] / df["nivel_celda_pct"]
df["rec_lag1"] = df["recuperacion_cu_pct"].shift(1)
df["ph_x_aire"] = df["ph"] * df["flujo_aire"]
df = pd.get_dummies(df, columns=["turno"], prefix="turno", drop_first=True)
feat = [c for c in df.columns if c not in [
"fecha_hora","obs_operador","sobre_espumacion","severidad",
"recuperacion_cu_pct"]]
df2 = df.dropna()
X, y = df2[feat], df2["recuperacion_cu_pct"]
rf = RandomForestRegressor(n_estimators=100, random_state=42)
rf.fit(X, y)
imp = pd.Series(rf.feature_importances_, index=feat).sort_values(ascending=False)
print(imp.head(8))
5. Investigación sugerida
Compara MAE del soft sensor (U16) con 6 sensores base vs con features de esta unidad. ¿Mejora lo suficiente para justificar más columnas en el DCS?
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.
