Proyecto de Machine Learning para clasificación multiclase del tipo de incontinencia urinaria en mujeres adultas, desarrollado a partir del dataset NHANES (CDC, 2017–2023).
Aviso: Esta herramienta es de uso académico e informativo. No sustituye el diagnóstico médico profesional.
La incontinencia urinaria (UI) afecta a 1 de cada 3 mujeres adultas a nivel mundial, pero figura entre los trastornos de salud más subdiagnosticados en medicina primaria. Este proyecto propone una aplicación web que funciona como un checklist de síntomas inteligente: la usuaria selecciona sus síntomas, el modelo predice el tipo de incontinencia más probable y orienta hacia el tipo de intervención adecuado.
El objetivo no es sustituir al médico, sino reducir la barrera de entrada y que la mujer llegue a la consulta con información clara.
Desarrollar un modelo de clasificación multiclase capaz de predecir el tipo de incontinencia urinaria a partir de variables demográficas, clínicas y de síntomas autorreportados, utilizando un ensemble de votación suave (soft voting) que combina XGBoost, Random Forest y LightGBM, ponderado por F1-macro en validación cruzada.
Fuente: NHANES (National Health and Nutrition Examination Survey) — CDC, ciclos 2017–2023.
| Característica | Valor |
|---|---|
| Registros | 9.074 mujeres adultas |
| Variables originales | 27 |
| Variables tras ETL | 24 |
| Valores nulos tras limpieza | 0 |
| Clase | Descripción | N | Proporción |
|---|---|---|---|
none |
Sin incontinencia | 4.857 | 53,5 % |
mixed |
Incontinencia mixta (esfuerzo + urgencia) | 1.642 | 18,1 % |
stress |
Incontinencia de esfuerzo | 1.586 | 17,5 % |
urge |
Incontinencia de urgencia (incluye other) |
989 | 10,9 % |
La clase original
other(n=57) fue fusionada conurgepor criterio clínico. Ver docs/etl_report.md para más detalles.
┌─────────────┐ ┌─────────────────┐ ┌─────────────┐
│ XGBoost │ │ Random Forest │ │ LightGBM │
│ Classifier │ │ Classifier │ │ Classifier │
└──────┬──────┘ └────────┬────────┘ └──────┬──────┘
│ │ │
└───────────┬───────┘────────────────────┘
│
┌──────────▼──────────┐
│ Soft Voting │
│ (pesos por F1-macro│
│ en CV) │
└──────────┬──────────┘
│
┌──────▼──────┐
│ Predicción │
│ final │
└─────────────┘
- Cada modelo individual se entrena con SMOTE dentro de un
ImbPipelinepara manejar el desbalanceo de clases. - Los hiperparámetros se optimizan con Optuna + validación cruzada estratificada (
StratifiedKFold, k=5). - El ensemble final utiliza
VotingClassifier(voting='soft')con pesos proporcionales al F1-macro de cada modelo en CV.
Proyecto7_Equipo3_Multiclase/
├── app/ # Paquete de la app Streamlit
│ ├── ___init___.py
│ └── styles.css # Estilos CSS personalizados
├── assets/ # Gráficos generados (EDA, matrices de confusión, etc.)
├── data/
│ ├── raw/ # Dataset original (nhanes_ui_women.csv)
│ └── processed/ # Datos limpios y splits train/test
├── docs/
│ ├── data_raw_dictionary.md # Diccionario de variables originales
│ ├── data_processed_dictionary.md # Diccionario de variables procesadas
│ └── etl_report.md # Reporte de decisiones ETL
├── models/ # Modelos serializados (.pkl)
│ ├── pipeline.pkl # Pipeline de preprocesamiento
│ ├── cv_config.pkl # Configuración de validación cruzada
│ └── random_forest.pkl # Modelo Random Forest
├── notebooks/
│ ├── 00_eda_etl.ipynb # Exploración de datos y ETL
│ ├── 01_pipeline.ipynb # Pipeline de preprocesamiento
│ ├── 02_random_forest.ipynb # Entrenamiento Random Forest
│ ├── 03_lightgbm.ipynb # Entrenamiento LightGBM
│ ├── 04_xgboost.ipynb # Entrenamiento XGBoost
│ ├── 05_ensemble.ipynb # Ensemble (Soft Voting)
│ └── modeling/ # Notebooks individuales del equipo
├── src/
│ └── db.py # Integración con Supabase
├── app.py # Punto de entrada de la app Streamlit
├── pyproject.toml # Dependencias y configuración del proyecto
├── uv.lock # Lockfile de dependencias
└── README.md
- Python 3.11+
- uv (gestor de paquetes)
# 1. Clonar el repositorio
git clone https://github.com/Bootcamp-IA-P6/Proyecto7_Equipo3_Multiclase.git
cd Proyecto7_Equipo3_Multiclase
# 2. Crear el entorno virtual e instalar dependencias
uv sync
# 3. Activar el entorno virtual
source .venv/bin/activateCrear un archivo .env en la raíz del proyecto con las credenciales de Supabase:
SUPABASE_URL=https://tu-proyecto.supabase.co
SUPABASE_KEY=tu-clave-anonuv run streamlit run app.pyuv run jupyter notebook| Categoría | Tecnologías |
|---|---|
| Lenguaje | Python 3.11+ |
| ML | scikit-learn, XGBoost, LightGBM, SMOTE |
| Optimización | Optuna |
| App | Streamlit |
| Base de datos | Supabase |
| Gestión de paquetes | uv |
| Notebooks | Jupyter |
- Docker instalado
- Docker Compose instalado
- Archivo
.envcon las variables de entorno de Supabase (ver.env.example)
Crea un archivo .env en la raiz del proyecto con las siguientes variables:
SUPABASE_URL=https://tu-proyecto.supabase.co
SUPABASE_KEY=tu-anon-keydocker build -t ui-classifier .# Levantar el servicio
docker compose up --build
# Levantar en segundo plano
docker compose up --build -d
# Ver logs
docker compose logs -f
# Parar el servicio
docker compose down# Construir
docker build -t ui-classifier .
# Ejecutar
docker run -p 8501:8501 --env-file .env ui-classifierUna vez levantado el contenedor, abre el navegador en:
http://localhost:8501
proyecto/
├── Dockerfile # Imagen de la app
├── .dockerignore # Archivos excluidos del contenedor
├── docker-compose.yml # Orquestacion del servicio
└── .env # Variables de entorno (NO subir a Git)
| Nombre | Rol |
|---|---|
| Isa | Scrum Master |
| Iris | Product Owner |
| Maryori | Data analyst |
| Gabriela | Data analyst |
| Camila | Data analyst |
Proyecto desarrollado en el bootcamp de IA de Factoria F5.