Squilibrio di classi nei dati sui prestiti

Credit Risk Modeling in Python

Michael Crabtree

Data Scientist, Ford Motor Company

Poche insolvenze nei dati

  • I valori di loan_status sono le classi
    • Non insolvenza: 0
    • Insolvenza: 1
y_train['loan_status'].value_counts()
loan_status Conteggio nel training set Percentuale del totale
0 13,798 78%
1 3,877 22%
Credit Risk Modeling in Python

Funzione di perdita del modello

  • I Gradient Boosted Trees in xgboost usano la log-loss come funzione di perdita
    • L’obiettivo è minimizzarla

Formula della log-loss

Stato reale del prestito Probabilità prevista Log-loss
1 0.1 2.3
0 0.9 2.3
  • Una insolvenza prevista male ha un impatto finanziario peggiore
Credit Risk Modeling in Python

Il costo dello squilibrio

  • Un falso negativo (insolvenza prevista come non insolvenza) costa molto di più
Persona Importo prestito Profitto potenziale Stato previsto Stato reale Perdite
A $1,000 $10 Insolvenza Non insolvenza -$10
B $1,000 $10 Non insolvenza Insolvenza -$1,000
  • La log-loss del modello è uguale in entrambi i casi, le nostre perdite no
Credit Risk Modeling in Python

Cause dello squilibrio

  • Problemi di dati
    • Campionamento del credito non corretto
    • Problemi di archiviazione
  • Processi aziendali:
    • Misure già in atto per non accettare probabili insolvenze
    • Le probabili insolvenze vengono rapidamente cedute ad altre aziende
  • Fattori comportamentali:
    • Di norma, le persone non vanno in insolvenza
      • Più raramente succede, più alto è il rating creditizio
Credit Risk Modeling in Python

Gestire lo squilibrio di classi

  • Vari modi per gestire lo squilibrio di classi
Metodo Pro Contro
Raccogliere più dati Aumenta il numero di insolvenze La percentuale può non cambiare
Penalizzare i modelli Aumenta il recall delle insolvenze Richiede più tuning e manutenzione
Campionare i dati diversamente Regolazione meno tecnica Meno insolvenze nei dati
Credit Risk Modeling in Python

Strategia di undersampling

  • Combina un piccolo campione casuale di non insolvenze con le insolvenze

Diagramma della strategia di undersampling

Credit Risk Modeling in Python

Unire i set suddivisi

  • Ricomponi insieme training e test set
  • Crea due nuovi set in base al loan_status reale
# 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]
Credit Risk Modeling in Python

Undersampling delle non insolvenze

  • Campiona casualmente il set di non insolvenze
  • Concatena con il set di insolvenze
# 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)
Credit Risk Modeling in Python

Passiamo alla pratica !

Credit Risk Modeling in Python

Preparing Video For Download...