--- license: apache-2.0 library_name: sklearn pipeline_tag: tabular-classification tags: - logistic-regression - credit-risk - loan-default - tabular - binary-classification --- # loan-default-prediction - Regresion Logistica Modelo de **clasificacion binaria** de riesgo de *default* de prestamos. Modelo ganador (vs XGBoost) por interpretabilidad y costo esperado. ## Uso previsto Apoyar la decision de originacion de credito: si la probabilidad de default supera el **umbral de decision (0.816)**, se recomienda **pedir garantia adicional**. Prioridad de negocio: evitar falsos positivos (no molestar a buenos pagadores). ## Metricas en el punto de operacion (test, umbral 0.816) | Metrica | Valor | |---|---| | Precision (default) | 0.968 | | Recall (default) | 0.769 | | F1 (default) | 0.857 | | PR-AUC | 0.938 | | ROC-AUC | 0.980 | | Costo esperado (3:1) | 12 | Criterio de negocio: precision >= 0.70 y recall >= 0.40 -> **CUMPLE**. Matriz de confusion (test=200): TN=160, FP=1, FN=9, TP=30. ## Coeficientes (log-odds) | Feature | Coef | |---|---| | `age` | -1.0153 | | `credit_score` | -4.9988 | | `dependents` | +3.9956 | | `income` | -2.2871 | | `home_owner` | -2.8181 | (Features estandarizadas; signo negativo = mayor valor reduce el riesgo de default.) ## Datos de entrenamiento - Fuente: [`gusdelact/loan_default_prediction`](https://huggingface.co/datasets/gusdelact/loan_default_prediction) - Dataset curado: [`gusdelact/loan-default-curated`](https://huggingface.co/datasets/gusdelact/loan-default-curated) - Train: 800 filas, 5 features. CV estratificado k=5, scoring=average_precision. ## Como usar ```python import json, joblib, pandas as pd from huggingface_hub import hf_hub_download model = joblib.load(hf_hub_download("gusdelact/loan-default-logreg", "model.joblib")) preproc = joblib.load(hf_hub_download("gusdelact/loan-default-logreg", "preprocessor.joblib")) info = json.load(open(hf_hub_download("gusdelact/loan-default-logreg", "model_info.json"))) raw = pd.DataFrame([{"age": 35, "income": 15000, "credit_score": 480, "dependents": 3, "home_owner": 0}]) Xp = pd.DataFrame(preproc.transform(raw[info["raw_feature_order"]]), columns=info["processed_feature_order"]) proba = model.predict_proba(Xp)[0, 1] decision = "pedir garantia" if proba >= info["decision_threshold"] else "aprobar" print(proba, decision) ``` ## Fundamento teorico (resumen del diseno) - EDA: `credit_score` predictor mas fuerte, `dependents` monotonica; sin multicolinealidad. - FE: Yeo-Johnson en `income` (sesgo), escalado, `dependents` ordinal (FES 5.5, 6.1). - Modelado: LogReg L2, C por CV; sin resampling para preservar probabilidades (ISLP 4.4). - Validacion: umbral calibrado por costo 3:1 (ISLP 4.4, ESL 9.2); PR-AUC sobre ROC con desbalance (FES 3.2.2). ## Limitaciones - Dataset pequeño y probablemente sintetico; rangos acotados. No extrapolar fuera de `age` 20-69, `credit_score` 300-849, `income` <= 100k. - Umbral calibrado sobre el test (39 positivos): metricas algo optimistas. - Ratio de costos 3:1 es asuncion de negocio no validada. NO usar como unica base de decisiones crediticias sin revision humana y cumplimiento regulatorio. _Generado el 2026-06-24 por el pipeline data-science-assistant._