ローンデータのクラス不均衡

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の勾配ブースティング木はロス関数に対数損失を使用
    • これを最小化することが目標

対数損失の数式

真のローン状態 予測確率 対数損失
1 0.1 2.3
0 0.9 2.3
  • 延滞の誤判定は財務的影響が大きい
Pythonで学ぶクレジットリスクモデリング

不均衡のコスト

  • 偽陰性(延滞を延滞なしと予測)は大きなコスト
貸付額 潜在利益 予測 実際 損失
A $1,000 $10 延滞 延滞なし -$10
B $1,000 $10 延滞なし 延滞 -$1,000
  • モデルの対数損失は同じでも、実損は異なる
Pythonで学ぶクレジットリスクモデリング

不均衡の原因

  • データの問題
    • クレジットデータのサンプリング不備
    • データ保管の問題
  • 業務プロセス
    • 予測延滞を事前に拒否する施策がある
    • 予測延滞は速やかに他社へ売却
  • 行動要因
    • 通常、人はローンを延滞しない
      • 延滞が少ないほど信用スコアは高い
Pythonで学ぶクレジットリスクモデリング

クラス不均衡への対処

  • クラス不均衡への対処法はいくつかある
方法 長所 短所
データを追加収集 延滞件数が増える 延滞の割合は変わらない可能性
モデルにペナルティ 延滞の再現率が向上 追加の調整と保守が必要
サンプリングを変更 技術的調整が少ない データ内の延滞が減る
Pythonで学ぶクレジットリスクモデリング

アンダーサンプリング戦略

  • 延滞なしの小規模ランダム標本を延滞ありと結合する

アンダーサンプリング手法の図

Pythonで学ぶクレジットリスクモデリング

分割データの結合

  • テストと学習セットを元に戻して結合
  • 実際のloan_statusに基づき2つの新セットを作成
# 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で学ぶクレジットリスクモデリング

Passons à la pratique !

Pythonで学ぶクレジットリスクモデリング

Preparing Video For Download...