Esquema general del Machine Learning


Esquema general del Machine Learning: del problema al modelo

Después de entender qué es el Machine Learning y cuáles son sus componentes esenciales, es momento de ver cómo se construye realmente un modelo, paso a paso.

Un proyecto de ML no es magia: es un proceso iterativo donde cada decisión afecta al resultado final. En este artículo, desglosaré cada fase con ejemplos prácticos y consejos que te ayudarán a evitar errores comunes.

1. Definir el problema

Todo comienza con una pregunta clara. Esta fase determina el éxito o fracaso del proyecto completo.

Preguntas clave:

  • ¿Qué queremos predecir o clasificar? (ej: probabilidad de abandono de clientes, precio de una vivienda)
  • ¿Cuál es la variable objetivo? (churn sí/no, precio en euros)
  • ¿Qué impacto tiene en negocio? (reducir costes 15%, aumentar retención 20%)
  • ¿Qué restricciones existen? (tiempo de respuesta < 100ms, modelo interpretable para cumplimiento legal)

Ejemplo práctico:
En lugar de «queremos predecir ventas», define: «necesitamos predecir la demanda semanal de cada producto en cada tienda con 7 días de antelación, con un error inferior al 10%, para optimizar el inventario y reducir roturas de stock en un 25%».

Señal de alerta: Si no puedes explicar el problema en 2-3 frases concretas, necesitas más claridad antes de continuar.

 

Diagrama conceptual del ciclo de vida del Machine Learning: problema, datos, features, modelo, evaluación, despliegue y monitorización, con flujo continuo de mejora.

2. Recopilar y explorar los datos

Antes de entrenar nada, hay que entender profundamente los datos. Esta fase suele revelar más del 50% de los retos del proyecto.

Análisis exploratorio (EDA) esencial:

Origen y calidad:

  • ¿De dónde vienen? (bases de datos, APIs, sensores, formularios)
  • ¿Qué tan actualizados están?
  • ¿Existen sesgos de recolección? (ej: solo datos de usuarios que aceptaron cookies)

Distribuciones y patrones:

  • Histogramas de variables numéricas
  • Frecuencias de categorías
  • Correlaciones entre variables
  • Tendencias temporales

Problemas comunes:

  • Valores faltantes (¿aleatorios o sistemáticos?)
  • Outliers (¿errores o casos legítimos?)
  • Desbalanceo de clases (95% negativos, 5% positivos)
  • Fugas de información (variables que no estarán disponibles en producción)

Herramientas útiles: pandas-profiling, sweetviz, matplotlib, seaborn

3. Preparar y limpiar los datos

Aquí transformas el dataset en algo utilizable. Sin datos limpios, no hay modelo fiable.

Tareas principales:

Valores faltantes:

  • Eliminación (si < 5% de filas afectadas)
  • Imputación simple (media, mediana, moda)
  • Imputación avanzada (KNN, modelos predictivos)
  • Crear indicador de «valor faltante» como feature adicional

Duplicados y outliers:

  • Identificar registros duplicados exactos o casi-duplicados
  • Decidir si los outliers son errores (eliminar) o casos extremos válidos (mantener)
  • Técnicas: IQR, Z-score, Isolation Forest

División estratégica:

  • Train (60-70%): para entrenar el modelo
  • Validation (15-20%): para ajustar hiperparámetros
  • Test (15-20%): para evaluación final, nunca tocado durante desarrollo

Importante: La división debe respetar la naturaleza temporal de los datos (no mezclar futuro con pasado) y mantener distribuciones similares.

4. Feature Engineering

El objetivo es transformar los datos en variables útiles para el algoritmo. Esta es frecuentemente la fase que más impacto tiene en el rendimiento final.

4.1 Selección de variables relevantes

La selección de features es crucial: demasiadas variables irrelevantes añaden ruido y aumentan el riesgo de overfitting, mientras que muy pocas pueden perder información valiosa. El objetivo es encontrar el subconjunto óptimo que maximice el rendimiento predictivo.

Técnicas estadísticas

Estas técnicas evalúan la relación entre cada feature y la variable objetivo de forma independiente.

Correlación (variables numéricas)

Mide la fuerza y dirección de la relación lineal entre dos variables.

  • Correlación de Pearson: Asume relación lineal y distribuciones normales. Rango [-1, 1] donde -1 es correlación negativa perfecta, 0 es independencia, y 1 es correlación positiva perfecta.
    • Ejemplo: Correlación entre superficie de vivienda y precio = 0.75 (fuerte relación positiva)
    • Limitación: No detecta relaciones no lineales. Si la relación es cuadrática (Y = X²), Pearson puede dar correlación cercana a 0
  • Correlación de Spearman: Basada en rangos, no asume linealidad ni normalidad. Más robusta a outliers.
    • Cuándo usarla: Variables ordinales, distribuciones sesgadas, o relaciones monótonas no lineales
    • Ejemplo: Relación entre ranking de satisfacción (1-5 estrellas) y probabilidad de recompra

Regla práctica: Elimina features con correlación absoluta < 0.1 con el target. Elimina también features con correlación entre sí > 0.9 (multicolinealidad) manteniendo la más correlacionada con el target.

ANOVA (Analysis of Variance)

Evalúa si las medias de una variable numérica difieren significativamente entre grupos de una variable categórica.

  • Cómo funciona: Compara la varianza entre grupos vs dentro de grupos. Si la varianza entre grupos es mucho mayor, la categórica es relevante.
  • F-statistic: Ratio de varianzas. Valores altos indican mayor diferencia entre grupos.
  • p-value: Si p < 0.05, rechazamos la hipótesis nula (las medias son iguales) → la feature es relevante

Ejemplo práctico:

text
Variable categórica: Tipo de cliente (Básico, Premium, VIP)
Variable numérica: Gasto mensual promedio

Básico: media = 50€
Premium: media = 150€
VIP: media = 500€

ANOVA → F-statistic alto, p-value < 0.001
Conclusión: El tipo de cliente es muy relevante para predecir gasto

Chi-cuadrado (χ²)

Evalúa la independencia entre dos variables categóricas mediante una tabla de contingencia.

  • Cómo funciona: Compara frecuencias observadas vs esperadas bajo independencia. Grandes diferencias indican dependencia.
  • p-value: Si p < 0.05, las variables están relacionadas

Ejemplo práctico:

text
Variable categórica 1: Género (M/F)
Variable categórica 2: Abandono (Sí/No)

Tabla de contingencia:
           Abandono=Sí  Abandono=No
Género=M      120          380
Género=F      200          300

Chi-cuadrado → p-value = 0.002
Conclusión: Género y abandono están relacionados

Mutual Information (Información Mutua)

Mide cuánta información aporta una variable sobre otra, capturando relaciones lineales y no lineales.

  • Ventaja principal: Detecta cualquier tipo de dependencia, no solo lineal
  • Rango: [0, ∞) donde 0 = independencia total, valores altos = fuerte dependencia
  • Normalización: Se puede normalizar a [0, 1] dividiendo por la entropía

Ejemplo donde supera a correlación:

text
X = [-2, -1, 0, 1, 2]
Y = [4, 1, 0, 1, 4]  (relación cuadrática: Y = X²)

Correlación de Pearson: ~0 (no detecta la relación)
Mutual Information: alto (detecta la dependencia perfecta)

Cuándo usar cada técnica:

Tipo de variables Técnica recomendada
Numérica → Numérica (lineal) Pearson
Numérica → Numérica (no lineal) Spearman, Mutual Information
Categórica → Numérica ANOVA, Mutual Information
Categórica → Categórica Chi-cuadrado, Mutual Information

Técnicas basadas en modelos

Estas técnicas evalúan la importancia de features en el contexto de un modelo predictivo, considerando interacciones entre variables.

Importancia de features con árboles

Los modelos basados en árboles (Random Forest, XGBoost, LightGBM) calculan la importancia de cada feature durante el entrenamiento.

Dos tipos de importancia:

  1. Impurity-based (Gini/Entropy): Mide cuánto reduce cada feature la impureza al hacer splits
    • Ventaja: Rápida de calcular
    • Desventaja: Sesgada hacia features con alta cardinalidad (muchos valores únicos)
  2. Permutation importance: Mide cuánto empeora el modelo si aleatorizamos los valores de una feature
    • Ventaja: Más fiable, no sesgada
    • Desventaja: Más costosa computacionalmente

Ejemplo práctico con Random Forest:

python
from sklearn.ensemble import RandomForestClassifier
from sklearn.inspection import permutation_importance

# Entrenar modelo
rf = RandomForestClassifier(n_estimators=100)
rf.fit(X_train, y_train)

# Importancia basada en impureza
importances_gini = rf.feature_importances_

# Permutation importance (más fiable)
perm_importance = permutation_importance(rf, X_val, y_val, n_repeats=10)
importances_perm = perm_importance.importances_mean

# Resultado ejemplo:
# edad: 0.25
# ingresos: 0.20
# historial_compras: 0.18
# color_favorito: 0.02  ← candidata a eliminar

Interpretación: Features con importancia < 0.01 suelen ser ruido. Elimínalas y reentrena para validar que el rendimiento no empeora.

Regularización L1 (Lasso)

La regularización L1 añade una penalización proporcional al valor absoluto de los coeficientes, forzando algunos a exactamente cero.

Cómo funciona:

text
Función de pérdida = Error de predicción + λ × Σ|coeficientes|

λ (lambda): controla la fuerza de regularización
- λ = 0: sin regularización (regresión lineal normal)
- λ alto: más coeficientes se vuelven 0 (más features eliminadas)

Ventajas:

  • Selección automática de features (coeficientes = 0 → feature irrelevante)
  • Produce modelos sparse (pocos features activos)
  • Útil cuando hay muchas features correlacionadas

Proceso práctico:

  1. Entrena Lasso con diferentes valores de λ (usando validación cruzada)
  2. Selecciona λ que maximiza rendimiento en validación
  3. Features con coeficiente = 0 se eliminan
  4. Reentrena modelo final solo con features seleccionadas

Ejemplo:

python
from sklearn.linear_model import LassoCV

# LassoCV prueba múltiples valores de alpha (λ) automáticamente
lasso = LassoCV(cv=5, alphas=np.logspace(-4, 1, 50))
lasso.fit(X_train, y_train)

# Features seleccionadas (coeficiente != 0)
selected_features = X_train.columns[lasso.coef_ != 0]
print(f"Features seleccionadas: {len(selected_features)} de {X_train.shape[1]}")

# Resultado ejemplo:
# De 50 features originales → 12 seleccionadas
# Rendimiento: R² = 0.85 (vs 0.87 con todas las features)
# Ganancia: modelo más simple, menos overfitting, más interpretable

RFE (Recursive Feature Elimination)

Selección iterativa que entrena el modelo repetidamente, eliminando las features menos importantes en cada paso.

Algoritmo:

  1. Entrena modelo con todas las features
  2. Calcula importancia/coeficientes de cada feature
  3. Elimina la(s) feature(s) menos importante(s)
  4. Repite hasta alcanzar el número deseado de features

Ventajas:

  • Considera interacciones entre features (a diferencia de métodos univariados)
  • Funciona con cualquier modelo que proporcione importancia o coeficientes
  • Permite especificar exactamente cuántas features quieres

Desventajas:

  • Computacionalmente costoso (entrena el modelo muchas veces)
  • Puede ser inestable con datasets pequeños

Ejemplo práctico:

python
from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression

# Queremos seleccionar las 10 mejores features
estimator = LogisticRegression()
rfe = RFE(estimator, n_features_to_select=10, step=1)
rfe.fit(X_train, y_train)

# Features seleccionadas
selected_features = X_train.columns[rfe.support_]

# Ranking de features (1 = mejor)
feature_ranking = pd.DataFrame({
    'feature': X_train.columns,
    'ranking': rfe.ranking_
}).sort_values('ranking')

# Resultado ejemplo:
# Ranking 1: edad, ingresos, historial_compras (seleccionadas)
# Ranking 15: color_favorito, signo_zodiacal (eliminadas primero)

Variante avanzada – RFECV: Usa validación cruzada para determinar automáticamente el número óptimo de features.

python
from sklearn.feature_selection import RFECV

rfecv = RFECV(estimator, step=1, cv=5, scoring='accuracy')
rfecv.fit(X_train, y_train)

print(f"Número óptimo de features: {rfecv.n_features_}")
# Resultado: 15 features (maximiza accuracy en validación cruzada)

Estrategia práctica de selección

En proyectos reales, combina múltiples técnicas:

Fase 1 – Filtrado rápido (técnicas estadísticas):

  • Elimina features con correlación < 0.05 con target
  • Elimina features con p-value > 0.05 en ANOVA/Chi-cuadrado
  • Reduce de 100 features a ~40

Fase 2 – Selección basada en modelos:

  • Entrena Random Forest, observa importancia
  • Aplica Lasso para selección automática
  • Reduce de 40 features a ~20

Fase 3 – Refinamiento con RFE:

  • Usa RFECV para encontrar número óptimo
  • Valida que el rendimiento se mantiene o mejora
  • Resultado final: 12-15 features clave

Fase 4 – Validación de negocio:

  • Revisa features seleccionadas con expertos del dominio
  • Elimina features que no estarán disponibles en producción
  • Considera coste de obtención de cada feature

Señal de éxito: Modelo con 20% de las features originales que mantiene 95%+ del rendimiento del modelo con todas las features.

4.2 Transformación de variables

Codificación de categorías:

  • One-Hot Encoding: para categorías sin orden (color: rojo, azul, verde)
  • Label Encoding: para categorías ordinales (talla: S, M, L, XL)
  • Target Encoding: usa la media del target por categoría (útil con alta cardinalidad)
  • Frequency Encoding: reemplaza por frecuencia de aparición

Escalado de variables numéricas:

  • StandardScaler: media 0, desviación 1 (asume distribución normal)
  • MinMaxScaler: rango [0,1] (sensible a outliers)
  • RobustScaler: usa mediana y cuartiles (robusto a outliers)

Transformaciones matemáticas:

  • Logarítmicas: para variables con distribución sesgada (ingresos, precios)
  • Polinomiales: para capturar relaciones no lineales
  • Box-Cox: normalización automática de distribuciones

Reducción de dimensionalidad:

  • PCA: proyección lineal que mantiene varianza
  • t-SNE/UMAP: para visualización
  • Embeddings: representaciones densas de categorías de alta dimensión

4.3 Creación de nuevas features

Ejemplos prácticos:

Ratios y proporciones:

  • Ratio deuda/ingresos en scoring crediticio
  • Tasa de conversión por canal de marketing
  • Porcentaje de descuento sobre precio original

Agregaciones temporales:

  • Ventas últimos 7/30/90 días
  • Media móvil de temperatura
  • Tendencia (creciente/decreciente) en últimas semanas

Interacciones entre variables:

  • Edad × Ingresos
  • Superficie × Ubicación (para precio de viviendas)
  • Hora del día × Día de la semana (para demanda de transporte)

Señales derivadas:

  • Extracción de día de la semana, mes, trimestre de fechas
  • Distancia geográfica entre dos puntos
  • Tiempo desde último evento (días desde última compra)

Regla de oro: Cada feature debe tener una hipótesis de negocio detrás. No crees features «por si acaso».

5. Selección del modelo

No existe un «mejor modelo universal». La elección depende del problema y del contexto.

Por tipo de tarea:

Clasificación:

  • Logistic Regression (baseline interpretable)
  • Random Forest (robusto, no requiere mucho tuning)
  • XGBoost/LightGBM (alto rendimiento, competiciones)
  • Redes neuronales (datos masivos, patrones complejos)

Regresión:

  • Linear Regression (baseline)
  • Ridge/Lasso (con regularización)
  • Gradient Boosting (XGBoost, LightGBM)
  • SVR (datos pequeños, no lineales)

Series temporales:

  • ARIMA/SARIMA (modelos clásicos)
  • Prophet (tendencias y estacionalidad)
  • LSTM/GRU (patrones complejos)

Clustering:

  • K-Means (rápido, esferas)
  • DBSCAN (formas arbitrarias, detecta outliers)
  • Hierarchical (exploración jerárquica)

Factores de decisión:

Factor Modelo simple Modelo complejo
Interpretabilidad ✓ Regresión lineal, árboles ✗ Deep learning, ensembles
Volumen de datos ✓ < 10K registros ✓ > 100K registros
Tiempo de entrenamiento ✓ Segundos/minutos ✗ Horas/días
Latencia en producción ✓ < 10ms Variable

Consejo práctico: Empieza siempre con un modelo simple como baseline. Si Logistic Regression da 85% de accuracy, sabes que cualquier modelo complejo debe superar esa cifra para justificar su uso.

6. Entrenamiento

Aquí el modelo aprende patrones de los datos. El objetivo es generalizar, no memorizar.

Proceso de entrenamiento:

  1. Ajuste de hiperparámetros:
    • Learning rate, profundidad de árboles, número de neuronas
    • Usa Grid Search o Random Search para explorar combinaciones
    • Bayesian Optimization para espacios grandes
  2. Validación cruzada:
    • K-Fold (típicamente k=5 o k=10)
    • Stratified K-Fold (mantiene proporción de clases)
    • Time Series Split (respeta orden temporal)
  3. Regularización:
    • L1 (Lasso): elimina features
    • L2 (Ridge): reduce magnitud de pesos
    • Dropout (redes neuronales): desactiva neuronas aleatoriamente
    • Early stopping: detiene entrenamiento cuando validación empeora
  4. Control del overfitting:
    • Monitorizar train vs validation loss
    • Usar más datos de entrenamiento
    • Simplificar el modelo
    • Aumentar regularización

Señal de overfitting: Train accuracy 98%, validation accuracy 75% → el modelo memoriza en lugar de aprender.

7. Evaluación

Cada tarea requiere métricas específicas. Elegir la métrica incorrecta puede llevar a optimizar el modelo equivocado.

Clasificación binaria:

  • Accuracy: % de predicciones correctas (útil solo si clases balanceadas)
  • Precision: de los que predije positivos, ¿cuántos lo eran realmente? (minimiza falsos positivos)
  • Recall: de los positivos reales, ¿cuántos detecté? (minimiza falsos negativos)
  • F1-Score: media armónica de precision y recall
  • AUC-ROC: capacidad de discriminación en todos los umbrales

Ejemplo: En detección de fraude (1% de casos positivos), un modelo que predice siempre «no fraude» tiene 99% accuracy pero es inútil. Aquí importa más el recall.

Regresión:

  • MAE (Mean Absolute Error): error promedio en unidades originales
  • RMSE (Root Mean Squared Error): penaliza más los errores grandes
  • MAPE: error porcentual (útil para comparar entre escalas)
  • R²: proporción de varianza explicada

Matriz de confusión: Visualiza dónde falla el modelo (falsos positivos vs falsos negativos).

Curvas de aprendizaje: Muestran si necesitas más datos, más features o un modelo más complejo.

8. Despliegue

Un modelo que no llega a producción no genera impacto. El despliegue transforma el código experimental en un servicio robusto.

Opciones de despliegue:

APIs REST:

  • Flask/FastAPI para Python
  • Contenedores Docker para portabilidad
  • Escalado horizontal con Kubernetes

Batch processing:

  • Predicciones programadas (diarias, semanales)
  • Útil cuando no se necesita respuesta en tiempo real
  • Herramientas: Airflow, Luigi, Prefect

Edge deployment:

  • Modelos en dispositivos (móviles, IoT)
  • Requiere optimización de tamaño (quantization, pruning)
  • TensorFlow Lite, ONNX

Consideraciones críticas:

  • Latencia: ¿Cuánto tiempo puede tardar la predicción? (< 100ms para web, < 1s para batch)
  • Versionado: Mantén múltiples versiones del modelo para rollback
  • Monitorización: Logs de predicciones, tiempos de respuesta, errores
  • A/B testing: Compara modelo nuevo vs antiguo con tráfico real

Infraestructura: AWS SageMaker, Google Vertex AI, Azure ML, o soluciones open-source como MLflow, Kubeflow.

9. Monitorización y mantenimiento

Los modelos envejecen. El mundo cambia, y tu modelo debe adaptarse.

Tipos de degradación:

Data drift:

  • Las distribuciones de entrada cambian
  • Ejemplo: pandemia altera patrones de compra
  • Detección: comparar distribuciones train vs producción (KS test, PSI)

Concept drift:

  • La relación entre X e Y cambia
  • Ejemplo: nuevos competidores cambian comportamiento de clientes
  • Detección: monitorizar métricas de rendimiento en el tiempo

Cambios en el comportamiento:

  • Usuarios aprenden a «engañar» al modelo
  • Ejemplo: spammers adaptan mensajes para evitar filtros

Estrategias de mantenimiento:

  1. Monitorización continua:
    • Dashboard con métricas clave (accuracy, latencia, volumen)
    • Alertas automáticas cuando métricas caen por debajo de umbrales
  2. Reentrenamiento periódico:
    • Programado (mensual, trimestral)
    • Triggered (cuando rendimiento cae X%)
    • Con datos recientes para capturar nuevos patrones
  3. Validación de datos de entrada:
    • Detectar valores fuera de rango esperado
    • Rechazar predicciones cuando confianza es baja
  4. Feedback loop:
    • Recoger etiquetas reales de predicciones
    • Usar para evaluar rendimiento real
    • Incorporar al siguiente ciclo de entrenamiento

Herramientas: Evidently AI, Whylabs, Fiddler, o soluciones custom con Prometheus + Grafana.

Conclusión

Construir un modelo es fácil. Construir un sistema de Machine Learning que funcione en el mundo real es otra historia.

Entender el proceso completo —problema, datos, features, modelo, evaluación y monitorización— es lo que diferencia a un técnico junior de un ingeniero de ML capaz de entregar valor de principio a fin.

Dominar este flujo de trabajo te permite no solo entrenar modelos, sino construir soluciones reales, robustas y alineadas con los objetivos del negocio.

 

En el próximo artículo de la serie profundizaré en el ciclo de vida completo de un modelo en producción (MLOps básico) y cómo mantenerlo estable a lo largo del tiempo.