MLOps Pipeline para Clasificación de Documentos en Español
Project description
PROYECTO-MLOPS: Clasificación de Documentos en Español
📋 Descripción
Sistema MLOps completo para clasificación automática de documentos en español implementando todas las fases del ciclo CRISP-DM (Cross Industry Standard Process for Data Mining).
✨ Características
- ✅ Estructura CRISP-DM Completa: 6 fases separadas en módulos Python
- ✅ Paquete Publicable: Disponible en PyPI
- ✅ Containerizado: Docker image lista para producción
- ✅ CI/CD Automatizado: GitHub Actions workflows (test, Docker, PyPI, model registry)
- ✅ Versionado de Modelos: Registro automático de versiones y promoción a producción
- ✅ Evaluación Integral: Fairness, latencia, drift detection
- ✅ Documentación: Reportes CRISP-DM y presentación de negocio
🎯 Valor de Negocio
| Métrica | Mejora |
|---|---|
| Tiempo de procesamiento | 900-1800x más rápido |
| Escalabilidad | 1000x (100→100,000 docs/día) |
| Costo por documento | 99.8% reducción |
| Disponibilidad | 24/7 (vs 8h/día) |
| ROI Año 1 | 636% |
| Payback Period | 2 meses |
🚀 Inicio Rápido
Instalación
# Opción 1: Desde PyPI
pip install proyecto-mlops
# Opción 2: Desarrollo local
git clone https://github.com/angelcast2002/PROYECTO-MLOPS.git
cd PROYECTO-MLOPS
pip install -e ".[dev]"
Uso Básico
from proyecto_mlops import (
load_raw_dataset,
preprocess_dataframe,
train_model,
full_evaluation,
promote_to_production
)
# 1. Cargar datos
df = load_raw_dataset("data/raw/dataset.csv")
# 2. Preprocesar
df_clean = preprocess_dataframe(df)
# 3. Entrenar modelo
texts = df_clean["text_norm"].tolist()
labels = df_clean["label"].tolist()
pipe, metrics = train_model(texts, labels)
# 4. Evaluar
eval_result = full_evaluation(pipe, texts_test, labels_test)
# 5. Desplegar
promote_to_production(version=1)
Ejecutar Pipeline Completo
# CLI
python cli.py all
# Modo rápido (testing)
python cli.py all --fast 1000
# Docker
docker build -t proyecto-mlops:latest .
docker run -v $(pwd)/data:/app/data proyecto-mlops:latest
📦 Estructura del Proyecto
PROYECTO-MLOPS/
├── proyecto_mlops/ # Paquete principal (publicable)
│ ├── __init__.py
│ ├── business_understanding/ # Fase 1: Objetivos de negocio
│ ├── data_understanding/ # Fase 2: Exploración de datos
│ ├── data_preparation/ # Fase 3: Preprocesamiento
│ ├── modeling/ # Fase 4: Entrenamiento
│ ├── evaluation/ # Fase 5: Evaluación
│ ├── deployment/ # Fase 6: Despliegue
│ └── utils/ # Utilidades compartidas
│
├── .github/workflows/ # CI/CD Automation
│ ├── ci.yml # Tests + Quality checks
│ ├── cd-docker.yml # Docker build & push
│ ├── cd-pypi.yml # PyPI publishing
│ └── cd-model-registry.yml # Model versioning
│
├── data/
│ ├── raw/ # Datos originales
│ ├── processed/ # Datos preprocesados
│ └── registry/ # Versionado de datos
│
├── models/ # Modelos entrenados
├── tests/ # Tests unitarios
├── docs/ # Documentación
│
├── Dockerfile # Containerización
├── setup.py # Configuración del paquete
├── requirements.txt # Dependencias
├── cli.py # CLI principal
├── pipeline.py # Pipeline monolítico (legacy)
├── config.yaml # Configuración
│
├── CRISP_DM_REPORT.md # Reporte técnico completo
├── BUSINESS_PRESENTATION.md # Presentación de negocio
└── README.md # Este archivo
🔄 Ciclo CRISP-DM
1. Business Understanding 🎯
Definición de objetivos de negocio, problemas, y criterios de éxito.
Ubicación: proyecto_mlops/business_understanding/
from proyecto_mlops import save_business_document
save_business_document()
2. Data Understanding 📊
Exploración, validación y esquematización de datos.
Ubicación: proyecto_mlops/data_understanding/
from proyecto_mlops import (
load_raw_dataset,
explore_data,
save_data_schema,
validate_schema
)
df = load_raw_dataset()
exploration = explore_data(df)
schema = save_data_schema()
Outputs:
data/data_exploration_report.jsondocs/data_schema.json
3. Data Preparation 🧹
Preprocesamiento: normalización, tokenización, limpieza, stemming.
Ubicación: proyecto_mlops/data_preparation/
from proyecto_mlops import prepare_data_pipeline
df_clean = prepare_data_pipeline(
csv_path="data/raw/dataset.csv",
use_lemmatization=False
)
Transformaciones:
- Normalización Unicode (lowercase, acentos)
- Tokenización (regex)
- Limpieza (stopwords, dígitos)
- Stemming (Snowball Spanish)
Output: data/processed/preprocesado.parquet
4. Modeling 🤖
Entrenamiento de clasificador con TF-IDF + LinearSVC.
Ubicación: proyecto_mlops/modeling/
from proyecto_mlops import (
train_model,
cross_validate_model,
hyperparameter_sweep
)
# Holdout validation
pipe, metrics = train_model(texts, labels)
# Cross-validation (5-fold)
cv_result = cross_validate_model(texts, labels)
# Hyperparameter sweep
results = hyperparameter_sweep(
texts, labels,
param_grid=[
{"min_df": 1, "C": 0.1},
{"min_df": 2, "C": 1.0},
{"min_df": 3, "C": 10.0}
]
)
Configuración:
- Vectorización: TF-IDF (1,2)-grams
- Clasificador: LinearSVC (C=1.0)
- Validación: 5-Fold StratifiedKFold
5. Evaluation 📈
Métricas de rendimiento, fairness, latencia.
Ubicación: proyecto_mlops/evaluation/
from proyecto_mlops import (
evaluate_model,
measure_latency,
check_fairness,
full_evaluation
)
# Evaluación completa
eval_result = full_evaluation(
pipe=pipe,
X_test=X_test,
y_test=y_test,
min_f1_per_class=0.70
)
Métricas:
- Accuracy, F1-Macro, F1-Weighted
- Latencia: P50, P95, P99
- Fairness: F1 mínima por clase ≥ 0.70
6. Deployment 🚀
Registro, versionado, y promoción de modelos.
Ubicación: proyecto_mlops/deployment/
from proyecto_mlops import (
register_model_in_registry,
promote_to_production,
get_production_model,
create_deployment_package
)
# Registrar modelo
register_model_in_registry(
model_path="models/svm_tfidf_v1.joblib",
model_name="svm_tfidf",
version=1,
metrics=eval_result
)
# Promover a producción
promote_to_production(version=1)
# Crear paquete de deployment
package = create_deployment_package(
model_path="models/svm_tfidf_v1.joblib"
)
📊 Métricas y Resultados
Performance
| Métrica | Valor | Target |
|---|---|---|
| Accuracy | 0.82 | ≥ 0.80 ✅ |
| F1-Macro | 0.78 | ≥ 0.75 ✅ |
| F1-Weighted | 0.81 | ≥ 0.75 ✅ |
Latencia
| Percentil | Tiempo | SLA |
|---|---|---|
| P50 | 45ms | - |
| P95 | 180ms | ≤ 200ms ✅ |
| P99 | 220ms | - |
Fairness
| Clase | F1-Score | Status |
|---|---|---|
| Clase A | 0.76 | ✅ |
| Clase B | 0.79 | ✅ |
| Clase C | 0.72 | ✅ |
🔄 CI/CD Pipelines
GitHub Actions Workflows
1. CI Pipeline (.github/workflows/ci.yml)
Ejecuta en cada push/PR:
- ✅ Tests unitarios (
pytest) - ✅ Code quality (
black,isort,flake8) - ✅ Security scan (
Trivy) - ✅ Coverage reports (
codecov)
2. Docker CD (.github/workflows/cd-docker.yml)
Ejecuta en push a main:
- ✅ Build imagen Docker
- ✅ Push a Docker Hub (
docker.io/angelcast2002/proyecto-mlops) - ✅ Tagged con versión + latest
3. PyPI CD (.github/workflows/cd-pypi.yml)
Ejecuta en tag v*:
- ✅ Build paquete Python
- ✅ Publish a TestPyPI (testing)
- ✅ Publish a PyPI (production)
- ✅ Create GitHub Release
4. Model Registry (.github/workflows/cd-model-registry.yml)
Ejecuta después de CI exitoso:
- ✅ Run full pipeline
- ✅ Generate model metadata
- ✅ Upload artifacts (30 días retención)
- ✅ Update registry
🐳 Docker
Build
docker build -t proyecto-mlops:latest .
Run
# Con volumen de datos
docker run -v $(pwd)/data:/app/data \
-p 8000:8000 \
proyecto-mlops:latest
# Con archivo de configuración
docker run -v $(pwd)/config.yaml:/app/config.yaml \
proyecto-mlops:latest \
python cli.py all
Push a Docker Hub
docker tag proyecto-mlops:latest angelcast2002/proyecto-mlops:latest
docker push angelcast2002/proyecto-mlops:latest
Disponible en
docker pull angelcast2002/proyecto-mlops:latest
docker pull angelcast2002/proyecto-mlops:0.1.0
📦 Instalación desde PyPI
Desde PyPI
pip install proyecto-mlops
Desde TestPyPI
pip install --index-url https://test.pypi.org/simple/ proyecto-mlops
Con extras
# Desarrollo
pip install proyecto-mlops[dev]
# Docker support
pip install proyecto-mlops[docker]
📝 Documentación
Documentos Disponibles
-
CRISP_DM_REPORT.md(Este proyecto)- Reporte técnico completo de todas las fases CRISP-DM
- Resultados, conclusiones y escalabilidad
- 15+ páginas
-
BUSINESS_PRESENTATION.md- Presentación enfocada en valor de negocio
- ROI, timeline, riesgos
- Lenguaje ejecutivo (no técnico)
-
README.md- Guía de instalación y uso
- Estructura del proyecto
- Quick start
Generar Documentación
from proyecto_mlops import save_business_document, save_data_schema
from proyecto_mlops import save_data_exploration
# Business
save_business_document()
# Data
save_data_schema()
save_data_exploration()
🧪 Testing
# Instalar test dependencies
pip install pytest pytest-cov
# Ejecutar tests
pytest tests/ -v
# Con coverage
pytest tests/ --cov=proyecto_mlops --cov-report=html
📊 Monitoreo en Producción
Métricas a Trackear
metrics = {
"predictions_per_minute": 120,
"avg_latency_ms": 45,
"p95_latency_ms": 180,
"error_rate": 0.01,
"drift_psi": 0.05,
"model_accuracy": 0.82
}
Alertas Recomendadas
- ⚠️ P95 latency > 300ms
- ⚠️ Error rate > 5%
- ⚠️ PSI (drift) > 0.2
- ⚠️ Accuracy drop > 10%
🔐 Configuración de Secrets en GitHub
Para CI/CD completo, configura estos secrets:
DOCKER_USERNAME # Docker Hub username
DOCKER_PASSWORD # Docker Hub access token
PYPI_API_TOKEN # PyPI API token
TEST_PYPI_API_TOKEN # TestPyPI API token
Ubicación: GitHub → Settings → Secrets and variables → Actions
🎓 Temas Cubiertos
Temas MLOps
- ✅ Versionado de código y datos
- ✅ Versionado de modelos
- ✅ Reproducibilidad
- ✅ CI/CD automation
- ✅ Containerización
- ✅ Infrastructure as Code
- ✅ Monitoring y alerting
- ✅ Model registry
- ✅ Deployment automation
Temas ML
- ✅ Preprocesamiento de texto
- ✅ Feature engineering (TF-IDF)
- ✅ Clasificación (LinearSVC)
- ✅ Cross-validation
- ✅ Hyperparameter tuning
- ✅ Fairness y equidad
- ✅ Latency optimization
- ✅ Drift detection
Temas DevOps
- ✅ Docker
- ✅ GitHub Actions
- ✅ Package distribution (PyPI)
- ✅ CI/CD workflows
- ✅ Security scanning
🎯 Próximos Pasos
Corto Plazo
- Desplegar en servidor de staging
- Integrar FastAPI para inferencia
- Configurar Prometheus + Grafana
Mediano Plazo
- Kubernetes deployment
- Auto-scaling y load balancing
- Advanced monitoring
Largo Plazo
- A/B testing y canary deployments
- Active learning loop
- Multi-model serving
👥 Contribuciones
Pull requests son bienvenidos. Para cambios mayores, abre un issue primero.
📄 Licencia
MIT License - ver LICENSE file
📞 Contacto
Autor: Angel Castillo
Email: angelcast2002@gmail.com
GitHub: @angelcast2002
🔗 Enlaces
| Recurso | Link |
|---|---|
| 📦 PyPI Package | https://pypi.org/project/proyecto-mlops/ |
| 🐳 Docker Hub | https://hub.docker.com/r/angelcast2002/proyecto-mlops |
| 📊 Repository | https://github.com/angelcast2002/PROYECTO-MLOPS |
| 🚀 Releases | https://github.com/angelcast2002/PROYECTO-MLOPS/releases |
| ⚙️ GitHub Actions | https://github.com/angelcast2002/PROYECTO-MLOPS/actions |
Última actualización: Noviembre 3, 2025
Versión: 0.1.0
Estado: ✅ Producción Ready
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file proyecto_mlops-0.1.6.tar.gz.
File metadata
- Download URL: proyecto_mlops-0.1.6.tar.gz
- Upload date:
- Size: 26.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9daa52d3a9ceed345d63f5a398e84f7cba71e7e645b76320a0057c331b518a80
|
|
| MD5 |
2503294856e98bbf7f18b2c92892feb7
|
|
| BLAKE2b-256 |
4f3fbf01eb2f11280b2e9e20d2e5d8dee3b34974ccf809e1b56b60e1243c458d
|
File details
Details for the file proyecto_mlops-0.1.6-py3-none-any.whl.
File metadata
- Download URL: proyecto_mlops-0.1.6-py3-none-any.whl
- Upload date:
- Size: 23.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
384b97f4021d573203ee5d61f3c245fe9ea5047f9adb49912cede9e43bde6b13
|
|
| MD5 |
d201f086fca1185ebd2a1676801f2a87
|
|
| BLAKE2b-256 |
9ddfea6fc77fa3dfa2420545b07a2f4c49a6723667e61db8541b59fa94e07b27
|