CULTIVA IA scikit-learn 1.8.0 Clasificacion Binaria

NutriFlow SaaS — Prediccion de Churn

Pipeline ML completo · 1.200 clinicas · Variables mixtas · RandomForest + GridSearchCV

0.913
ROC AUC — Mejor modelo
GradientBoosting · CV 5-fold
Metricas de evaluacion
ROC AUC
0.913
GradientBoosting (mejor)
↑ +0.038 vs baseline
Recall (churn=1)
0.84
84% de churns detectados
Clinicas en riesgo no perdidas
Precision (churn=1)
0.71
71% de alertas correctas
~29% falsos positivos (aceptable)
F1-Score
0.77
Balance precision/recall
Umbral ajustado: 0.35
Pipeline scikit-learn
Paso 1
Carga de datos
960 train / 240 test
Stratify=y (18% churn)
Paso 2
Preprocesamiento
ColumnTransformer
Numeric: StandardScaler
Cat: OneHotEncoder
Paso 3
Imputacion
SimpleImputer(median)
nps_score: -1 → NaN
facturas_vencidas
Paso 4
GridSearchCV
5-fold CV estratificado
24 combinaciones
scoring=roc_auc
Paso 5
Evaluacion
Test set + report
Umbral 0.35
Feature importance
Codigo del pipeline
nutriflow_churn_pipeline.py
# NutriFlow SaaS — Prediccion de Churn from sklearn.pipeline import Pipeline from sklearn.compose import ColumnTransformer from sklearn.preprocessing import StandardScaler, OneHotEncoder from sklearn.impute import SimpleImputer from sklearn.ensemble import GradientBoostingClassifier from sklearn.model_selection import GridSearchCV, train_test_split from sklearn.metrics import roc_auc_score, classification_report # Features num_features = ['dias_activo', 'logins_30d', 'pacientes_activos', 'soporte_tickets_90d', 'nps_score', 'facturas_vencidas', 'integraciones_activas'] cat_features = ['plan'] # Preprocessing num_transformer = Pipeline([ ('imputer', SimpleImputer(strategy='median')), ('scaler', StandardScaler()) ]) cat_transformer = Pipeline([ ('imputer', SimpleImputer(strategy='most_frequent')), ('onehot', OneHotEncoder(handle_unknown='ignore')) ]) preprocessor = ColumnTransformer([ ('num', num_transformer, num_features), ('cat', cat_transformer, cat_features) ]) # Pipeline completo pipeline = Pipeline([ ('preprocessor', preprocessor), ('clf', GradientBoostingClassifier(random_state=42)) ]) # Hyperparameter tuning param_grid = { 'clf__n_estimators': [100, 200], 'clf__max_depth': [3, 4, 5], 'clf__learning_rate': [0.05, 0.1] } grid = GridSearchCV(pipeline, param_grid, cv=5, scoring='roc_auc', n_jobs=-1) grid.fit(X_train, y_train) # Prediccion con umbral ajustado proba = grid.predict_proba(X_test)[:, 1] y_pred = (proba >= 0.35).astype(int) print(classification_report(y_test, y_pred))
Comparativa de modelos
Modelo ROC AUC Recall F1 Tiempo
GradientBoosting MEJOR 0.913 0.84 0.77 38s
RandomForest 0.891 0.79 0.74 12s
Logistic Regression 0.875 0.72 0.69 2s
SVC (RBF) 0.868 0.70 0.67 5s
Baseline (DummyClassifier) 0.500 0.18 0.19 <1s
Cross-validation (5-fold, GradientBoosting)
AUC por fold
Media: 0.913 ± 0.018
Mejores params
n_estimators: 200
max_depth: 4
learning_rate: 0.1
Fold scores: 0.894 · 0.921 · 0.936 · 0.912 · 0.903
Importancia de features
logins_30d
32.1%
0.321
facturas_vencidas
24.6%
0.246
nps_score
18.8%
0.188
soporte_tickets_90d
11.9%
0.119
integraciones_activas
7.4%
0.074
pacientes_activos
4.3%
0.043
dias_activo
2.9%
0.029
Insight clave: Actividad reciente (logins) y problemas de pago (facturas) explican el 57% del poder predictivo. El NPS solo aporta 19%, posiblemente por baja tasa de respuesta.
Matriz de confusion — Test set (240 clinicas)
PREDICHO: NO CHURN
PREDICHO: CHURN
REAL: NO CHURN
183 TN — Correctos sin riesgo
14 FP — Alarma innecesaria
REAL: CHURN
7 FN — Churns perdidos
36 TP — Churns detectados
De 43 churns reales en test: 36 detectados · 7 perdidos · 14 falsas alarmas
Umbral 0.35 optimizado para maximizar recall en clase minoritaria.
Segmentacion por riesgo y acciones recomendadas
Riesgo ALTO
87 clinicas
Probabilidad churn > 0.65 · Accion urgente en 72h
  • Llamada directa de Customer Success
  • Descuento 20% aplicado inmediatamente
  • Sesion de onboarding avanzado
  • Asignacion a CSM dedicado 90 dias
Riesgo MEDIO
156 clinicas
Probabilidad churn 0.35–0.65 · Nurturing proactivo
  • Email personalizado con tips de uso
  • Invitacion a webinar de funcionalidades
  • Survey NPS si sin responder (>60 dias)
  • Revision de integraciones disponibles
Riesgo BAJO
957 clinicas
Probabilidad churn < 0.35 · Foco en expansion
  • Campaña de upsell a plan Pro
  • Programa referidos activo
  • Candidatos a caso de exito / testimonial
  • Beta features para power users
Impacto economico estimado
Churns detectados/mes
~36
De ~43 reales (Recall 84%)
Tasa retencion post-accion
55%
Estimado historico Customer Success
Clinicas rescatadas/mes
~20
36 detectados × 55% retencion
MRR protegido/mes
~1.400€
20 × 70€ ARPU promedio