Codigo del pipeline
# 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))