ML end-to-end en Databricks: de un CSV en bruto a una app pública que dice a quién llamar primero
![]() |
![]() |
PR-AUC 0,635 (un modelo al azar: 0,265) · lista mensual de 806 clientes en riesgo · 37 tests
El problema: una operadora pierde al 26,5 % de sus clientes. El equipo de retención no puede llamar a todos, así que necesita saber a quién contactar primero. El modelo, entrenado con 7043 clientes del dataset IBM Telco, ordena a los clientes actuales por probabilidad de baja.
CSV ─► bronze ─► silver ─► gold ─► MLflow (CV 5 folds) ─► Unity Catalog [champion]
├─► batch scoring
├─► endpoint REST
└─► app Streamlit
- Desarrollado en Databricks: capas bronze, silver y gold en tablas Delta de Unity Catalog, con validación en cada capa y features en un paquete propio con tests (la misma función entrena, puntúa y alimenta la app).
- Modelado: regresión logística frente a random forest, gradient boosting y XGBoost ajustados, comparados en MLflow. Los challengers solo ganan ~0,02 de PR-AUC, dentro del ruido entre folds, así que se mantiene la logística porque es explicable.
- Decisión de negocio: PR-AUC por el desbalanceo y un umbral de 0,40 elegido por el coste de cada baja detectada.
- Hallazgos clave: el 62 % de las bajas llegan en el primer mes, y la fibra contratada sola es el problema (60 % de bajas sin servicios extra frente al 9 % con los seis).
- Producción: modelo registrado con el alias
champion, batch scoring a tabla, endpoint REST con Model Serving y app bilingüe con explicación de cada predicción.
Python · Databricks · MLflow · Unity Catalog · Delta Lake · scikit-learn · Streamlit · pytest
Si la app lleva tiempo sin visitas, Streamlit la duerme: pulsa el botón para despertarla y espera unos segundos.
ML end-to-end: de anuncios scrapeados en bruto a una API REST pública
R² 0,86 · ~16 % de error medio en el 80 % del mercado · −49 % de error frente al baseline
Predice el precio de venta de una vivienda en Madrid a partir de los datos de su anuncio (11,8k anuncios de Idealista).
- Limpieza de datos: valores centinela, NaNs estructurales frente a faltantes reales, duplicados ocultos eliminados con una clave de 9 campos y más de 50 variables extraídas de las etiquetas de texto libre.
- Modelado: Baseline lineal frente a XGBoost, LightGBM y CatBoost, con split estratificado por distrito y ajuste con Optuna. Ganador: CatBoost.
- Hallazgo clave: la ingeniería de variables (barrio + etiquetas) redujo el error 10 veces más que el ajuste de hiperparámetros.
- Despliegue: FastAPI en Render, con validación de entradas, GET/POST
/predicty documentación interactiva con Swagger.
Python · CatBoost · Optuna · scikit-learn · FastAPI · Render
Proyecto en equipo con Ana Manzanares. Me encargué de la limpieza de datos, el modelado y la optimización. La primera petición puede tardar ~1 min porque el servidor gratuito arranca en frío.










