
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.

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:
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:
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:
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:
- 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)
- 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:
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:
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:
- Entrena Lasso con diferentes valores de λ (usando validación cruzada)
- Selecciona λ que maximiza rendimiento en validación
- Features con coeficiente = 0 se eliminan
- Reentrena modelo final solo con features seleccionadas
Ejemplo:
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:
- Entrena modelo con todas las features
- Calcula importancia/coeficientes de cada feature
- Elimina la(s) feature(s) menos importante(s)
- 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:
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.
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:
- 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
- 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)
- 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
- 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:
- Monitorización continua:
- Dashboard con métricas clave (accuracy, latencia, volumen)
- Alertas automáticas cuando métricas caen por debajo de umbrales
- Reentrenamiento periódico:
- Programado (mensual, trimestral)
- Triggered (cuando rendimiento cae X%)
- Con datos recientes para capturar nuevos patrones
- Validación de datos de entrada:
- Detectar valores fuera de rango esperado
- Rechazar predicciones cuando confianza es baja
- 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.


