Klassenungleichgewicht bei Kreditdaten

Kreditrisikomodellierung in Python

Michael Crabtree

Data Scientist, Ford Motor Company

Zu wenige Ausfälle in den Daten

  • Die Werte von loan_status sind die Klassen
    • Kein Ausfall: 0
    • Ausfall: 1
y_train['loan_status'].value_counts()
loan_status Trainingsanzahl Prozent vom Gesamt
0 13,798 78%
1 3,877 22%
Kreditrisikomodellierung in Python

Verlustfunktion des Modells

  • Gradient Boosted Trees in xgboost nutzen Log-Loss als Verlustfunktion
    • Ziel: diesen Wert minimieren

Formel für Log-Loss

Wahrer Status Vorhergesagte Wahrscheinlichkeit Log-Loss
1 0.1 2.3
0 0.9 2.3
  • Ein falsch vorhergesagter Ausfall hat höhere finanzielle Folgen
Kreditrisikomodellierung in Python

Die Kosten von Ungleichgewicht

  • Ein False Negative (Ausfall als Kein Ausfall prognostiziert) ist viel teurer
Person Kredithöhe Potenzieller Gewinn Prognose Tatsächlich Verluste
A $1,000 $10 Ausfall Kein Ausfall -$10
B $1,000 $10 Kein Ausfall Ausfall -$1,000
  • Der Log-Loss ist in beiden Fällen gleich, unsere realen Verluste nicht
Kreditrisikomodellierung in Python

Ursachen des Ungleichgewichts

  • Datenprobleme
    • Kreditdaten falsch gesampelt
    • Probleme bei der Datenspeicherung
  • Geschäftsprozesse:
    • Maßnahmen, um wahrscheinliche Ausfälle nicht anzunehmen
    • Wahrscheinliche Ausfälle werden schnell verkauft
  • Verhaltensfaktoren:
    • Normalerweise fallen Menschen nicht aus
      • Je seltener der Ausfall, desto höher das Rating
Kreditrisikomodellierung in Python

Umgang mit Klassenungleichgewicht

  • Mehrere Wege, Klassenungleichgewicht zu adressieren
Methode Vorteile Nachteile
Mehr Daten sammeln Erhöht Anzahl der Ausfälle Anteil der Ausfälle bleibt evtl. gleich
Modelle bestrafen Erhöht Recall für Ausfälle Mehr Tuning und Pflege nötig
Anders sampeln Geringster technischer Aufwand Weniger Ausfälle in den Daten
Kreditrisikomodellierung in Python

Undersampling-Strategie

  • Kleinere Zufallsstichprobe der Nicht-Ausfälle mit Ausfällen kombinieren

Diagramm der Undersampling-Strategie

Kreditrisikomodellierung in Python

Die aufgeteilten Datensets zusammenführen

  • Test- und Trainingsset müssen wieder zusammengeführt werden
  • Zwei neue Sets nach tatsächlichem loan_status bilden
# 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]
Kreditrisikomodellierung in Python

Nicht-Ausfälle undersamplen

  • Zufällig Stichprobe der Nicht-Ausfälle ziehen
  • Mit den Ausfällen zusammenfügen
# 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)
Kreditrisikomodellierung in Python

Lass uns üben!

Kreditrisikomodellierung in Python

Preparing Video For Download...