Nevyvážené třídy v datech o půjčkách

Credit Risk Modeling in Python

Michael Crabtree

Data Scientist, Ford Motor Company

Nedostatek defaultů v datech

  • Hodnoty loan_status představují třídy
    • Nesplácení: 0
    • Splácení: 1
y_train['loan_status'].value_counts()
loan_status Počet v trénovacích datech Podíl z celku
0 13 798 78 %
1 3 877 22 %
Credit Risk Modeling in Python

Ztrátová funkce modelu

  • Gradient Boosted Trees v xgboost používají log-loss jako ztrátovou funkci
    • Cílem je minimalizovat tuto hodnotu

Vzorec pro log-loss

Skutečný stav půjčky Predikovaná pravděpodobnost Log Loss
1 0.1 2.3
0 0.9 2.3
  • Chybně predikovaný default má větší negativní finanční dopad
Credit Risk Modeling in Python

Náklady nevyváženosti

  • Falešně negativní výsledek (default predikován jako nesplácení) je výrazně nákladnější
Osoba Výše půjčky Potenciální zisk Predikovaný stav Skutečný stav Ztráty
A 1 000 $ 10 $ Default Nesplácení -10 $
B 1 000 $ 10 $ Nesplácení Default -1 000 $
  • Log-loss modelu je pro oba případy stejný, skutečné ztráty nikoli
Credit Risk Modeling in Python

Příčiny nevyváženosti

  • Problémy s daty
    • Kreditní data nebyla správně vzorkována
    • Problémy s ukládáním dat
  • Obchodní procesy:
    • Opatření zabraňující přijetí pravděpodobných defaultů již existují
    • Pravděpodobné defaulty jsou rychle odprodány jiným firmám
  • Behaviorální faktory:
    • Lidé zpravidla půjčky nesplácejí
      • Čím méně nesplácejí, tím vyšší je jejich kreditní hodnocení
Credit Risk Modeling in Python

Řešení nevyváženosti tříd

  • Existuje několik způsobů, jak řešit nevyváženost tříd v datech
Metoda Výhody Nevýhody
Získání více dat Zvyšuje počet defaultů Podíl defaultů se nemusí změnit
Penalizace modelů Zvyšuje recall pro defaulty Model vyžaduje více ladění a údržby
Jiné vzorkování dat Nejmenší technická úprava Méně defaultů v datech
Credit Risk Modeling in Python

Strategie podvzorkování

  • Kombinace menšího náhodného vzorku nesplácených půjček s defaulty

Diagram strategie podvzorkování

Credit Risk Modeling in Python

Spojení rozdělených datových sad

  • Testovací a trénovací sadu je nutné znovu spojit
  • Vytvořit dvě nové sady podle skutečného 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]
Credit Risk Modeling in Python

Podvzorkování nesplácených půjček

  • Náhodný vzorek z datové sady nesplácených půjček
  • Zřetězení s datovou sadou defaultů
# 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

Lass uns üben!

Credit Risk Modeling in Python

Preparing Video For Download...