Desbalance de clases en datos de préstamos

Modelado del riesgo crediticio en Python

Michael Crabtree

Data Scientist, Ford Motor Company

Faltan impagos en los datos

  • Los valores de loan_status son las clases
    • No impago: 0
    • Impago: 1
y_train['loan_status'].value_counts()
loan_status Recuento en entrenamiento Porcentaje del total
0 13,798 78%
1 3,877 22%
Modelado del riesgo crediticio en Python

Función de pérdida del modelo

  • Los Gradient Boosted Trees en xgboost usan log-loss como función de pérdida
    • El objetivo es minimizarla

Fórmula de la log-loss

Estado real del préstamo Probabilidad predicha Log-loss
1 0.1 2.3
0 0.9 2.3
  • Un impago mal predicho tiene mayor impacto financiero negativo
Modelado del riesgo crediticio en Python

El coste del desbalance

  • Un falso negativo (impago predicho como no impago) cuesta mucho más
Persona Importe del préstamo Beneficio potencial Estado predicho Estado real Pérdidas
A $1,000 $10 Impago No impago -$10
B $1,000 $10 No impago Impago -$1,000
  • La log-loss del modelo es igual en ambos; nuestras pérdidas reales no
Modelado del riesgo crediticio en Python

Causas del desbalance

  • Problemas de datos
    • Los datos de crédito no se muestrearon bien
    • Problemas de almacenamiento
  • Procesos de negocio:
    • Medidas para no aceptar probables impagos
    • Los probables impagos se venden rápido a otras firmas
  • Factores de comportamiento:
    • Normalmente, la gente no incumple sus préstamos
      • Cuanto menos incumplen, mayor su calificación crediticia
Modelado del riesgo crediticio en Python

Cómo abordar el desbalance de clases

  • Varias formas de tratar el desbalance de clases
Método Pros Contras
Recoger más datos Aumenta el número de impagos El porcentaje puede no cambiar
Penalizar modelos Aumenta el recall de impagos Requiere más ajuste y mantenimiento
Muestrear distinto Ajuste menos técnico Menos impagos en los datos
Modelado del riesgo crediticio en Python

Estrategia de submuestreo

  • Combina una muestra aleatoria pequeña de no impagos con los impagos

Diagrama de la estrategia de submuestreo

Modelado del riesgo crediticio en Python

Combinar los conjuntos divididos

  • Junta de nuevo los conjuntos de test y entrenamiento
  • Crea dos conjuntos según el loan_status real
# Concat the training sets
X_y_train = pd.concat([X_train.reset_index(drop = True),
                       y_train.reset_index(drop = True)], axis = 1)
# Get the counts of defaults and non-defaults
count_nondefault, count_default = X_y_train['loan_status'].value_counts()
# Separate nondefaults and defaults
nondefaults = X_y_train[X_y_train['loan_status'] == 0]
defaults = X_y_train[X_y_train['loan_status'] == 1]
Modelado del riesgo crediticio en Python

Submuestrear los no impagos

  • Muestra aleatoriamente los no impagos
  • Concáténalos con los impagos
# Undersample the non-defaults using sample() in pandas
nondefaults_under = nondefaults.sample(count_default)
# Concat the undersampled non-defaults with the defaults
X_y_train_under = pd.concat([nondefaults_under.reset_index(drop = True),
                             defaults.reset_index(drop = True)], axis=0)
Modelado del riesgo crediticio en Python

¡Vamos a practicar!

Modelado del riesgo crediticio en Python

Preparing Video For Download...