El Ciclo de Vida de un Proyecto de Machine Learning#
Objetivos#
Conocer las etapas fundamentales desde la concepción del problema hasta el despliegue del modelo.
Entender que el modelado es solo una pequeña fracción del trabajo total en IA.
Comprender el concepto de MLOps de forma introductoria.
Prerrequisitos#
Configuración del Entorno#
import matplotlib.pyplot as plt
import numpy as np
import warnings
warnings.filterwarnings('ignore')
1. El Mito vs La Realidad#
A menudo, los cursos tradicionales se centran en enseñar algoritmos matemáticos complejos. Sin embargo, en la industria, el código del modelo de Machine Learning es solo una pequeña caja dentro de un sistema mucho más grande.
El ciclo de vida completo de un proyecto de IA suele seguir estos pasos:
Definición del Problema y Objetivos del Negocio: ¿Qué queremos predecir? ¿Cómo aporta valor? ¿Cuáles son las métricas de éxito del negocio (no solo del modelo)?
Recolección de Datos: Identificar fuentes, extraer y almacenar datos.
Análisis Exploratorio de Datos (EDA) y Limpieza: Entender los datos, lidiar con nulos, outliers y errores. (Suele tomar el 70% del tiempo de un Data Scientist).
Ingeniería de Características (Feature Engineering): Transformar los datos crudos en formatos que los algoritmos puedan aprovechar (codificación, escalado, creación de nuevas variables).
Selección y Entrenamiento del Modelo: Probar diferentes algoritmos (Regresión Lineal, Random Forest, Redes Neuronales).
Ajuste Fino (Hyperparameter Tuning): Mejorar el rendimiento del modelo seleccionado modificando su configuración interna.
Evaluación Final: Probar el modelo en el conjunto de prueba (Test Set).
Despliegue (Deployment): Poner el modelo en producción (ej. como una API REST o embebido en una app).
Monitoreo y Mantenimiento: Vigilar que el modelo siga funcionando bien con el paso del tiempo (Data Drift y Concept Drift).
MLOps (Machine Learning Operations)#
El conjunto de prácticas de las etapas 8 y 9, combinadas con la automatización del re-entrenamiento, se conoce como MLOps. Es la intersección entre el Machine Learning, DevOps y la Ingeniería de Datos.
2. Ilustrando la Inversión de Tiempo#
Veamos visualmente cómo se distribuye típicamente el tiempo en un proyecto de ML del mundo real.
etapas = [
'Recolección de Datos',
'Limpieza y EDA',
'Feature Engineering',
'Entrenamiento de Modelos',
'Ajuste Fino',
'Despliegue y Monitoreo'
]
tiempo_estimado_pct = [15, 40, 20, 5, 10, 10]
plt.figure(figsize=(10, 6))
# Usamos un gráfico de barras horizontales para facilitar la lectura
plt.barh(etapas[::-1], tiempo_estimado_pct[::-1], color=plt.cm.Paired(np.linspace(0, 1, len(etapas))))
plt.xlabel('Porcentaje de Tiempo Dedicado (%)')
plt.title('Distribución Típica del Tiempo en un Proyecto de ML')
plt.xlim(0, 50)
# Añadir los porcentajes como texto
for index, value in enumerate(tiempo_estimado_pct[::-1]):
plt.text(value + 1, index, str(value) + '%', va='center')
plt.tight_layout()
plt.show()
Resultados y Discusión#
Como evidencia el gráfico, las etapas de preparación de datos (Recolección, Limpieza, EDA e Ingeniería de Características) dominan abrumadoramente el tiempo del proyecto.
El entrenamiento de modelos, gracias a librerías modernas como scikit-learn, suele requerir pocas líneas de código.
Conexiones y Próximos Pasos#
➡️ Siguiente: Conocer cómo evaluar si nuestro modelo sirve o no en Métricas de Evaluación Básicas.
Referencias#
Hidden Technical Debt in Machine Learning Systems, Sculley et al. (Google), NeurIPS 2015.
Entorno de Ejecución#
| Package | Version |
|---|---|
| Python | 3.12.12 |
| Platform | Linux-6.6.113+-x86_64-with-glibc2.35 |
| Cython | 3.0.12 |
| IPython | 7.34.0 |
| PIL | 11.3.0 |
| argparse | 1.1 |
| backcall | 0.2.0 |
| bottleneck | 1.4.2 |
| certifi | 2026.2.25 |
| charset_normalizer | 3.4.4 |
| cloudpickle | 3.1.2 |
| csv | 1.0 |
| ctypes | 1.1.0 |
| cycler | 0.12.1 |
| cython | 3.0.12 |
| dateutil | 2.9.0.post0 |
| debugpy | 1.8.15 |
| decimal | 1.70 |
| decorator | 4.4.2 |
| defusedxml | 0.7.1 |
| entrypoints | 0.4 |
| 3.0.0 | |
| http | 0.6 |
| httplib2 | 0.31.2 |
| ipaddress | 1.0 |
| ipykernel | 6.17.1 |
| ipython_genutils | 0.2.0 |
| ipywidgets | 7.7.1 |
| json | 2.0.9 |
| jupyter_client | 7.4.9 |
| jupyter_core | 5.9.1 |
| kiwisolver | 1.4.9 |
| logging | 0.5.1.2 |
| matplotlib | 3.10.0 |
| matplotlib_inline | 0.2.1 |
| numexpr | 2.14.1 |
| numpy | 2.0.2 |
| packaging | 26.0 |
| pandas | 2.2.2 |
| patsy | 1.0.2 |
| pexpect | 4.9.0 |
| pickleshare | 0.7.5 |
| platformdirs | 4.9.2 |
| prompt_toolkit | 3.0.52 |
| psutil | 5.9.5 |
| ptyprocess | 0.7.0 |
| pyarrow | 18.1.0 |
| pydevd | 3.2.3 |
| pygments | 2.19.2 |
| pyparsing | 3.3.2 |
| pytz | 2025.2 |
| re | 2.2.1 |
| scipy | 1.16.3 |
| seaborn | 0.13.2 |
| six | 1.17.0 |
| socketserver | 0.4 |
| socks | 1.7.1 |
| statsmodels | 0.14.6 |
| tornado | 6.5.1 |
| traitlets | 5.7.1 |
| urllib | 3.12 |
| wcwidth | 0.6.0 |
| xmlrpc | 3.12 |
| zlib | 1.0 |
| zmq | 26.2.1 |