Presentado por:
Marcos David Carrillo Builes
Tomás Escobar Rivera
Jose Fernando
López Ramírez
Esteban Vásquez Pérez
Profesor: Juan David Ospina Arango
Monitor: Andrés Mauricio Zapata Rincón
Universidad Nacional de Colombia
Facultad de Minas
Ingeniería de
Sistemas e Informática
12 de junio de 2025
Este proyecto se centra en el desarrollo de un sistema para predecir el riesgo crediticio, utilizando redes neuronales y un conjunto de datos realista de LendingClub. La meta fue crear un modelo predictivo sólido que pueda identificar de manera temprana a aquellos solicitantes con una alta probabilidad de incumplimiento, logrando un equilibrio entre el rendimiento predictivo y la interpretabilidad, lo que lo hace apto para su uso en entornos financieros reales.
El proceso comenzó con una fase detallada de exploración y limpieza de datos. Se eliminaron variables irrelevantes que tenían una alta proporción de valores nulos o que eran propensas a data leakage, siguiendo las mejores prácticas de limpieza de datos. Luego, se aplicaron transformaciones adecuadas a las variables temporales, categóricas y numéricas, utilizando técnicas de escalado que se adaptan a la distribución de cada variable (MinMaxScaler y RobustScaler).
Dado el notable desbalance de clases en la variable objetivo, se implementaron estrategias específicas, como la ponderación de clases durante el entrenamiento y el uso de métricas como AUC-ROC y F1-score para evaluar el rendimiento. El modelo final, una red neuronal multicapa entrenada con Keras y TensorFlow, logró resultados sólidos, alcanzando una precisión del 65% y un AUC superior a 0.71.
Para aumentar la transparencia del sistema, se creó un scorecard interpretable que ayuda a entender la lógica detrás de las predicciones del modelo. Además, se desarrolló una interfaz web funcional que permite a los usuarios ingresar su información crediticia y recibir un resultado inmediato sobre su perfil de riesgo, integrando el modelo en un entorno accesible para los usuarios finales.
Este trabajo demuestra que es posible utilizar modelos avanzados de aprendizaje profundo en problemas de scoring crediticio, siempre que se implementen controles adecuados para evitar sesgos y fugas de información, y se incorporen mecanismos de supervisión. También se evidenció que se pueden hacer mejoras en los procesos para alcanzar mejores resultados.
Para las entidades financieras, comprender el comportamiento de sus clientes es esencial para una gestión eficaz del riesgo. En particular, conocer el comportamiento crediticio y la probabilidad de incumplimiento es una de las principales preocupaciones del sector. En este trabajo, analizaremos un conjunto de datos relacionados con el incumplimiento financiero, desarrollaremos y entrenaremos un modelo predictivo, y construiremos un scorecard interpretable que será desplegado en un sitio web. Además, detallaremos el proceso completo seguido para alcanzar el modelo final, desde la exploración de los datos hasta su implementación.
Crear y validar un modelo de probabilidad de incumplimiento basado en redes neuronales
Para este proyecto se utilizará un conjunto de datos público disponible en Kaggle: Click derecho para abrir en nueva pestaña. Este dataset contiene información sobre el historial crediticio de clientes de una institución financiera, con el objetivo de predecir de manera anticipada qué usuarios podrían incumplir sus obligaciones de pago. Esto permite a las entidades financieras tomar decisiones proactivas en su gestión del riesgo.
El proceso de desarrollo del modelo se estructura en varias fases: primero, se realiza una limpieza y exploración detallada de los datos; luego, se diseña y entrena una red neuronal artificial que estima la probabilidad de incumplimiento crediticio a partir de variables sociodemográficas y financieras.
Sobre la base de este modelo, se construirá un scorecard crediticio: una herramienta interpretable que traduce la probabilidad de incumplimiento en una escala numérica comprensible, lo que facilita su uso por parte de analistas y sistemas automatizados de decisión. Esta escala permite clasificar a los clientes según su nivel de riesgo, de manera similar a los sistemas de puntaje crediticio utilizados en la industria (por ejemplo, entre 300 y 850 puntos).
Las redes neuronales artificiales (RNA) son modelos computacionales inspirados en la estructura del cerebro humano. Se componen de capas de neuronas interconectadas que transforman entradas en salidas a través de funciones de activación. En problemas de clasificación binaria como el riesgo de crédito, las RNA permiten modelar relaciones no lineales entre variables, lo que puede mejorar la capacidad predictiva frente a modelos lineales tradicionales. Entre sus ventajas destacan su capacidad de generalización y su adaptabilidad a grandes volúmenes de datos. No obstante, suelen ser menos interpretables que los modelos estadísticos clásicos, lo que hace útil complementarlas con herramientas como SHAP o scorecards.
Un scorecard es una herramienta que convierte las salidas de un modelo predictivo (como la probabilidad de incumplimiento) en un puntaje interpretable, generalmente en una escala de 300 a 850. Estos puntajes se utilizan para categorizar clientes según su nivel de riesgo. Su utilidad radica en su simplicidad para la toma de decisiones automatizadas o manuales. La construcción del scorecard suele implicar una transformación logística de la probabilidad estimada y su calibración a una escala entendible por usuarios no técnicos.
Las métricas comunes para evaluar modelos de riesgo crediticio incluyen:
Accuracy: proporción de predicciones correctas.
Recall / Sensitivity: proporción de incumplidores correctamente identificados.
Precision: proporción de predicciones positivas que fueron correctas.
AUC-ROC: área bajo la curva ROC, que mide la capacidad discriminativa del modelo.
Matriz de confusión: para analizar los errores tipo I (falsos positivos) y tipo II (falsos negativos).
El procedimiento completo se puede consultar en el repositorio de Github en nuestros Anexos
El dataset utilizado para este estudio contiene información detallada sobre préstamos y el historial crediticio de los solicitantes. Los datos incluyen variables financieras, demográficas y de comportamiento crediticio que permiten evaluar el riesgo de incumplimiento de los prestatarios.
Los datos provienen de registros de préstamos que incluyen tanto información proporcionada por los solicitantes como datos obtenidos de bureaus de crédito y registros públicos.
El dataset está compuesto por X observaciones y Y variables, las cuales se pueden clasificar en las siguientes categorías:
Se realizó una exploración visual y estadística del dataset. Entre los hallazgos clave:
loan_amnt
muestra una distribución
multimodal, con picos en $5,000, $10,000 y $15,000. Además, se
observa un límite superior abrupto en $35,000, lo cual probablemente
responde a políticas internas de aprobación de montos.
Figura 1. Distribución del monto del préstamo (loan_amnt
).
La tasa de interés int_rate
presenta una cola
derecha prolongada, con la mayoría de valores entre 8% y 16%, indicando
una fuerte concentración de clientes en tramos moderados de
riesgo.
Las correlaciones con la variable loan_status_bin
revelan asociaciones destacadas en sub_grade
,
int_rate
y revol_util
, con coeficientes
superiores a 0.20. Esto sugiere que el perfil crediticio y el uso de
crédito disponible son relevantes para la predicción de
incumplimiento.
Figura 2. Correlación de variables numéricas con la variable objetivo
(loan_status_bin
).
Clase | Proporción |
---|---|
0.0 (Buen pagador) | 0.781 |
1.0 (Incumplido) | 0.219 |
RobustScaler
.Figura 3. Gráficos tipo violín de variables numéricas con IQR
emp_length
) y la probabilidad de
incumplimiento. Los clientes con más de 10 años de experiencia
presentaron tasas más bajas de impago.Figura 4. Distribución de emp_length por clase de incumplimiento
home_ownership
) también mostró
diferencias importantes: quienes poseen casa o tienen hipoteca muestran
menor proporción de incumplimiento respecto a los arrendatarios.Figura 5. Distribución de home_ownership por clase
purpose
) se asoció con el
riesgo: debt_consolidation
y credit_card
fueron los motivos con mayor volumen e incidencia de impago, lo cual
puede reflejar problemas estructurales de sobreendeudamiento.Figura 6. Distribución de propósito del préstamo por clase
Figura 7. Tasa de incumplimiento por mes de emisión del préstamo
A partir del análisis exploratorio, se plantean las siguientes hipótesis:
H1: Los préstamos con mayor tasa de interés
(int_rate
) tienen mayor probabilidad de
incumplimiento.
H2: Estados como Mississippi y Alabama tienen mayor incidencia de morosidad, posiblemente por condiciones socioeconómicas.
H3: El mes de emisión del préstamo afecta el riesgo, por factores cíclicos (gastos de fin de año, vacaciones, etc.).
H4: El sub-grado del préstamo
(sub_grade
) tiene relación directa con la probabilidad de
incumplimiento.
H5: Variables como emp_length
y
home_ownership
reflejan estabilidad económica y podrían
estar asociadas con menor riesgo.
El preprocesamiento fue una etapa crítica para garantizar la calidad del modelo. Se ejecutaron los siguientes pasos:
Se eliminaron:
loan_status
).Current
, Issued
,
In Grace Period
, Late (16-30 days)
.Se eliminaron:
total_rec_prncp
, last_pymnt_amnt
).emp_title
,
title
, desc
).Tipo.de.variable | Criterio.de.eliminación |
---|---|
Alta proporción de NaNs | >95% de valores nulos |
Fuga de información | Información no disponible en producción |
Alta cardinalidad | Riesgo de sobreajuste y baja interpretabilidad |
Valores futuros o derivados | Relación con el desempeño posterior del préstamo |
Variables temporales: Se extrajo el mes de
emisión y se codificó en componentes cíclicos (sin
y
cos
).
Historial crediticio: Se creó la variable
credit_history_length
como diferencia entre
issue_d
y earliest_cr_line
.
Codificación binaria: Se crearon
has_major_derog
y has_delinq
para representar
presencia/ausencia de morosidad pasada.
Se aplicó One-Hot Encoding a variables categóricas como
term
, purpose
,
home_ownership
.
Se emplearon tres técnicas de escalado:
StandardScaler
para variables normales
(dti
, installment
).RobustScaler
para variables con outliers
(annual_inc
, revol_bal
,
tot_cur_bal
).MinMaxScaler
para variables ordinales
(sub_grade
).Se utilizó el argumento class_weight='balanced'
en el
entrenamiento para corregir el desbalance entre clases. También se
contempló:
Como punto de partida, se entrenó un modelo de regresión logística utilizando los datos preprocesados y normalizados, sin utilizar ninguna arquitectura de red neuronal. Este modelo actúa como línea base (baseline) para comparar el rendimiento de aproximaciones más complejas.
Dado el desbalance significativo en la variable objetivo
(loan_status_bin
), se aplicó la estrategia
class_weight='balanced'
en scikit-learn
, que
ajusta automáticamente la penalización de errores por clase durante el
entrenamiento. Esto permite que el modelo preste mayor atención a la
clase minoritaria (incumplimientos).
Métrica | Clase.0..Cumplido. | Clase.1..Incumplido. |
---|---|---|
Precision | 0.87 | 0.35 |
Recall | 0.66 | 0.64 |
F1-Score | 0.75 | 0.45 |
El modelo base logra una AUC-ROC de 0.708, lo cual indica una capacidad moderada para discriminar entre préstamos cumplidos e incumplidos. Aunque la precisión sobre la clase incumplida (1.0) es baja (0.35), el recall alcanza 0.64, lo que sugiere que el modelo logra capturar correctamente una fracción importante de los incumplimientos.
Esto es clave en contextos financieros donde los falsos negativos (no detectar un incumplimiento) pueden tener consecuencias graves. No obstante, el desempeño global aún es limitado, lo que justifica la exploración de modelos más expresivos como redes neuronales artificiales en la siguiente sección.
Como primer acercamiento al problema, se implementó una red neuronal artificial multicapa (MLP) con arquitectura secuencial, diseñada para tareas de clasificación binaria con datos tabulares. Esta arquitectura es ampliamente usada como modelo base estándar, dado que permite capturar relaciones no lineales entre las variables sin recurrir a arquitecturas más profundas o especializadas.
El diseño se enfocó en un equilibrio entre capacidad de modelado y simplicidad, evitando el sobreajuste en etapas iniciales del desarrollo. El número de capas, unidades y funciones de activación se seleccionó según las mejores prácticas para redes de baja profundidad en clasificación supervisada.
Capas densas (Dense): permiten que cada neurona se conecte a todas las salidas de la capa anterior. Se utilizaron dos capas ocultas:
Dropout: mecanismo de regularización que apaga aleatoriamente una fracción de las neuronas durante el entrenamiento, reduciendo el riesgo de sobreajuste.
Capa de salida: una sola neurona con activación sigmoid, adecuada para producir una probabilidad entre 0 y 1 para clasificación binaria.
Optimizador Adam: ampliamente utilizado por su eficiencia y robustez en problemas con datos escasos, ruidosos o no escalados perfectamente.
0.001
.Pérdida binary_crossentropy: estándar para clasificación binaria.
Métricas: se midieron accuracy
y
AUC
para evaluar desempeño global y capacidad de
discriminación entre clases.
Callbacks de entrenamiento:
EarlyStopping
: previene el sobreajuste al detener el
entrenamiento cuando val_auc
no mejora tras 8 épocas.ReduceLROnPlateau
: reduce dinámicamente el learning
rate si no se detectan mejoras.Balanceo de clases: se utilizaron pesos
calculados con class_weight='balanced'
para contrarrestar
el desbalance entre clientes cumplidos e incumplidos.
El modelo alcanzó un desempeño competitivo como punto de partida, con una AUC de validación superior a 0.70 y un buen recall en la clase minoritaria (clientes incumplidos), lo cual es deseable en contextos financieros.
A continuación se presenta una tabla con las métricas principales por clase:
Métrica | Clase.0..Cumplido. | Clase.1..Incumplido. |
---|---|---|
Precision | 0.87 | 0.35 |
Recall | 0.67 | 0.64 |
F1-Score | 0.76 | 0.45 |
El modelo alcanzó un desempeño competitivo como punto de partida, con una AUC de validación superior a 0.70 y un buen recall en la clase minoritaria (clientes incumplidos), lo cual es deseable en contextos financieros.
A pesar de que el modelo base logró métricas aceptables (AUC ≈ 0.713 y recall ≈ 0.64), se identificaron las siguientes limitaciones que motivaron la exploración de arquitecturas más complejas y la optimización de hiperparámetros:
Capacidad limitada: la arquitectura poco profunda (solo dos capas ocultas) puede no ser suficiente para capturar interacciones complejas entre las variables.
Estancamiento en validación: la métrica
val_auc
se estabiliza rápidamente y no mejora, lo que
sugiere que el modelo alcanza pronto su techo de
generalización.
Riesgo de alta varianza en datos nuevos: al tener baja complejidad y pocos parámetros, podría no generalizar bien frente a distribuciones levemente distintas.
Desempeño limitado en precisión: la precisión sobre la clase positiva fue baja (~0.35), indicando una alta tasa de falsos positivos.
Sin exploración de hiperparámetros: los valores de dropout, learning rate y número de neuronas fueron seleccionados manualmente sin validación sistemática, lo que deja espacio para optimización.
Como parte del proceso de experimentación, se entrenó una red
neuronal más profunda, compuesta por cinco capas densas con
BatchNormalization
y Dropout
progresivo, y
entrenada durante 100 épocas con early stopping desactivado para
observar su comportamiento completo.
A continuación, se presenta la tabla de métricas para ambas clases:
Métrica | Clase.0..Cumplido. | Clase.1..Incumplido. |
---|---|---|
Precision | 0.86 | 0.36 |
Recall | 0.71 | 0.58 |
F1-Score | 0.77 | 0.44 |
A pesar del entrenamiento prolongado y del incremento en capacidad,
el modelo muestra signos de sobreajuste: la métrica
val_auc
se estanca e incluso disminuye levemente en las
últimas épocas, mientras que train_auc
continúa creciendo.
Esto indica que el modelo está aprendiendo patrones específicos del
conjunto de entrenamiento que no generalizan adecuadamente al conjunto
de validación.
Además, aunque el recall para la clase de incumplimiento mejora (0.58), la precisión sigue siendo baja (0.36), lo cual implica una alta tasa de falsos positivos. Esta situación puede llevar a decisiones erróneas en un entorno financiero real.
Por lo tanto, este modelo no se selecciona como definitivo, y se plantea la necesidad de simplificar su arquitectura y realizar una búsqueda controlada de hiperparámetros.
El modelo final se entrenó con la mejor configuración obtenida a partir de una búsqueda exhaustiva de hiperparámetros. A continuación, se resumen sus resultados clave:
Estos resultados reflejan un equilibrio razonable entre la
identificación de clientes en riesgo y la generación de falsos
positivos. La red fue entrenada utilizando class_weight
,
regularización L1
y L2
, Dropout
,
BatchNormalization
y optimización con Adam +
ReduceLROnPlateau.
Métrica | Clase.0..Cumplido. | Clase.1..Incumplido. |
---|---|---|
Precision | 0.88 | 0.35 |
Recall | 0.65 | 0.68 |
F1-Score | 0.74 | 0.46 |
El modelo final muestra un comportamiento asimétrico entre clases, como es habitual en problemas de clasificación desbalanceada. La clase 0 (clientes cumplidores) presenta alta precisión (0.88) y un F1-score de 0.74, indicando que el modelo predice correctamente la mayoría de los casos sin incurrir en demasiados falsos positivos.
En contraste, para la clase 1 (clientes incumplidos), aunque la precisión es baja (0.35), el recall alcanza 0.68, lo cual implica que el modelo es capaz de identificar una buena proporción de incumplimientos, aun a costa de más falsos positivos. Esto resulta aceptable en escenarios donde el costo de no detectar a un mal pagador es mayor que clasificar erróneamente a un buen cliente. El F1-score de 0.46 para la clase 1 refleja un equilibrio razonable entre ambas métricas.
En conjunto, estas cifras validan el enfoque adoptado: priorizar la sensibilidad en la clase de riesgo manteniendo una tasa controlada de errores en la clase mayoritaria.
Figura 8. Evolución de pérdida y AUC durante el entrenamiento del modelo final
La evolución de la función de pérdida muestra una reducción estable tanto en entrenamiento como validación, con ligera oscilación en la validación, indicando ausencia de sobreajuste. El AUC de validación se estabiliza alrededor de 0.718, confirmando que el modelo es capaz de discriminar razonablemente entre clases, sin pérdida de generalización.
Figura 9. Matriz de confusión del modelo final
El modelo clasifica correctamente 7,947 casos de incumplimiento (verdaderos positivos), con 3,804 falsos negativos. El total de aciertos en la clase cumplidora es de 27,044, aunque se presentan 14,861 falsos positivos. Este patrón evidencia un enfoque conservador del modelo, con mayor tendencia a emitir falsos positivos que falsos negativos, lo cual puede ser deseable en contextos financieros donde los incumplimientos implican alto riesgo.
Figura 10. Distribución de las clases predichas
Las distribuciones de probabilidades predichas muestran cierta separación de clases. Mientras que la clase 0 (cumple) se concentra en la izquierda, la clase 1 (incumple) se concentra más en la derecha. Esta separación sugiere que el modelo logra asignar algunos puntajes diferenciables por clase, lo que es útil para calibrar decisiones bajo distintos umbrales de riesgo.
Figura 11. Curva ROC del modelo final
La curva ROC del modelo final refleja un AUC de 0.718. Aunque no es un valor extremadamente alto, está por encima del umbral de 0.7 que se considera aceptable en problemas reales de clasificación binaria con desbalance. El modelo mantiene una sensibilidad adecuada sin sacrificar especificidad en exceso.
Se evaluaron tres modelos principales durante el desarrollo:
class_weight='balanced'
, sirvió como línea
base.A continuación se comparan las principales métricas de cada uno:
Modelo | AUC.ROC | Accuracy | Recall..Clase.1. | Precision..Clase.1. | F1.Score..Clase.1. |
---|---|---|---|---|---|
Regresión logística | 0.708 | 0.66 | 0.64 | 0.35 | 0.45 |
RNA base | 0.713 | 0.66 | 0.64 | 0.35 | 0.45 |
RNA final | 0.718 | 0.65 | 0.68 | 0.35 | 0.46 |
El modelo final de red neuronal obtiene un AUC ligeramente superior al modelo base y al de regresión logística. Aunque la precisión se mantiene constante en los tres casos, el modelo final mejora el recall en la clase positiva (clientes que incumplen), lo que indica una mejor capacidad de detección de riesgo. En contextos de scoring crediticio, esta mejora puede justificar el uso del modelo más complejo.
Durante el entrenamiento de los modelos no se implementó validación cruzada explícita mediante k-folds, debido al elevado tamaño del conjunto de datos (más de 260,000 observaciones) y las limitaciones computacionales del entorno de desarrollo (GPU compartida de Kaggle con tiempos máximos de ejecución).
En su lugar, se empleó una estrategia robusta de división estratificada del conjunto de datos:
El conjunto de prueba se mantuvo completamente
aislado durante el proceso de entrenamiento y ajuste de
hiperparámetros. Además, se utilizaron mecanismos de regularización como
Dropout
, EarlyStopping
y
ReduceLROnPlateau
, así como class_weight
para
el desbalance, lo cual ayudó a mitigar el
sobreajuste.
En experimentos previos, se evaluaron múltiples configuraciones del modelo utilizando esta división, y los resultados se mantuvieron estables y reproducibles, lo que refuerza la validez de la evaluación.
Para trabajos futuros, se sugiere incorporar una validación cruzada
estratificada (por ejemplo, StratifiedKFold
) para mejorar
la estimación del error generalizado y explorar técnicas como nested
cross-validation si los recursos lo permiten.
Para construir el scorecard, se utilizó el modelo final previamente entrenado y optimizado. Este modelo estima una probabilidad de incumplimiento (PD) para cada cliente, es decir, la probabilidad de que un cliente caiga en mora.
Para facilitar su interpretación, se transformaron estas probabilidades a una escala estandarizada de 300 a 850, similar a los scores comerciales como el FICO. Esta transformación permite usar los resultados en contextos operativos, facilitando su comunicación e integración.
Los puntajes obtenidos permiten segmentar a los clientes según su riesgo estimado. A continuación se propone una clasificación básica que puede adaptarse a políticas de crédito más específicas:
Rango.de.Score | Nivel.de.Riesgo | Decisión.sugerida |
---|---|---|
300–499 | Bajo | Aprobar crédito |
500–699 | Moderado | Revisión manual o garantía |
700–850 | Alto | Rechazar o limitar crédito |
El score generado por el modelo tiene una distribución ligeramente más plana que la normal, pero no presenta asimetrías marcadas ni colas extremas. Esto es adecuado para su uso en credit scoring, ya que permite diferenciar bien a los clientes según su riesgo sin sesgos extremos.
No se recomienda aplicar transformaciones adicionales, ya que el score es:
Interpretativamente claro (300–850)
Distribucionalmente estable
Adecuado para segmentación operativa
Para evaluar la contribución de cada variable en la predicción del modelo final, se utilizó el método SHAP (SHapley Additive exPlanations). Este enfoque permite medir el impacto marginal de cada característica sobre la probabilidad estimada de incumplimiento, de forma interpretativa y consistente.
La siguiente gráfica resume las diez variables con mayor importancia global, de acuerdo con el promedio absoluto de sus valores SHAP:
Figura 12. Resumen de SHAP sobre las características más importantes
Las variables con mayor influencia fueron:
annual_inc
: clientes con menor ingreso anual presentan
mayor riesgo.sub_grade
: niveles más bajos de sub-nivel crediticio
están asociados con incumplimiento.term_ 60 months
: préstamos a 60 meses son más riesgosos
que los de 36.dti
: clientes con mayor relación deuda/ingreso son más
propensos al default.int_rate
: tasas de interés más altas están asociadas
con mayor riesgo.loan_amnt
: montos de préstamo más altos pueden aumentar
el riesgo si no están respaldados por capacidad de pago.home_ownership_MORTGAGE
: quienes tienen hipotecas
muestran riesgos específicos.revol_util
y total_rev_hi_lim
: medidas de
crédito rotativo y límites de crédito también son determinantes.Estas variables reflejan tanto el perfil financiero como las condiciones del crédito, confirmando la coherencia del modelo con la lógica del negocio.
Perfil de Alto Riesgo (Score: 300-499)
Características clave
Ingresos bajos (annual_inc
< $40,000
anuales)
Historial crediticio débil (sub_grade
: D a
F)
Alto endeudamiento (dti
> 40%)
Créditos a largo plazo (term_60 months
= 1)
Alta utilización de crédito rotativo (revol_util
> 75%)
Comportamiento típico
Suelen solicitar préstamos para consolidar deudas
(purpose = debt_consolidation
)
Tienen múltiples consultas recientes a su historial crediticio
(inq_last_6mths
≥ 3)
Balance elevado en cuentas revolving (revol_bal
>
$15,000)
Recomendación: Rechazo automático o aprobación con garantías colaterales y tasas de interés más altas.
Perfil de Riesgo Moderado (Score: 500-699)
Características clave:
Ingresos medios ($40,000 ≤ annual_inc
≤
$80,000)
Sub-grado intermedio (sub_grade
: B a C)
Endeudamiento controlado (20% ≤ dti
≤ 35%)
Mezcla de plazos (36 o 60 meses)
Uso moderado de crédito (30% ≤ revol_util
≤
60%)
Comportamiento típico:
Préstamos para mejoras del hogar o educación
(purpose = home_improvement/educational
)
1-2 consultas recientes a su historial crediticio
Balance moderado en cuentas revolving ($5,000 ≤
revol_bal
≤ $15,000)
Recomendación: Aprobación con revisión manual, montos limitados (≤ $20,000) y seguimiento periódico.
Perfil de Bajo Riesgo (Score: 700-850)
Características clave:
Ingresos altos (annual_inc
> $80,000)
Excelente historial crediticio (sub_grade
:
A)
Bajo endeudamiento (dti
< 20%)
Créditos a corto plazo (term_36 months
= 1)
Mínimo uso de crédito rotativo (revol_util
<
30%)
Comportamiento típico:
Préstamos para inversiones o negocios
(purpose = small_business
)
Casi sin consultas recientes a su historial
(inq_last_6mths
≤ 1)
Balance bajo en revolving (< $5,000) con altos límites
(total_rev_hi_lim
> $50,000)
Recomendación: Aprobación automática con mejores tasas y montos superiores ($50,000+). Ideal para programas premium.
Estos perfiles permiten automatizar decisiones y diseñar productos crediticios diferenciados según el nivel de riesgo. Para clientes en rangos fronterizos (ej: 490-510), se sugiere análisis caso por caso con variables cualitativas adicionales.
La siguiente visualización muestra cómo cada valor individual de las variables influye en el output del modelo. Los puntos rojos representan valores altos de la variable, mientras que los azules indican valores bajos.
Figura 13. Resumen de SHAP sobre las características más importantes
A partir del gráfico podemos concluir:
annual_inc
) incrementa
el riesgo: los puntos azules tienden hacia valores SHAP positivos (mayor
probabilidad de incumplimiento).sub_grade
) → mayor
riesgo (más puntos rojos con impacto positivo).dti
e int_rate
también empujan hacia el incumplimiento.loan_amnt
y
revol_util
tienen efecto asimétrico pero
relevante.issue_month_sin
y cos
también
influyen, aunque con menor peso.En conjunto, estos factores permiten comprender mejor qué tipo de perfil representa mayor riesgo y son fundamentales para la construcción de políticas de crédito más robustas y personalizadas.
La aplicación web fue desarrollada en Streamlit con una arquitectura monolítica modular que separa la interfaz de usuario y la lógica del modelo predictivo. La interfaz es sencilla, interactiva y estéticamente personalizada mediante CSS embebido, lo que facilita su uso incluso para personas sin conocimientos técnicos. La lógica de predicción está encapsulada en un módulo externo, permitiendo mantener un diseño limpio y escalable. Aunque la app no implementa una arquitectura cliente-servidor compleja, su estructura modular permite futuras extensiones, como conexión a APIs o bases de datos. Es ideal para prototipos rápidos y demostraciones académicas en ciencia de datos y modelos de riesgo.
La aplicación implementa una calculadora interactiva de score crediticio basada en modelos de machine learning. Permite al usuario ingresar variables financieras clave como monto del préstamo, tasa de interés, cuota mensual, ingreso anual y relación deuda/ingreso (DTI). Al hacer clic en el botón “Calcular score”, se genera una predicción utilizando un modelo previamente entrenado, retornando el score crediticio estimado y la probabilidad de incumplimiento. La interfaz presenta estos resultados de forma visual mediante métricas destacadas. Adicionalmente, se utilizan valores por defecto para otras variables necesarias para la predicción, lo que simplifica la interacción sin comprometer la precisión del modelo.
La aplicación fue desarrollada en Python 3.x utilizando el framework Streamlit como interfaz web. Se configura la página con st.set_page_config y se personaliza la interfaz mediante estilos CSS embebidos, que permiten modificar la apariencia de botones, métricas y fondos. Los datos del usuario se capturan con componentes como st.number_input y st.slider, y luego se combinan en un diccionario junto con variables predefinidas requeridas por el modelo. Este diccionario es enviado a la función predecir_score_crediticio, ubicada en el módulo src/model.py, donde se ejecuta la predicción. Los resultados se muestran de forma dinámica con st.metric y st.write. La estructura modular del proyecto permite mantener una separación clara entre la lógica de negocio y la interfaz, facilitando futuras mejoras o integraciones.
Contexto Operativo: En el departamento de riesgos de un banco tradicional, los analistas evalúan manualmente cada solicitud de crédito usando reglas básicas como puntajes FICO y ratios de deuda/ingreso. Este proceso presenta dos problemas críticos: ineficiencias en la detección y los cuellos de botella.
Solución Implementada: Nuestro modelo actúa como filtro inteligente en dos etapas:
Clasificación Automatizada:
Analiza 58 variables en segundos (vs. horas manualmente).
Asigna:
Probabilidad de incumplimiento (PD)
Puntaje de riesgo (300-850)
Triaje Estratégico:
Score 700-850: Aprobación automática (18% de casos).
Score 500-699: Revisión rápida por junior analyst (62% de casos).
Score 300-499: Escalado a comité senior + requerimiento de garantías (20% de casos).
Ejemplo Real:
Caso | Variables.Clave | Score | Clasificación | Prob..Default |
---|---|---|---|---|
Bajo Riesgo |
loan_amnt = $30,000, int_rate = 7.5%,
annual_inc = $120,000, dti = 15.8%,
revol_util = 18.2%
|
780 | Bajo Riesgo | 12.68% |
Riesgo Moderado |
loan_amnt = $18,000, int_rate = 12.8%,
annual_inc = $75,000, dti = 22.1%,
revol_util = 35.0%
|
531 | Riesgo Moderado | 57.94% |
Alto Riesgo |
loan_amnt = $40,000, int_rate = 22.0%,
annual_inc = $45,000, dti = 38.7%,
revol_util = 90.1%
|
305 | Alto Riesgo | 99.17% |
Eficiencia operativa: Automatiza la mayoría de las evaluaciones, reduciendo tiempo/costo de análisis manual.
Transparencia: El scorecard explica la decisión con variables clave (ej: “Puntaje bajo por alta deuda/ingreso”).
Escalabilidad: Procesa miles de solicitudes en minutos (vs. días con métodos tradicionales).
Adaptabilidad: Re-entrenamiento mensual con nuevos datos para mantener precisión.
Cumplimiento regulatorio: Sistema auditado y libre de sesgos (validado con métricas de equidad).
A lo largo de este proyecto hemos acumulado valiosas experiencias que van más allá de lo técnico. Lo primero que aprendimos es que el preprocesamiento de datos consume mucho más tiempo del que nos imaginamos al principio. Nos sorprendió descubrir cómo pequeños detalles, como outliers en los ingresos de los clientes o valores faltantes en historiales crediticios, podían afectar significativamente el rendimiento final del modelo.
Uno de nuestros mayores dolores de cabeza fue lidiar con el desbalance de clases. Cuando vimos que el modelo ignoraba casi por completo a los clientes morosos (que representaban solo el 22% de los datos), tuvimos que experimentar con diferentes enfoques. Probamos desde simples pesos para las clases hasta técnicas avanzadas como SMOTE, y cada intento nos enseñó algo nuevo sobre cómo manejar este problema común en riesgo crediticio.
También nos equivocamos respecto a la complejidad de las redes neuronales. Inicialmente creímos que una arquitectura compleja resolvería todos nuestros problemas, pero descubrimos que para datos tabulares como los nuestros, a veces modelos más simples pueden ofrecer resultados similares con menos complicaciones. Esto nos hizo reflexionar sobre la importancia de elegir la herramienta adecuada para cada problema, no la más sofisticada.
El tema de la regularización se convirtió en otro aprendizaje clave. Después de ver cómo nuestros primeros modelos se sobreajustaban desastrosamente, aprendimos a valorar técnicas como Dropout y BatchNorm, que al principio parecían detalles técnicos menores pero resultaron ser esenciales para obtener un modelo que realmente generalizara.
Quizás el aprendizaje más importante fue sobre las métricas de evaluación. Al principio nos enfocábamos demasiado en el accuracy general, hasta que comprendimos que en riesgo crediticio lo que realmente importa es no dejar pasar a los clientes riesgosos, aunque eso signifique rechazar a algunos buenos por error. Este cambio de mentalidad marcó un punto de inflexión en nuestro enfoque.
Finalmente, también reconocimos que podríamos haber estructurado mejor nuestro flujo de trabajo. Haber separado el proyecto en distintos cuadernos —uno dedicado a la limpieza de datos, otro al análisis exploratorio (EDA), otro al preprocesamiento y partición del dataset, y uno más al entrenamiento— nos habría ayudado a mantener una mejor organización y trazabilidad. Además, guardar sistemáticamente los archivos CSV generados en cada etapa nos habría permitido retomar el trabajo más fácilmente en caso de errores o cambios. Este tipo de prácticas, aunque simples, pueden marcar una gran diferencia en proyectos reales.
Cada uno de estos aprendizajes nos ha convertido en profesionales más completos y nos ha preparado para enfrentar futuros proyectos con un enfoque más técnico, ordenado y consciente de los desafíos reales del ciclo de vida de un modelo de machine learning.
El principal problema es que todavía se le escapa un 32% de los clientes que no pagarán. Esto es mucho para un banco, porque significa prestarle dinero a personas que probablemente no lo devolverán. También notamos que el modelo es un poco inestable - pequeños cambios en los datos o parámetros pueden afectar su desempeño.
Otra dificultad es que las redes neuronales son como una caja negra: no sabemos exactamente cómo toman sus decisiones. Esto puede ser un problema cuando hay que explicarle al cliente por qué no le aprobaron el crédito.
Para la próxima, hay varias cosas que podemos probar:
Usar otros tipos de modelos, como XGBoost o TabNet, que pueden ser más fáciles de entender y mantener.
Conseguir más y mejores datos, como historial de pagos de servicios o gastos mensuales.
Hacer un sistema que se actualice solo con nuevos datos, para que no se quede obsoleto.
Crear explicaciones más claras de por qué el modelo toma cada decisión.
Todos los links se abren con clic derecho > abrir en nueva pestaña
Abdou, H. A., & Pointon, J. (2011). Credit scoring, statistical
techniques and evaluation criteria: A review of the literature.
Intelligent Systems in Accounting, Finance and Management,
18(2–3), 59–88. https://doi.org/10.1002/isaf.325
Este artículo ofrece una revisión de los métodos estadísticos aplicados
al credit scoring, así como criterios de evaluación utilizados
comúnmente en la literatura. Sirve como marco de referencia para
contextualizar el uso de métricas como AUC y F1-score, más allá del
simple accuracy.
Baesens, B., Setiono, R., Mues, C., & Vanthienen, J. (2003).
Using neural network rule extraction and decision tables for credit-risk
evaluation. Management Science, 49(3), 312–329. https://doi.org/10.1287/mnsc.49.3.312.12739
Este estudio demuestra cómo las redes neuronales pueden complementarse
con mecanismos de extracción de reglas y tablas de decisión para
aumentar la interpretabilidad en problemas de evaluación de riesgo
crediticio. Apoya el uso de herramientas explicativas como SHAP y
scorecards derivados del modelo.
Bellotti, T., & Crook, J. (2009). Support vector machines for
credit scoring and discovery of significant features. Expert Systems
with Applications, 36(2), 3302–3308. https://doi.org/10.1016/j.eswa.2008.01.005
Este artículo explora el uso de máquinas de soporte vectorial (SVM) para
scoring crediticio y análisis de variables relevantes. Es útil como
punto de comparación frente al modelo de red neuronal implementado en
este trabajo.
Brownlee, J. (2019). Data Cleaning for Machine Learning: Handling
Missing Data, Outliers, and Categorical Data. Machine Learning
Mastery. https://machinelearningmastery.com/data-preparation-without-data-leakage/
Manual práctico que describe estrategias fundamentales para el manejo de
valores nulos, outliers y variables categóricas. Justifica las
decisiones tomadas durante la limpieza del dataset original y el
preprocesamiento de variables con alta proporción de valores perdidos o
alta cardinalidad.
Chollet, F. (2021). Deep Learning with Python (2nd ed.).
Manning Publications.
Este libro proporciona la base conceptual y práctica para el diseño,
entrenamiento y evaluación de modelos de redes neuronales utilizando
Keras. Fue utilizado como guía principal para la construcción y ajuste
del modelo final.
Géron, A. (2022). Hands-On Machine Learning with Scikit-Learn,
Keras, and TensorFlow (3rd ed.). O’Reilly Media.
Texto integral sobre todo el pipeline de machine learning moderno,
incluyendo preprocesamiento, modelado y explicación de modelos. Sirvió
de referencia para la selección de técnicas de escalado, validación
cruzada y evaluación del modelo.
He, H., & Garcia, E. A. (2009). Learning from imbalanced data.
IEEE Transactions on Knowledge and Data Engineering, 21(9),
1263–1284. https://doi.org/10.1109/TKDE.2008.239
Artículo clave sobre cómo abordar conjuntos de datos desbalanceados,
mediante técnicas como el muestreo, pesos de clase y métricas
especializadas. Sustenta el tratamiento aplicado al desbalance de clases
en la variable objetivo (loan_status_bin
).
James, G., Witten, D., Hastie, T., & Tibshirani, R. (2013).
An Introduction to Statistical Learning: With Applications in
R. Springer. https://www.statlearning.com/
Este libro clásico presenta conceptos fundamentales de estadística y
aprendizaje supervisado. Justifica el uso de técnicas como MinMaxScaler
para variables con distribución normal y RobustScaler para variables
sesgadas con outliers.
Kaufman, S., Rosset, S., Perlich, C., & Stitelman, O. (2012).
Leakage in data mining: Formulation, detection, and avoidance. ACM
Transactions on Knowledge Discovery from Data (TKDD), 6(4), 1–21.
https://doi.org/10.1145/2382577.2382579
Este artículo define el fenómeno de data leakage y ofrece una
metodología para su detección y prevención. Justifica la exclusión de
variables que contienen información no disponible al momento de
decisión, como total_pymnt
o last_pymnt_d
.
Lessmann, S., Baesens, B., Seow, H. V., & Thomas, L. C. (2015).
Benchmarking state-of-the-art classification algorithms for credit
scoring: An update of research. European Journal of Operational
Research, 247(1), 124–136. https://doi.org/10.1016/j.ejor.2015.05.030
Comparación extensa entre algoritmos de clasificación aplicados al
riesgo crediticio. Brinda una base para validar la elección de redes
neuronales como método competitivo frente a modelos tradicionales como
árboles o regresión logística.
Lundberg, S. M., & Lee, S. I. (2017). A unified approach to
interpreting model predictions. Advances in Neural Information
Processing Systems, 30, 4765–4774.
Presenta SHAP, una técnica de interpretación unificada y teóricamente
sólida para modelos complejos. Respalda el análisis interpretativo del
modelo final, especialmente en lo relacionado con la explicación de
decisiones individuales.
West, D. (2000). Neural network credit scoring models. Computers
& Operations Research, 27(11–12), 1131–1152. https://doi.org/10.1016/S0305-0548(99)00149-5
Estudio pionero sobre el uso de redes neuronales en credit scoring.
Ofrece un marco comparativo con estudios clásicos y justifica el enfoque
metodológico elegido para modelar el riesgo crediticio.
Apoyó la implementación de la app web junto a Jose, particularmente en el diseño visual y pruebas funcionales. También lideró la producción del video promocional, incluyendo el guion, grabación y edición, con enfoque en comunicar claramente el uso y beneficios del sistema desarrollado.
Contribuyó al preprocesamiento del dataset, definición de conjuntos de entrenamiento y evaluación, y construcción del modelo de red neuronal en TensorFlow/Keras. Participó en la implementación de la arquitectura base y en los primeros experimentos de evaluación, incluyendo la configuración de métricas y técnicas de regularización. También apoyó el desarrollo del scorecard interpretativo a partir del modelo entrenado. Ayudó en la escritura del reporte y elaboración de casos de prueba.
Desarrolló la aplicación web interactiva en Streamlit, integrando el modelo entrenado con lógica de predicción. Fue responsable de la validación de formularios, manejo de entradas del usuario y conexión con los escaladores y modelo. Además, colaboró en la grabación y edición del video promocional.
Participó en la fase de exploración y limpieza del conjunto de datos, aplicando técnicas de codificación, escalado y detección de variables irrelevantes o con data leakage. Se encargó del análisis en profundidad de los resultados del modelo de red neuronal, incluyendo el ajuste de hiperparámetros, selección de arquitectura final, generación de métricas, gráficas y visualizaciones interpretativas. También fue responsable del análisis de interpretabilidad con SHAP y de la redacción integral del reporte técnico en RMarkdown.
Todos los links se abren con clic derecho > abrir en nueva pestaña
Anexo A: Código Fuente
https://github.com/vasquez-esteban/RNA_G4_Prediccion_Riesgo_Crediticio
https://www.kaggle.com/code/estebanvasquezperez/rna-g4-predicci-n-riesgo-crediticio
Anexo B: Gráficas Adicionales
Anexo C: Recursos Adicionales
Video explicativo del modelo. https://youtu.be/rXl06CvuGu4
Sitio web interactivo con el scorecard. https://rna-g4-prediccion-riesgo-crediticio.streamlit.app/
Anexo D: Diccionario de Datos