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

Моделирование кредитного риска на Python

Michael Crabtree

Data Scientist, Ford Motor Company

Дефолтов в данных недостаточно

  • Значения loan_status — это классы
    • Без дефолта: 0
    • Дефолт: 1
y_train['loan_status'].value_counts()
loan_status Количество в обучающей выборке Доля от общего
0 13,798 78%
1 3,877 22%
Моделирование кредитного риска на Python

Функция потерь модели

  • Деревья с градиентным бустингом в xgboost используют логистическую функцию потерь
    • Цель — минимизировать это значение

Формула логистической функции потерь

Истинный статус кредита Предсказанная вероятность Log Loss
1 0.1 2.3
0 0.9 2.3
  • Неверно предсказанный дефолт несёт большие финансовые потери
Моделирование кредитного риска на Python

Цена дисбаланса

  • Ложноотрицательный результат (дефолт предсказан как отсутствие дефолта) обходится значительно дороже
Клиент Сумма кредита Потенциальная прибыль Предсказанный статус Фактический статус Потери
A $1,000 $10 Дефолт Без дефолта -$10
B $1,000 $10 Без дефолта Дефолт -$1,000
  • Log-loss модели одинаков в обоих случаях, а реальные потери — нет
Моделирование кредитного риска на Python

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

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

Работа с дисбалансом классов

  • Существует несколько способов устранить дисбаланс классов
Метод Преимущества Недостатки
Сбор дополнительных данных Увеличивает число дефолтов Доля дефолтов может не измениться
Штрафные модели Повышает полноту для дефолтов Требует дополнительной настройки и сопровождения
Изменение выборки Минимальная техническая сложность Меньше дефолтов в данных
Моделирование кредитного риска на 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...