Niezbalansowanie klas w danych kredytowych

Modelowanie ryzyka kredytowego w Pythonie

Michael Crabtree

Data Scientist, Ford Motor Company

Za mało defaultów w danych

  • Wartości loan_status to klasy
    • Brak defaultu: 0
    • Default: 1
y_train['loan_status'].value_counts()
loan_status Liczba w zbiorze treningowym Procent całości
0 13 798 78%
1 3 877 22%
Modelowanie ryzyka kredytowego w Pythonie

Funkcja straty modelu

  • Gradient Boosted Trees w xgboost używają funkcji straty log-loss
    • Celem jest minimalizacja tej wartości

Wzór na log-loss

Rzeczywisty status Prawdopodobieństwo predykcji Log-loss
1 0.1 2.3
0 0.9 2.3
  • Błędnie przewidziany default ma większe negatywne skutki finansowe
Modelowanie ryzyka kredytowego w Pythonie

Koszt niezbalansowania

  • Fałszywy negatyw (default przewidziany jako brak defaultu) jest znacznie kosztowniejszy
Osoba Kwota pożyczki Potencjalny zysk Przewidziany status Rzeczywisty status Straty
A 1 000 USD 10 USD Default Brak defaultu -10 USD
B 1 000 USD 10 USD Brak defaultu Default -1 000 USD
  • Log-loss modelu jest taki sam dla obu przypadków, rzeczywiste straty — nie
Modelowanie ryzyka kredytowego w Pythonie

Przyczyny niezbalansowania

  • Problemy z danymi:
    • Nieprawidłowe próbkowanie danych kredytowych
    • Problemy z przechowywaniem danych
  • Procesy biznesowe:
    • Mechanizmy odrzucania prawdopodobnych defaultów już istnieją
    • Prawdopodobne defaulty są szybko sprzedawane innym firmom
  • Czynniki behawioralne:
    • Zazwyczaj klienci nie dopuszczają do defaultu
      • Im rzadziej to robią, tym wyższy jest ich rating kredytowy
Modelowanie ryzyka kredytowego w Pythonie

Radzenie sobie z niezbalansowaniem klas

  • Kilka sposobów na radzenie sobie z niezbalansowaniem klas
Metoda Zalety Wady
Zebranie większej ilości danych Zwiększa liczbę defaultów Procent defaultów może się nie zmienić
Penalizacja modeli Zwiększa recall dla defaultów Model wymaga więcej strojenia i utrzymania
Inne próbkowanie danych Najmniej techniczna korekta Mniej defaultów w danych
Modelowanie ryzyka kredytowego w Pythonie

Strategia undersamplingu

  • Połączenie mniejszej losowej próbki nie-defaultów z defaultami

Diagram strategii undersamplingu

Modelowanie ryzyka kredytowego w Pythonie

Łączenie podzielonych zbiorów danych

  • Zbiory testowy i treningowy należy z powrotem połączyć
  • Tworzymy dwa nowe zbiory na podstawie 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]
Modelowanie ryzyka kredytowego w Pythonie

Undersampling nie-defaultów

  • Losowe próbkowanie zbioru nie-defaultów
  • Konkatenacja ze zbiorem defaultów
# 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)
Modelowanie ryzyka kredytowego w Pythonie

Czas na ćwiczenia!

Modelowanie ryzyka kredytowego w Pythonie

Preparing Video For Download...