Дисбаланс класів у даних про кредити

Моделювання кредитного ризику в Python

Michael Crabtree

Data Scientist, Ford Motor Company

У даних замало дефолтів

  • Значення loan_status — це класи
    • Без дефолту: 0
    • Дефолт: 1
y_train['loan_status'].value_counts()
loan_status Training Data Count Percentage of Total
0 13,798 78%
1 3,877 22%
Моделювання кредитного ризику в Python

Функція втрат моделі

  • Gradient Boosted Trees у xgboost використовують функцію втрат log-loss
    • Мета — мінімізувати це значення

Формула log-loss

True loan status Predicted probability Log Loss
1 0.1 2.3
0 0.9 2.3
  • Помилково передбачений дефолт має більший фінансовий вплив
Моделювання кредитного ризику в Python

Вартість дисбалансу

  • Хибнонегативний прогноз (дефолт передбачено як без дефолту) значно дорожчий
Person Loan Amount Potential Profit Predicted Status Actual Status Losses
A $1,000 $10 Default Non-Default -$10
B $1,000 $10 Non-Default Default -$1,000
  • Log-loss для моделі однаковий в обох випадках, але наші реальні втрати — ні
Моделювання кредитного ризику в Python

Причини дисбалансу

  • Проблеми даних
    • Кредитні дані вибрано некоректно
    • Проблеми зі зберіганням даних
  • Бізнес-процеси:
    • Вже є заходи, щоб не приймати імовірні дефолти
    • Імовірні дефолти швидко продають іншим компаніям
  • Поведінкові чинники:
    • Зазвичай люди не допускають дефолтів за кредитами
      • Чим рідше дефолти, тим вищий кредитний рейтинг
Моделювання кредитного ризику в Python

Як працювати з дисбалансом класів

  • Кілька способів впоратися з дисбалансом класів
Method Pros Cons
Gather more data Increases number of defaults Percentage of defaults may not change
Penalize models Increases recall for defaults Model requires more tuning and maintenance
Sample data differently Least technical adjustment Fewer defaults in data
Моделювання кредитного ризику в Python

Стратегія андерсемплінгу

  • Поєднайте меншу випадкову вибірку без дефолту з дефолтами

Схема стратегії андерсемплінгу

Моделювання кредитного ризику в Python

Обʼєднання розділених наборів даних

  • Тренувальну й тестову вибірки треба знову обʼєднати
  • Створіть два нові набори за фактичним 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]
Моделювання кредитного ризику в Python

Андерсемплінг класу без дефолту

  • Випадково відіберіть підвибірку без дефолту
  • Обʼєднайте з набором дефолтів
# 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)
Моделювання кредитного ризику в Python

Давайте потренуємось!

Моделювання кредитного ризику в Python

Preparing Video For Download...