Por Jose R. Zapata
Trabajos y Procentajes
| Porcentaje | Trabajo practico | Fecha |
|---|---|---|
| 40 % | POC - Dataset estático en notebooks | 7/Sep |
| 40 % | Arquitectura FTI en scripts, validación y CI/CD | 7/Sep |
| 20 % | Despliegue del modelo con Streamlit: online y batch | 13/Sep |
Regla para completar tareas
Una tarea se considera completada cuando cumple su objetivo y entregables específicos, y además cumple todo el flujo de desarrollo:
- Crear el issue correspondiente en el github project.
- Crear una rama desde el issue siguiendo el branching model.
- Realizar commits con Conventional Commits.
- Crear un Pull Request hacia
main. - Hacer merge del Pull Request en
main.
1.Prueba de concepto (POC) - Notebooks (40%)
El objetivo de este trabajo es realizar una prueba de concepto POC mediante la solución de un problema de un proyecto básico de ciencia de datos (dataset estático) mediante un Proceso de análisis de datos, preparación de datos, entrenamiento de modelos y validación. Se requiere la ejecución de cada paso y la transición de un paso a otro, usando notebooks como herramienta de desarrollo.
$$ \text{Nota de calificación} = \left( \frac{\text{Número de tareas completadas} \times 5.0}{8} \right) $$Agregar los siguientes Issues al repositorio en github y relacionarlos con el proyecto creado:
1.Descarga de los datos
# Requerimiento
Crear una nueva rama de git (Usar [Gitflow](https://joserzapata.github.io/courses/ciencia-datos-en-produccion/control-versiones/branching-model/)) y Crear un notebook para la obtención de datos tipo RAW.
- crear la rama a partir de un issue: <https://docs.github.com/es/issues/tracking-your-work-with-issues/using-issues/creating-a-branch-for-an-issue>
- Realizar los pasos de: <https://joserzapata.github.io/post/ciencia-datos-proyecto-python/1-data/>
Descargar los datos y entender el problema a realizar, contestar en el notebook
- ¿Cual es el objetivo del problema?
- ¿Cómo se usará su solución?
- ¿Cuáles son las soluciones actuales (si las hay)?
- ¿Cómo se debe enmarcar este problema (supervisado / no supervisado, en línea / fuera de línea, etc.)
- ¿Cómo se debe medir el desempeño o el rendimiento de la solución, una primera intuicion?
- ¿La medida de desempeño está alineada con el objetivo del problema?
- ¿Cuál sería el desempeño o rendimiento mínimo necesario para alcanzar el objetivo del problema?
- ¿Cuáles son los problemas parecidos? ¿Se puede reutilizar experiencias o herramientas ya creadas?
- ¿Hay experiencia del problema disponible?
- (Importante) ¿Cómo se puede resolver el problema manualmente?
- Hacer un listado de los supuestos que hay hasta este momento.
- Cual es la fuente de los datos?
- Como se actualizan los datos?
- Cada cuanto tiempo se actualizan los datos
# Entregables
Notebook para obtención de los datos.
Se debe realizar un Pull request para ingresar el notebook a la rama`main`y que pase los check del CI/CD
2.Exploración inicial de datos
# Requerimiento
Crear una nueva rama de git (Usar [Gitflow](https://joserzapata.github.io/courses/ciencia-datos-en-produccion/control-versiones/branching-model/)) y Crear un notebook para la exploración inicial de los datos
- Tomar como ejemplo los pasos de: <https://joserzapata.github.io/post/ciencia-datos-proyecto-python/2-exploration/>
el objetivo es realizar una exploración general de datos para verificar los tipos de datos con el fin de comprender de las características y el esquema de datos y si es posible solucionar problemas básicos relacionados. realizar
- Descripción general de los datos
- Unificar la forma como se representan los valores Nulos
- Convertir los datos en su tipo correcto (numéricos, categóricos, booleanos, fechas, etc) y corrección de los datos si es necesario, para eu cada columna tenga un tipo de dato uniforme.
- Almacenar el dataset final en un formato adecuado como `.parquet`
# Entregables
Notebook con la exploración general de los datos y los pasos descritos anteriormente
Se debe realizar un Pull request para ingresar el notebook a la rama`main` y que pase los check del CI/CD
3.Análisis exploratorio de datos (EDA)
Realizar un buen análisis de datos exploratorio (EDA) para caracterizar los datos disponibles para el proyecto. Crear una nueva rama de git (Usar [Gitflow](https://joserzapata.github.io/courses/ciencia-datos-en-produccion/control-versiones/branching-model/)).
> Tomar como ejemplo los pasos de: <https://joserzapata.github.io/post/ciencia-datos-proyecto-python/3-analysis/>
Si su proyecto tiene muchos datos puede dividir el análisis en 3 notebooks diferentes:
- Análisis univariable
- Análisis bivariable
- Análisis multivariable
En este proceso, se incluye :
- Compresión detallada de las características y el esquema de datos.
- Identificación de la preparación de datos y la ingeniería de atributos que se necesitan si se fuera a implementar un modelo de machine learning
- Estudiar cada atributo y sus características (Análisis Univariable):
- Nombre
- Tipo de dato (categórico ordinal, nominal, numérico int / float, acotado / no acotado, texto, estructurado, fechas, etc.)
- porcentaje (%) de valores nulos.
- valores exactamente duplicados (filas y columnas)
- Ruido y tipo de ruido (estocástico, valores atípicos, errores de redondeo, etc.)
- ¿Son posiblemente útiles para el proyecto?
- Descripción estadística (dependiendo del tipo de dato): por ejemplo para los numéricos
- Tendencia Central (media, mediana, moda, max, min, etc)
- Medidas de dispersión (Rango, IQR, cuartiles, varianza, desviación estándar, skewness y kurtosis)
- Tipo de distribución (gaussiana, uniforme, logarítmica, etc.)
- Analice los datos para crear las reglas de validación de los datos que serán usadas en otra etapa del proyecto.
- Para los proyectos de aprendizaje supervisado, identifique los atributos objetivo (target).
- Visualización de los datos.
- Estudiar las relaciones entre atributos (Análisis Bivariable)
- Estudiar las relaciones entre varios atributos (Análisis Multivariable)
- Estudiar cómo resolver el problema manualmente. (modelo simple Viable o heurísticas)
- Identificar las transformaciones que tal vez se puedan aplicar.
- Identificar datos adicionales que pueden ser útiles.
> Puede utilizar las librerías o herramientas que considere para resolver la tarea y contestar las preguntas.
> Utilice sistemas automáticos como [Data science Agent](https://developers.googleblog.com/en/data-science-agent-in-colab-with-gemini/) pueden ver un tutorial en este [Link](https://www.youtube.com/watch?v=1WAjTyYEIos)
# Entregables
Notebook con los resultados del análisis exploratorio de los datos, conclusiones e información de los datos
¿Sugerir si se puede realizar un modelo Heurístico que sea viable?
Se debe realizar un Pull request para ingresar el notebook a la rama`main` y que pase los check del CI/CD.
4.Feature Engineering
# Requerimiento
Realizar el proceso de Feature Engineering para limpieza, transformación y modificación de los datos para que puedan ser usados para entrenar un modelo para resolver un problema. Hacerlo en un nuevo branch de git (Usar [Gitflow](https://joserzapata.github.io/courses/ciencia-datos-en-produccion/control-versiones/branching-model/)) y Crear un notebook para la creación de los pipelines de scikit-learn
> Tomar como ejemplo los pasos de: <https://joserzapata.github.io/post/ciencia-datos-proyecto-python/4-feat_eng/>
En este proceso para cada tipo de datos se incluye :
1. **Limpieza de datos**:
- Eliminar registros datos duplicados (disminuir el numero de datos)
- Corregir o eliminar valores atípicos (opcional).
- Los valores atípicos pueden separarse del dataset dependiendo del problema del proyecto (por ejemplo, detección de anomalías).
- Completar los valores faltantes (por ejemplo, con cero, media, mediana …) o eliminar las filas (o columnas).
2. Selección de atributos (**Feature Selection**) (opcional):
- Descartar los atributos que no proporcionan información útil para el proyecto.
- Eliminar registros duplicados (al eliminar atributos pueden quedar registros iguales)
3. Ingeniería de atributos (**Feature Engineering**), cuando sea apropiado:
- Discretizar las atributos continuas.
- (opcional) Descomponer en partes los atributos (p. Ej., Categóricas, fecha / hora, etc.).
- (opcional) Agregar transformaciones prometedoras de las atributos, por ejemplo:
- log(x)
- sqrt(x)
- x^2
- etc
- Aplicar funciones a los datos para agregar nuevos atributos.
4. Escalado de atributos (**Feature Scaling**):
- estandarizar
- normalizar
- etc
5. Encoding
- Encode variables categóricas, texto y las que sean necesarias para poder ser usadas para el modelamiento
Crear todas estas transformaciones usando transformadores y pipelines de scikit-learn
- https://scikit-learn.org/stable/modules/preprocessing.html
- https://scikit-learn.org/stable/modules/compose.html#
> Puede utilizar las librerías o herramientas que considere para resolver la tarea
# Entregables
Notebook con la descripción y creación de los pipelines de scikit-learn.
Se debe realizar un Pull request para ingresar el notebook a la rama`main` y que pase los check del CI/CD.
5.Modelo BaseLine
# Requerimiento
Crear un modelo base para tenerlo como referencia para luego comparar al entrenar modelos de machine learning, el modelo base puede ser un modelo de heurísticas o un [modelo dummy](https://scikit-learn.org/stable/api/sklearn.dummy.html). Crear un nuevo branch de git (Usar [Gitflow](https://joserzapata.github.io/courses/ciencia-datos-en-produccion/control-versiones/branching-model/)).
> Tomar como ejemplo los pasos de: <https://joserzapata.github.io/post/ciencia-datos-proyecto-python/5-baseline_model/>
En este proceso se incluye :
- Usar pipeline de procesamiento de datos creado en la tarea anterior
- Dividir los datos en Train / Test
- Evaluar con diferentes métricas según el problema que se esta solucionando
- Usar validación cruzada (Cross validation) y obtener la media y la desviación estándar de la medida de las evoluciones realizadas.
- Seleccionar la variable mas importante y justificar por que se selecciona.
- Realizar el análisis de Learning curve
- obtener las gráficas de escalabilidad con tiempo de entrenamiento y score
- Interpretar los resultados
- realizar análisis de los resultados
- realizar conclusiones
- definir recomendaciones para crear un modelo en base a los resultados del modelo base
- Propuestas y ideas en base a os resultados obtenidos
> Puede utilizar las librerías o herramientas que considere para resolver la tarea
# Entregables
Notebook con la descripción y creación de los pipelines de scikit-learn, además de los resultados del modelo base.
Se debe realizar un Pull request para ingresar el notebook a la rama`main` y que pase los check del CI/CD.
6.Selección del mejor modelo
# Requerimiento
Realizar el proceso de selección del mejor modelo de machine learning para resolver el problema de machine Learning, este modelo debe ser mejor que el modelo baseline. Crear un nuevo branch de git (Usar [Gitflow](https://joserzapata.github.io/courses/ciencia-datos-en-produccion/control-versiones/branching-model/)).
Se puede solucionar:
- Manual
- Automatizada
Seleccione la opción que considere mejor. (Es un buen momento para conocer las herramientas de AutoML)
## Manual
> Si lo va hacer manual Tomar como ejemplo los pasos de: <https://joserzapata.github.io/post/ciencia-datos-proyecto-python/6-model_selection/>
De ser Manual este proceso se incluye :
- Usar pipeline de procesamiento de datos creado en la tarea anterior
- Dividir los datos en Train / Test
- seleccionar multiples modelos de machine learning según el problema (mínimo 4 tipos diferentes)
- Evaluar con diferentes métricas según el problema que se esta solucionando (En la tarea anterior se definió cual seria la métrica mas importante)
- Eliminar los modelos que funciones por debajo del promedio de los modelos
- Evaluar los modelos restantes usando validación cruzada (Cross validation) y obtener la media y la desviación estándar de la medida de las evoluciones realizadas. (recuerde usar pipelines de la union del pipeline de transformación y el modelo)
- los dos o tres mejores modelos realizar el proceso de optimización de hiperparametros, recuerde usar cross validation y los pipelines
- Comparar los resultados y seleccionar el mejor modelo (recuerde usar pruebas estadísticas en la comparación para seleccionar el mejor modelo)
- Entrenar con todo el dataset de train el modelo seleccionado con sus hiperparametros, luego hacer la predicción con el dataset de test y realizar la evaluación de desempeño.
- si los resultados de la evaluación de test, se presenta, underfitting, overfitting repetir el proceso nuevamente con otros modelos y otras configuraciones, si no se logra un buen desempeño es necesario repetir el proceso de feature engineering.
- Realizar el análisis de Learning curve
- obtener las gráficas de escalabilidad con tiempo de entrenamiento y score
- Almacenar el pipeline de preprocesamiento + modelo
- Interpretar los resultados
- realizar análisis de los resultados
- definir recomendaciones
## Automatizada
Utilizar herramientas de AutoML para la selección del mejor modelo, por ejemplo:
- **AutoGlueon** <https://auto.gluon.ai/>
- **Pycaret** <https://pycaret.org/>
- **TabPFN** <https://github.com/PriorLabs/TabPFN>
- **MLJar** <https://mljar.com/automl/>
- **FLAML** <https://microsoft.github.io/FLAML/>
- Realizar el análisis de Learning curve de ser posible
- Analizar Overfitting y Underfitting
- obtener las gráficas de escalabilidad con tiempo de entrenamiento y score
- Almacenar el pipeline de preprocesamiento + modelo
- Interpretar los resultados
- realizar análisis de los resultados
- definir recomendaciones
> Puede utilizar las librerías o herramientas que considere para resolver la tarea
# Entregables
Notebook con los pasos descritos anteriormente y el modelo entrenado en formato `.joblib`
Se debe realizar un Pull request para ingresar el notebook a la rama`main` y que pase los check del CI/CD.
7.Interpretación del modelo Seleccionado
# Requerimiento
Analizar las características del modelo obtenido, con el fin de tener un listado de pruebas y experimentos que se van a realizar en la siguiente iteración. Crear un nuevo branch de git (Usar [Gitflow](https://joserzapata.github.io/courses/ciencia-datos-en-produccion/control-versiones/branching-model/)).
> Tomar como ejemplo los pasos de: <https://joserzapata.github.io/post/ciencia-datos-proyecto-python/7-model_interpretation/>
En este proceso se incluye :
- Interpretar el modelo seleccionado
- Identificar los atributos más importantes
- Realizar el análisis de Learning curve
- obtener las gráficas de escalabilidad con tiempo de entrenamiento y score
- ¿Cuáles son las consecuencias de las malas predicciones?
- ¿Qué tipo de errores comete el modelo?
- ¿A qué se deben los errores?
- outliers?
- Clase desbalanceada?
- ¿Errores en el ingreso de datos?
- Encoders?
- etc
> Puede utilizar las librerías o herramientas que considere para resolver la tarea
# Entregables
Notebook con los pasos descritos anteriormente y el modelo entrenado en formato `.joblib`
Se debe realizar un Pull request para ingresar el notebook a la rama`main` y que pase los check del CI/CD.
8.Demo POC del modelo
# Requerimiento
Crear una demo POC local del modelo entrenado para comprobar que puede recibir datos y realizar predicciones. Esta tarea no reemplaza la evaluación 3, que exige el despliegue online y batch con Streamlit.
> Cada Proyecto es diferente pero se puede Tomar como ejemplo los pasos de: <https://joserzapata.github.io/post/ciencia-datos-proyecto-python/8-deploy/>.
Puede usar la herramienta que desee por ejemplo:
- https://taipy.io/
- https://streamlit.io/
- https://www.gradio.app/
# Entregables
Screenshot o links del demo y el código con las instrucciones para ejecutarlo.
Se debe realizar un Pull request para ingresar el notebook a la rama`main` y que pase los check del CI/CD.
2. Arquitectura FTI en scripts, validación y CI/CD (40%)
El objetivo de este trabajo es transformar el POC en notebooks en un sistema reproducible basado en scripts de Python. La evaluación integra la arquitectura monolito actual y las tareas de automatización FTI. Scripts de Python con buenas prácticas. Gestión de ambientes virtuales, dependencias y Code-quality (linter, formatter, isort, mypy, pip-audit, pre-commit) que ya estan configuradas en base al template proporcionado.
$$ \text{Nota de calificación} = \left( \frac{\text{Número de tareas completadas} \times 5.0}{6} \right) $$Tareas a realizar
Agregar los siguientes Issues al repositorio y relacionarlos con el proyecto creado:
1. Creación de Feature Pipeline
# Requerimiento
Crear un script en Python llamado `feature_pipeline.py` que:
- Lea los datos originales desde la fuente definida para el proyecto.
- Transforme los datos en features adecuados para el modelo de machine learning.
- Almacene los features procesados en un archivo.
El script debe poder ejecutarse de forma autónoma.
Puede utilizar como ejemplo: <https://github.com/JoseRZapata/air-quality-fti/blob/main/src/pipelines/feature_pipeline/feature-pipeline.py>.
# Entregables
- Script `feature_pipeline.py` funcional.
- Pruebas unitarias.
2. Data validation y data integrity
# Requerimiento
Modificar `feature_pipeline.py` para validar los datos antes de persistir los features. El proceso debe garantizar calidad, consistencia, formato e integridad de los datos.
> Referencia: [Validación de Datos en Proyectos de Ciencia de Datos](https://joserzapata.github.io/courses/ciencia-datos-en-produccion/data-validation/).
## El proceso debe incluir
- Reglas sobre tipos esperados, rangos, porcentaje máximo de nulos, categorías válidas, formatos de fecha y unicidad de campos clave.
- Reglas de integridad entre campos, registros y datasets cuando correspondan al problema.
- Implementación con la herramienta que quiera, ya sea [Great Expectations](https://greatexpectations.io/), [Pandera](https://pandera.readthedocs.io/) o validaciones manuales con `pandas`.
- Un error claro y ausencia de persistencia de features cuando falle una validación.
# Entregables
- `feature_pipeline.py` con validaciones documentadas.
- Pruebas unitarias con datos válidos e inválidos.
3. Creación de Training Pipeline
# Requerimiento
Crear un script en Python llamado `train_pipeline.py` que:
- Lea los features procesados desde el archivo del paso anterior.
- Realice la separación train/test, el entrenamiento y la evaluación con métricas apropiadas.
- Almacene el modelo entrenado y los resultados de evaluación.
El script debe poder ejecutarse de forma autónoma.
Puede utilizar como ejemplo: <https://github.com/JoseRZapata/air-quality-fti/blob/main/src/pipelines/training_pipeline/train-pipeline.py>.
# Entregables
- Script `train_pipeline.py` funcional.
- Pruebas unitarias que cubran lectura de datos, entrenamiento, generación de métricas y almacenamiento del modelo.
4. Train/Test split check
# Requerimiento
Modificar `train_pipeline.py` para verificar la separación entre los conjuntos train y test. El objetivo es evitar fuga de información (data leakage) y comprobar que ambos conjuntos representan la distribución esperada del problema.
> Referencia: [Train/Test Split Checks](https://joserzapata.github.io/courses/ciencia-datos-en-produccion/data-validation/train_test-checks/).
## El proceso debe incluir
- Resultados de las validaciones de la separación.
- Una advertencia clara o un error controlado cuando se detecte un problema.
- Una función testeable e independiente, por ejemplo `validate_train_test_split()`.
Se pueden utilizar herramientas como [Evidently](https://docs.evidentlyai.com/) o [DeepChecks](https://docs.deepchecks.com/stable/).
# Entregables
- `train_pipeline.py` con los checks integrados.
- Pruebas unitarias para casos válidos e inválidos.
5. Validación del modelo
# Requerimiento
Actualizar `train_pipeline.py` para validar de forma robusta el rendimiento y la generalización del modelo.
> Referencia: [Validación del Modelo](https://joserzapata.github.io/courses/ciencia-datos-en-produccion/model-validation/).
## El proceso debe incluir
- Validación cruzada sobre train: K-Fold, StratifiedKFold o TimeSeriesSplit según corresponda.
- Métricas adecuadas para clasificación o regresión.
- Comparación entre resultados de train, validación cruzada y test.
- Análisis de underfitting, overfitting y posibles acciones de mejora.
# Entregables
- `train_pipeline.py` actualizado.
- Métricas, visualizaciones o logs como evidencia.
- Ejecución reproducible de la validación.
6. Creación de Prediction Pipeline
# Requerimiento
Crear un script en Python llamado `inference_pipeline.py` que:
- Cargue el modelo entrenado desde el almacenamiento del proyecto.
- Lea datos nuevos desde un archivo.
- Aplique las mismas transformaciones usadas durante entrenamiento.
- Genere y almacene o visualice las predicciones.
El script debe poder ejecutarse de forma autónoma.
Puede utilizar como ejemplo: <https://github.com/JoseRZapata/air-quality-fti/blob/main/src/pipelines/inference_pipeline/inference-pipeline.py>.
# Entregables
- Script `inference_pipeline.py` funcional.
- Pruebas unitarias con un modelo dummy y datos sintéticos.
- Evidencia de carga de modelo, transformación y generación de predicciones.
Cada tarea debe cumplir la regla para completar tareas. Los entregables específicos de cada tarea deben incluirse en el Pull Request correspondiente.
3. Despliegue funcional del modelo con Streamlit (20%)
El objetivo de esta evaluación es entregar una aplicación Streamlit funcional que permita usar el modelo entrenado tanto de forma online como batch.
$$ \text{Nota de calificación} = \left( \frac{\text{Número de tareas completadas} \times 5.0}{2} \right) $$Tareas a realizar
- Demo online con Streamlit
- Crear una interfaz web para ingresar los datos requeridos y obtener una predicción del modelo.
- Publicar la aplicación en un entorno accesible mediante URL.
- Incluir instrucciones de uso y evidencia de funcionamiento.
- Procesamiento batch con Streamlit
- Crear una interfaz que reciba un archivo con múltiples registros y permita descargar o visualizar las predicciones generadas.
- Incluir archivos de ejemplo de entrada y salida, instrucciones de uso y evidencia de funcionamiento.
Puede ser la misma interfaz para ambas tareas, siempre y cuando cumpla con los requisitos de cada una.
Demo streamlit tiene una pestaña dedicada a funcionamiento online y otra para procesamiento batch.
Cada tarea debe cumplir la regla para completar tareas.