Desbalanceamento em dados de empréstimos

Modelagem de Risco de Crédito em Python

Michael Crabtree

Data Scientist, Ford Motor Company

Poucos inadimplentes nos dados

  • Os valores de loan_status são as classes
    • Não inadimplente: 0
    • Inadimplente: 1
y_train['loan_status'].value_counts()
loan_status Contagem no treino % do total
0 13,798 78%
1 3,877 22%
Modelagem de Risco de Crédito em Python

Função de perda do modelo

  • Gradient Boosted Trees no xgboost usam log-loss como função de perda
    • O objetivo é minimizá-la

Fórmula do log-loss

Status real do empréstimo Prob. prevista Log-loss
1 0.1 2.3
0 0.9 2.3
  • Um default previsto errado tem impacto financeiro pior
Modelagem de Risco de Crédito em Python

O custo do desbalanceamento

  • Um falso negativo (default previsto como não inadimplente) custa muito mais
Pessoa Valor do empréstimo Lucro potencial Status previsto Status real Perdas
A $1.000 $10 Default Não inadimplente -$10
B $1.000 $10 Não inadimplente Default -$1.000
  • O log-loss do modelo é igual nos dois casos; nossas perdas reais não são
Modelagem de Risco de Crédito em Python

Causas do desbalanceamento

  • Problemas de dados
    • Amostragem de crédito incorreta
    • Problemas de armazenamento
  • Processos de negócio:
    • Medidas para não aceitar prováveis inadimplentes
    • Prováveis inadimplentes são rapidamente vendidos a outras firmas
  • Fatores comportamentais:
    • Normalmente, pessoas não inadimplentes
      • Quanto menos inadimplência, maior a pontuação de crédito
Modelagem de Risco de Crédito em Python

Como lidar com desbalanceamento

  • Há várias formas de lidar com desbalanceamento de classes
Método Prós Contras
Coletar mais dados Aumenta o nº de defaults % de defaults pode não mudar
Penalizar modelos Aumenta o recall de defaults Exige mais ajuste e manutenção
Amostrar diferente Ajuste menos técnico Menos defaults nos dados
Modelagem de Risco de Crédito em Python

Estratégia de subamostragem

  • Combine uma amostra aleatória menor de não inadimplentes com os inadimplentes

Diagrama da estratégia de subamostragem

Modelagem de Risco de Crédito em Python

Reunindo os conjuntos divididos

  • Conjuntos de teste e treino precisam ser reunidos
  • Crie dois novos conjuntos com base no loan_status real
# 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]
Modelagem de Risco de Crédito em Python

Subamostrando os não inadimplentes

  • Amostre aleatoriamente os não inadimplentes
  • Concatene com o conjunto de inadimplentes
# 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)
Modelagem de Risco de Crédito em Python

Vamos praticar!

Modelagem de Risco de Crédito em Python

Preparing Video For Download...