Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Riesgo de incumplimiento en préstamos de Lending Club

scikit-learn frente a PySpark — modelado, comparación estadística e interpretabilidad

Proyecto integrador de aprendizaje automático · Machine Learning UN 202330

Resumen

Este trabajo construye y compara modelos de clasificación supervisada para predecir si un préstamo otorgado por la plataforma Lending Club terminará en incumplimiento (Charged Off) o será pagado por completo (Fully Paid). Se utiliza el conjunto de datos completo de préstamos aceptados entre 2007 y 2018, sin ningún tipo de muestreo: 2,26 millones de registros, de los cuales 1,35 millones tienen un desenlace conocido.

Se implementan seis modelos en dos entornos, con espacios de búsqueda equivalentes y una misma partición de entrenamiento y prueba: regresión logística, árbol de decisión, bosque aleatorio, gradient boosting, máquina de vectores de soporte lineal y Naive Bayes, en scikit-learn y en PySpark. Las diferencias de desempeño se contrastan con la prueba de DeLong para AUC correlacionados, en su versión rápida de Sun y Xu (2014), y se verifican con las pruebas de McNemar y bootstrap pareado, con corrección de Holm por comparaciones múltiples. Por último, las predicciones erróneas se interpretan con LIME.

El mejor modelo en ambos entornos es gradient boosting (AUC de 0,720), con una ventaja significativa y relevante sobre la regresión logística. Los dos entornos alcanzan desempeños estadísticamente equivalentes en los modelos bien especificados, y scikit-learn resulta en general más rápido en un único equipo. La excepción es la máquina de vectores de soporte, cuyo resultado depende críticamente de la formulación del optimizador.

Datos y objetivo

AspectoDescripción
FuenteLending Club Loan Data, archivo accepted_2007_to_2018Q4.csv (1,7 GB)
Universo1.345.310 préstamos con desenlace conocido (sin muestreo)
Variable objetivodefault = 1 si loan_status es Charged Off (19,96 %), 0 si es Fully Paid
Partición80/20 estratificada, semilla 42, común a ambos entornos (1.076.248 / 269.062)
Predictores16 numéricos, 3 indicadores y 7 categóricos disponibles al originar el préstamo (91 columnas tras la codificación)

Resultados principales

ModeloAUC scikit-learnAUC PySparkEntrenamiento scikit-learnEntrenamiento PySpark
Gradient boosting0,71980,7195125,1 min80,8 min
Bosque aleatorio0,71510,713725,7 min105,1 min
Regresión logística0,71350,71350,4 min11,0 min
Árbol de decisión0,70290,70022,3 min3,7 min
Naive Bayes0,63900,63950,2 min2,9 min
SVM lineal (hinge)0,46110,630023,5 min21,1 min

AUC calculado en el conjunto de prueba común. El tiempo de entrenamiento incluye la validación cruzada de 3 pliegues y el reajuste final.

Estructura del libro

  1. Exploración de datos. Análisis univariado, bivariado y de valores faltantes; identificación de variables con fuga de información y de redundancias.

  2. Preprocesamiento. Partición común y transformaciones equivalentes en scikit-learn y PySpark, con verificación numérica de la equivalencia.

  3. Modelado con scikit-learn. GridSearchCV con validación cruzada de 3 pliegues, métricas en entrenamiento y prueba, y diagnóstico de LinearSVC.

  4. Modelado con PySpark. CrossValidator con ParamGridBuilder y efecto de las condiciones de ejecución en el rendimiento.

  5. Comparación estadística. DeLong entre entornos y entre modelos, McNemar y bootstrap pareado.

  6. Interpretabilidad con LIME. Explicación de préstamos mal clasificados en ambos entornos.

  7. Comparación de resultados y reflexión crítica. Tablas comparativas, experimento de escalabilidad, modelo ganador y respuesta a las preguntas del enunciado.

Reproducibilidad

Todos los cálculos se ejecutaron en un único equipo con procesador Intel de 12.ª generación (10 núcleos físicos, 12 lógicos), 16 GB de RAM y Windows 11 (build 26200; Python lo reporta como “Windows 10”). Se usaron Python 3.11.16, scikit-learn 1.9.1, pandas 2.2.3 y PySpark 3.5.5 en modo local[*]. El código compartido por los capítulos está en lc_utils.py (configuración, preprocesamiento y métricas) y lc_stats.py (pruebas estadísticas), y el repositorio incluye un notebook compilado con todos los capítulos y sus salidas (proyecto_lending_club.ipynb).