Klassenonevenwicht in leningegevens

Kredietrisicomodellering in Python

Michael Crabtree

Data Scientist, Ford Motor Company

Te weinig defaults in de data

  • De waarden van loan_status zijn de klassen
    • Niet‑default: 0
    • Default: 1
y_train['loan_status'].value_counts()
loan_status Aantal in training Percentage van totaal
0 13,798 78%
1 3,877 22%
Kredietrisicomodellering in Python

Verliesfunctie van het model

  • Gradient Boosted Trees in xgboost gebruiken log‑loss als verliesfunctie
    • Doel: deze waarde minimaliseren

Formule voor log-loss

Werkelijke status Voorspelde kans Log‑loss
1 0.1 2.3
0 0.9 2.3
  • Een fout voorspelde default heeft grotere financiële impact
Kredietrisicomodellering in Python

De kosten van onevenwicht

  • Een false negative (default voorspeld als niet‑default) kost veel meer
Persoon Leenbedrag Potentiële winst Voorspelde status Werkelijke status Verlies
A $1,000 $10 Default Niet‑default -$10
B $1,000 $10 Niet‑default Default -$1,000
  • De log‑loss is voor beide gelijk, onze echte verliezen niet
Kredietrisicomodellering in Python

Oorzaken van onevenwicht

  • Dataproblemen
    • Kredietdata niet correct bemonsterd
    • Problemen met dataopslag
  • Bedrijfsprocessen:
    • Maatregelen om waarschijnlijke defaults te weigeren
    • Waarschijnlijke defaults snel doorverkocht aan andere partijen
  • Gedragsfactoren:
    • Meestal gaan mensen niet in gebreke
      • Hoe minder defaults, hoe hoger de kredietscore
Kredietrisicomodellering in Python

Klassenonevenwicht aanpakken

  • Meerdere manieren om klassenonevenwicht aan te pakken
Methode Pluspunten Minpunten
Meer data verzamelen Meer defaults in absolute zin Percentage defaults verandert misschien niet
Modellen straffen Verhoogt recall voor defaults Meer afstemming en onderhoud nodig
Anders samplen Minst technische aanpassing Minder defaults in data
Kredietrisicomodellering in Python

Undersampling-strategie

  • Combineer een kleine willekeurige steekproef van niet‑defaults met defaults

Diagram van undersampling-strategie

Kredietrisicomodellering in Python

De gesplitste sets samenvoegen

  • Test- en trainingsset moeten weer samengevoegd worden
  • Maak twee nieuwe sets op basis van echte loan_status
# 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]
Kredietrisicomodellering in Python

Niet-defaults undersamplen

  • Trek een willekeurige steekproef uit de niet‑defaults
  • Concateneer met de defaults
# 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)
Kredietrisicomodellering in Python

Laten we oefenen!

Kredietrisicomodellering in Python

Preparing Video For Download...