Evaluación General del curso
Porcentaje | Trabajo practico | Fecha |
---|---|---|
20 % | MLOps: Proceso manual POC - Dataset estático (Data science, Git pull request) | 28 / Feb |
20 % | MLOps: Arquitectura Monolito en scripts (configuración local, code quality), Despliegue básico y CI/CD | 22 / Abril |
30 % | MLOps: Proceso manual POC - Datos que cambian en el tiempo (CI/CD) | 13 / Mayo |
30 % | MLOps: Arquitectura FTI Pipelines - Automatización (Data and Model Validation, Experiment tracking, deployment) | 22 / Mayo |
Una tarea se considera completada cuando pasa por todo el proceso de Pull Request y esta en código en la rama Main
Proyecto 1 - Dataset Estático
1. MLOps: Proceso manual POC - Notebooks (20%)
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 mediante un Proceso manual 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, ambas de forma manual. Etapas a realizar:
- Descarga de datos
- Exploración inicial de datos
- Análisis exploratorio de datos (EDA)
- Feature Engineering
- Modelo BaseLine
- Selección del mejor modelo
- Interpretación del mejor modelo.
2. MLOps: Arquitectura Monolito en scripts, Despliegue básico y CI/CD (20%)
El objetivo de este trabajo es convertir los procesos realizados en notebooks a scripts de python con buenas practicas (Gestión de ambiente virtual, manejo de dependencias, calidad de código mediante pre-commit ) y crear un Demo.
- Gestión de ambientes virtuales, dependencias y Code-quality (linter, formater, isort, mypy, pip-audit, pre-commit)
- Pipeline de entrenamiento Básico (Solución monolito de entrenamiento de modelo)
- Demo Funcional con streamlit (Formulario online)
- Demo Funcional con streamlit (batch)
Proyecto Final
EL objetivo de este trabajo es crear un sistema stand alone de Machine Learning serverless con buenas practicas de desarrollo siguiendo las pautas de MLOps y garantizar:
- Reproducibilidad
- Robusto
- Cumplir con estándares de Calidad de código
- Trabajo en equipo
Se deben crear equipos de 2 personas definir el proyecto que quieren trabajar, para esto deben escribir una descripción del proyecto de máximo una página. El proyecto propuesto debe ser aprobado por el docente.
La propuesta de proyecto debe abarcar los siguientes apartados:
- Descripción del problema: ¿Cuáles son las fuentes de datos (Los datos deben actualizarse constantemente en el tiempo) y el problema de predicción para el que construirá un sistema de aprendizaje automático?
- Datos: ¿Qué datos utilizará y cómo los recopilará?
- Metodología y algoritmo: ¿Qué método(s) o algoritmo(s) propone?
- Nombre de los integrantes del proyecto
Entregar en un archivo en pdf la propuesta.
proyectos de referencia Ref_1, Ref_2, Ref_3
3. MLOps: Proceso manual POC - Datos que cambian en el tiempo (30%)
Este sera un nuevo proyecto con datos que se actualicen constantemente y garantizar que el proyecto sea reproducible, que pueda mantenerse en el tiempo y escalable. Los primeros pasos a realizar son:
- POC del proyecto End to End en Notebooks
- Gestión de ambientes virtuales, dependencias y Code-quality (linter, formater, isort, mypy, pip-audit, pre-commit)
- CI/CD de checks de calidad de código
Tareas a realizar
- Crear un repositorio en GitHub y agregarnos a todo el equipo al proyecto.
- Inicializar el repositorio con la plantilla de proyectos de ciencia de datos: https://github.com/JoseRZapata/data-science-project-template la documentación esta en https://joserzapata.github.io/data-science-project-template/
- Bloquear la rama
main
y que solo se pueda hacer merge a la ramamain
mediante Pull Request. - Crear un Github Project tipo Kanban para gestionar las tareas del proyecto.
Agregar los siguientes Issues al repositorio 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` para esto debe tener mínimo 1 revisiones de otras personas del Curso 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` para esto debe tener mínimo 1 revisiones de otras personas del Curso 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` para esto debe tener mínimo 1 revisiones de otras personas del Curso 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` para esto debe tener mínimo 1 revisiones de otras personas del Curso 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` para esto debe tener mínimo 1 revisiones de otras personas del Curso 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` para esto debe tener mínimo 1 revisiones de otras personas del Curso 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` para esto debe tener mínimo 1 revisiones de otras personas del Curso y que pase los check del CI/CD.
8.Demo Funcional
# Requerimiento
Crear una demo funcional del modelo entrenado, para esto se debe crear un formulario online donde el usuario ingrese los datos y el modelo realice la predicción. Crear un nuevo branch de git (Usar [Gitflow](https://joserzapata.github.io/courses/ciencia-datos-en-produccion/control-versiones/branching-model/))
> 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` para esto debe tener mínimo 1 revisiones de otras personas del Curso y que pase los check del CI/CD.
4. MLOps: Arquitectura FTI Pipelines - Automatización (30%)
El proceso final del curso sera agregar al proyecto anterior los pasos de:
- Creación de scripts de python
- Pruebas unitarias y de integración
- Data Validation y Model validation
- Experiment tracking
- Puesta en producción de modelos
- pipeline features
- pipeline training
- pipeline prediction
- Model Monitoring