Klassimbalans i lånedata

Kreditriskmodellering i Python

Michael Crabtree

Data Scientist, Ford Motor Company

För få fallissemang i datan

  • Värdena i loan_status är klasserna
    • Ej fallissemang: 0
    • Fallissemang: 1
y_train['loan_status'].value_counts()
loan_status Antal i träningsdata Andel av totalt
0 13,798 78%
1 3,877 22%
Kreditriskmodellering i Python

Modellens förlustfunktion

  • Gradientboostade träd i xgboost använder log-loss som förlustfunktion
    • Målet är att minimera detta värde

Formel för log-loss

Verklig lånestatus Förutsedd sannolikhet Log-loss
1 0.1 2.3
0 0.9 2.3
  • Ett felaktigt förutsagt fallissemang har större negativ ekonomisk påverkan
Kreditriskmodellering i Python

Kostnaden för imbalans

  • Ett falskt negativt utfall (fallissemang förutsagt som ej fallissemang) är betydligt mer kostsamt
Person Lånebelopp Potentiell vinst Förutsedd status Verklig status Förlust
A $1,000 $10 Fallissemang Ej fallissemang -$10
B $1,000 $10 Ej fallissemang Fallissemang -$1,000
  • Log-loss är densamma för båda fallen, men de faktiska förlusterna är det inte
Kreditriskmodellering i Python

Orsaker till imbalans

  • Dataproblem
    • Kreditdata samlades inte in korrekt
    • Problem med datalagring
  • Affärsprocesser:
    • Åtgärder finns redan för att avvisa troliga fallissemang
    • Troliga fallissemang säljs snabbt vidare till andra företag
  • Beteendefaktorer:
    • Normalt sett misslyckas folk inte med sina lånebetalningar
      • Ju mer sällan de gör det, desto högre kreditbetyg
Kreditriskmodellering i Python

Hantera klassimbalans

  • Flera metoder för att hantera klassimbalans i data
Metod Fördelar Nackdelar
Samla in mer data Fler fallissemang Andelen kanske inte förändras
Straffa modeller Ökar recall för fallissemang Kräver mer justering och underhåll
Omsampling av data Minst teknisk anpassning Färre fallissemang i data
Kreditriskmodellering i Python

Undersamplingsstrategi

  • Kombinera ett mindre slumpmässigt urval av ej-fallissemang med fallissemang

Diagram över undersamplingsstrategi

Kreditriskmodellering i Python

Slå ihop de uppdelade datamängderna

  • Test- och träningsdata måste slås ihop igen
  • Skapa två nya datamängder baserade på faktisk 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]
Kreditriskmodellering i Python

Undersampla ej-fallissemang

  • Ta ett slumpmässigt urval av ej-fallissemang
  • Konkatenera med datamängden för fallissemang
# 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)
Kreditriskmodellering i Python

Nu kör vi en övning!

Kreditriskmodellering i Python

Preparing Video For Download...