Una aplicación completa de Machine Learning para la clasificación de tumores de mama usando Random Forest optimizado, con API Flask y frontend interactivo en Streamlit, todo orquestado con Docker.
- Dataset: Wisconsin Breast Cancer Dataset (WDBC) de UCI.
- Random Forest optimizado con GridSearchCV.
- Validación cruzada y métricas comprehensivas (Accuracy, ROC-AUC, Recall).
- Análisis de importancia de features para explicabilidad.
- Generación automática de visualizaciones: Curva ROC, matriz de confusión, etc.
- Creación de casos de ejemplo (benigno, maligno, límite) basados en datos reales para demostraciones consistentes.
- Endpoints:
health,model/info,features,predict(individual y batch), yvisualizations. - Validación robusta de datos de entrada y manejo de errores.
- Cálculo de contribución de features para cada predicción.
- Logging para seguimiento y depuración.
- 4 pestañas especializadas:
- 🔍 Predicción con casos predefinidos
- 📊 Análisis de features del dataset
- 🎛️ Modo manual con sliders interactivos
- 📈 Visualizaciones del modelo
- Gráficos interactivos con Plotly
- Métricas en tiempo real
- Interfaz intuitiva y profesional con CSS personalizado.
- Pipeline reproducible con Docker Compose.
- 4 servicios definidos:
training,api,frontend, ytester. - Inicio automatizado con un solo script (
start.sh). - Pruebas de integración automatizadas contra la API en un entorno aislado.
- Pipeline Automatizado con GitHub Actions: Cada
pusha la ramamaindispara un flujo de trabajo que automáticamente entrena, prueba, construye y despliega la aplicación. - Despliegue en Google Cloud: La aplicación se despliega en Google Cloud Run, una plataforma serverless que escala automáticamente, garantizando alta disponibilidad y eficiencia.
- Registro de Imágenes en Artifact Registry: Las imágenes de Docker se versionan y almacenan de forma segura en Google Artifact Registry.
A continuación se presentan breves demostraciones de la aplicación.
Un vistazo rápido a la interfaz de usuario, mostrando una predicción en tiempo real y el dashboard de resultados.
➡️ Ver Demo Completa del Frontend en YouTube
Demostración de la interacción entre la API, los contenedores y las pruebas automatizadas.
➡️ Ver Demo Completa del Backend en YouTube
Este proyecto está diseñado para ejecutarse con Docker, lo que simplifica enormemente la configuración y garantiza la reproducibilidad.
Requisitos:
- Docker Desktop instalado y en ejecución.
- Un terminal que soporte scripts de shell (Git Bash o WSL en Windows).
Pasos para ejecutar:
-
Clonar el Repositorio:
git clone https://github.com/LiliGC/advanced-breast-cancer-classifier.git cd advanced-breast-cancer-classifier -
Ejecutar el Script de Orquestación: El método recomendado es utilizar el script
start.shque gestiona todo el ciclo de vida de la aplicación local. Este script actúa como un orquestador que ejecuta los comandos dedocker-composeen la secuencia correcta para asegurar un inicio limpio y ordenado.# En Windows (usando Git Bash o WSL) o en Linux/macOS ./start.shEste script se encargará de:
- Limpiar entornos Docker previos.
- Construir las imágenes necesarias.
- Ejecutar el contenedor de entrenamiento para generar los artefactos del modelo.
- Levantar la API y el Frontend.
- Ejecutar las pruebas de integración contra la API.
-
Acceder a la Aplicación:
- Frontend: Abre tu navegador y ve a
http://localhost:8501 - API Health Check:
http://localhost:5000/health
- Frontend: Abre tu navegador y ve a
Una vez que la aplicación ha sido construida y entrenada con start.sh, no necesitas ejecutar todo el script cada vez.
- Para iniciar solo la API y el Frontend (sin re-entrenar):
docker-compose up -d api frontend
- Para detener todos los servicios:
docker-compose down
Si deseas eliminar los contenedores, volúmenes y las imágenes construidas para liberar espacio en tu disco:
-
Detener y eliminar contenedores y volúmenes:
docker-compose down -v
-
Eliminar las imágenes construidas por el proyecto:
# Reemplaza 'breast_cancer_project' si tu carpeta de proyecto tiene otro nombre docker rmi $(docker images -q 'breast_cancer_project*')
breast_cancer_project/
📁 .github/
│ ├── 📁 workflows
│ │ ├── ci-cd.yml # Flujo de trabajo de CI/CD
├── 📁 breast_cancer_app/
│ ├── 📁 model
│ │ ├── train_model.py # Script de entrenamiento
│ ├── 📁 api
│ │ ├── api.py # API Flask
| ├── 📁 frontend
│ │ ├── frontend.py # Frontend Streamlit
├── 📁 tests
│ │ ├── test_api.py # Tests automatizados
├── 📁 requirements/
│ ├── common.txt # Dependencias comunes
│ ├── api.txt # Dependencias de la API
│ ├── frontend.txt # Dependencias del Frontend
│ └── dev.txt # Dependencias de desarrollo
├── 📁 artifacts (automático)
│ ├── model.pkl # Modelo entrenado
│ ├── feature_info.json # Info de features
│ ├── model_metrics.json # Métricas
│ └── *.png # Visualizaciones
|___📁 docs/
| └── DEVELOPMENT_GUIDE.md # Guía de evolución del desarrollo del proyecto
|── Dockerfile # Dockerfile para la API
|── Docker-compose.yml # Orquestador de contenedores
|── .dockerignore # Archivos a ignorar en Docker
|── .gitignore # Archivos a ignorar en Git
|── start.sh # Script de inicio automatizado
|── README.md # Documentación del proyecto
Características:
- Optimización de hiperparámetros con GridSearchCV.
- Validación cruzada para evaluar la generalización del modelo.
- Métricas completas: Accuracy, ROC-AUC, y reporte de clasificación.
- Análisis de importancia de features para explicabilidad.
- Generación automática de visualizaciones: Curva ROC, matriz de confusión, etc.
Archivos generados en artifacts/:
model.pkl- El modelo entrenado y serializado.roc_curve.png- Curva ROC del modelo.confusion_matrix.png- Matriz de confusión en el set de prueba.
- Endpoints:
health,model/info,features,predict(individual y batch), yvisualizations. - Validación robusta de datos de entrada.
- Cálculo de contribución de features para cada predicción.
- Logging para seguimiento y depuración.
- Navegación por pestañas: Inicio, Predicción, Análisis del Dataset y Rendimiento del Modelo.
- Dashboard de resultados con medidor de confianza y factores clave.
- Visualizaciones interactivas con Plotly para explorar el dataset y el modelo.
- Diseño profesional y responsivo con CSS personalizado.
- ML: scikit-learn, pandas, numpy
- Backend: Flask, Flask-CORS
- Frontend: Streamlit, Plotly, Altair
- Visualización: matplotlib, seaborn
- CI/CD: GitHub Actions
- Cloud: Google Cloud Run, Google Artifact Registry
- Testing: requests, pytest
- Utilidades: joblib, json
- 🩺 Médicos: Herramienta de apoyo diagnóstico
- 🎓 Estudiantes: Aprender ML aplicado
- 👨💻 Desarrolladores: Plantilla para proyectos de ML
- 🔬 Investigadores: Análisis de features biomédicas
El modelo optimizado típicamente alcanza:
- Accuracy: >95%
- ROC-AUC: >98%
- Tiempo de predicción: <100ms
- Memoria: <50MB
¡Las contribuciones para mejorar este proyecto son bienvenidas!
Posibles extensiones:
- 🧠 Explicabilidad Avanzada: Integrar librerías como SHAP para generar visualizaciones de contribución más detalladas por predicción.
- 🎨 Mejoras en la UI/UX: Añadir temas, mejorar la responsividad o incorporar nuevos tipos de gráficos.
- 📊 Monitoreo del Modelo: Integrar la API con Vertex AI Model Monitoring para detectar data drift y concept drift en producción, registrando predicciones en BigQuery.
- 🗄️ Historial de Predicciones: Añadir una base de datos (como SQLite o PostgreSQL) para guardar y consultar predicciones pasadas.
Si encuentras algún problema al ejecutar el proyecto localmente, sigue estos pasos:
-
Asegúrate de usar el script
start.sh: Este script garantiza que el entorno se limpie y se construya en el orden correcto. Es la forma recomendada de iniciar la aplicación. -
Revisar los Logs de Docker: Si un servicio no se inicia o se comporta de forma extraña, los logs son tu mejor amigo. Abre una nueva terminal y ejecuta:
# Para ver los logs de la API docker-compose logs api # Para ver los logs del frontend docker-compose logs frontend
-
Reconstrucción Forzada: Si has hecho cambios en el código y no se reflejan, es posible que necesites forzar una reconstrucción. El script
start.shya lo hace, pero si quieres hacerlo manualmente:docker-compose build --no-cache
-
Abrir un Issue: Si el problema persiste, la mejor manera de reportarlo es creando un "Issue" en el repositorio de GitHub. Por favor, incluye la salida de los logs y los pasos que seguiste.
Este proyecto utiliza un pipeline de Integración Continua y Despliegue Continuo (CI/CD) para automatizar todo el ciclo de vida de la aplicación.
- Activación: El flujo de trabajo se activa con cada
pusha la ramamain. - Entrenamiento y Pruebas: Se ejecuta el script de entrenamiento para generar los artefactos del modelo y se realizan pruebas de integración contra la API.
- Construcción de Imágenes: Se construyen las imágenes de Docker para la API y el frontend.
- Publicación: Las imágenes se etiquetan y se suben a Google Artifact Registry.
- Despliegue: Se despliegan las nuevas versiones de los servicios en Google Cloud Run, actualizando la aplicación sin tiempo de inactividad.
El pipeline está preparado para desplegar automáticamente en Google Cloud usando Workload Identity Federation, un método seguro que no requiere claves de servicio de larga duración.
Pasos a seguir en Google Cloud (Resumen):
-
Crear un Proyecto y Habilitar APIs:
- Crea un nuevo proyecto en la Consola de Google Cloud.
- Habilita las siguientes APIs:
Cloud Run API,Artifact Registry API, yIAM Credentials API.
-
Crear Repositorios en Artifact Registry:
- Crea dos repositorios de tipo Docker en Artifact Registry: uno llamado
api-repoy otrofrontend-repo.
- Crea dos repositorios de tipo Docker en Artifact Registry: uno llamado
-
Configurar la Identidad para el Pipeline:
- Crea una Cuenta de Servicio (Service Account), por ejemplo,
github-actions-deployer. - Otorga los roles necesarios a esta cuenta de servicio:
Cloud Run Admin,Artifact Registry Writer, yService Account User. - Crea un Workload Identity Pool y un Provider. Configura el proveedor para que confíe en tu repositorio de GitHub.
- Vincula la Cuenta de Servicio a la identidad de GitHub, otorgándole el rol
Workload Identity User. Esto permite que GitHub Actions actúe en nombre de tu cuenta de servicio de forma segura.
- Crea una Cuenta de Servicio (Service Account), por ejemplo,
Pasos a seguir en GitHub:
-
Configurar los Secretos: Ve a
Settings > Secrets and variables > Actionsen tu repositorio y añade los siguientes secretos, que obtuviste de los pasos anteriores en Google Cloud:GCP_PROJECT_IDGCP_WORKLOAD_IDENTITY_PROVIDERGCP_SERVICE_ACCOUNT
-
Activar el Job de Despliegue: Por defecto, el job
deployestá comentado en.github/workflows/ci-cd.ymlpara evitar ejecuciones fallidas en un repositorio nuevo. Para habilitar el despliegue automático, simplemente descomenta esa sección en el archivo. A partir de ese momento, cadapushamaindesplegará la aplicación en la nube.
- No debe usarse para diagnósticos médicos reales
- Siempre consultar con profesionales médicos
- Los resultados son para fines de aprendizaje únicamente
Este proyecto demuestra un pipeline completo de ML desde el entrenamiento hasta el deployment, con todas las mejores prácticas incluidas. ¡Perfecto para aprender y expandir! 🚀