best_solver = mejor[“params”][“solver”]
final_pipe = Tubería ([
(“scaler”, StandardScaler()),
(“clf”, LogisticRegression(
C=best_C,
solver=best_solver,
penalty=”l2″,
max_iter=2000,
random_state=42
))
]) con mlflow.start_run(run_name=”final_model_run”) como final_run: final_pipe.fit(X_train, y_train) proba = final_pipe.predict_proba(X_test)[:, 1]
pred = (proba >= 0.5).astype(int) metrics = { “test_auc”: float(roc_auc_score(y_test, proba)), “test_accuracy”: float(accuracy_score(y_test, pred)), “test_precision”: float(precision_score(y_test, pred, zero_division=0)), “test_recall”: float(recall_score(y_test, pred, zero_division=0)), “test_f1”: float(f1_score(y_test, pred, zero_division=0)), } mlflow.log_metrics(metrics) mlflow.log_params({“C”: best_C, “solver”: best_solver, “model”: “LogisticRegression+StandardScaler”}) input_example = X_test.iloc[:5].copy() firma = infer_signature(input_example, final_pipe.predict_proba(input_example)[:, 1]) model_info = mlflow.sklearn.log_model( sk_model=final_pipe, artefacto_path=”modelo”, firma=firma, input_example=input_example, registrar_model_name=Ninguno, ) print(“Final run_id:”, final_run.info.run_id) print(“URI del modelo registrado:”, model_info.model_uri) eval_df = X_test.copy() evaluación_df[“label”] = y_test.values eval_result = mlflow.models.evaluate( model=model_info.model_uri, data=eval_df, target=”label”, model_type=”classifier”, evaluators=”default”, ) eval_summary = { “metrics”: {k: float(v) if isinstance(v, (int, float, np.floating)) else str(v) for k, v in eval_result.metrics.items()}, “artefactos”: {k: str(v) para k, v en eval_result.artifacts.items()}, } mlflow.log_dict(eval_summary, “evaluación/eval_summary.json”)