Este proyecto implementa un modelo de machine learning para predecir si un cliente abandonará el servicio (churn). Utiliza un pipeline de procesamiento de datos con scikit-learn, un modelo de RandomForestClassifier y una API desarrollada con FastAPI para servir predicciones.
mlops_project/
├── .github/
│ └── workflows/
│ └── main.yml # Workflow CI/CD para entrenamiento, build y despliegue
├── data/
│ └── WA_Fn-UseC_-Telco-Customer-Churn.csv # Dataset original (solo lectura)
├── models/
│ ├── churn_model.joblib # Modelo entrenado
│ ├── encoder.joblib # Preprocesador ColumnTransformer
│ └── expected_columns.joblib # Columnas esperadas para predicción
├── src/
│ ├── app.py # API con FastAPI para predicción
│ ├── train_model.py # Script de entrenamiento y reentrenamiento
│ └── app_ui.py.py # app de ejecucion de streamlit
├── .dockerignore # Archivos/carpetas excluidos del build Docker
├── .gitignore # Archivos/carpetas excluidos de Git
├── Dockerfile # Multistage build para la API
├── requirements.txt # Dependencias de producción
├── requirements-dev.txt # Dependencias de desarrollo (notebooks, tests)
└── README.md # Documentación del proyecto
Instalar las dependencias con el siguiente comando:
pip install -r requirements.txtPara entrenar el modelo y guardar los artefactos generados, ejecuta el siguiente comando:
python train_model.pyEste script realizará las siguientes acciones:
- Limpia y transforma los datos.
- Entrena un modelo utilizando validación cruzada (GridSearchCV).
- Guarda el modelo entrenado (
churn_model.joblib), el preprocesador (encoder.joblib) y las columnas esperadas (expected_columns.joblib). - Genera reportes de clasificación y un gráfico de importancia de variables.
Para ejecutar la API, utiliza el siguiente comando:
uvicorn app:app --reloadLa API tiene el siguiente endpoint para realizar predicciones:
POST /api/v1/predict-churn
Envía una solicitud con el siguiente formato de entrada:
{
"gender": "Female",
"SeniorCitizen": 0,
"Partner": "Yes",
"Dependents": "No",
"tenure": 5,
"PhoneService": "Yes",
"MultipleLines": "No",
"InternetService": "DSL",
"OnlineSecurity": "Yes",
"OnlineBackup": "No",
"DeviceProtection": "Yes",
"TechSupport": "No",
"StreamingTV": "No",
"StreamingMovies": "Yes",
"Contract": "Month-to-month",
"PaperlessBilling": "Yes",
"PaymentMethod": "Electronic check",
"MonthlyCharges": 70.35,
"TotalCharges": 350.5
}La respuesta será algo similar a esto:
{
"prediction": "Cliente propenso a Churn",
"probabilidad_churn": "78.21%"
}- Python 3.10+
scikit-learnpandas,numpyFastAPIUvicornjoblibmatplotlib
- El preprocesamiento de variables categóricas se realiza con
OneHotEncoderdentro de un pipeline deColumnTransformer, lo que asegura la consistencia entre entrenamiento y predicción. - Las columnas del input deben coincidir en nombre y orden con las esperadas por el modelo. Esto se controla con el archivo
expected_columns.joblib.
La API de predicción está desplegada y accesible en la siguiente URL, donde puedes consultar la documentación interactiva de los endpoints disponibles:
David Siles — LinkedIn