評分卡建模Toad庫的使用

  信貸評分卡中常用的兩個庫有scorecardpy和Toad。其中scorecardpy是由謝士晨博士開發,Toad是由厚本金融風控團隊內部孵化產生的標準評分卡庫。本文以Toad官方指導教程爲例,講解如何運用Toad庫進行傻瓜式的評分卡開發。

Toad基礎教程

參考自Toad庫中的Basic Tutorial for Toad.

Toad遵循信用風險記分卡模型開發的一般流程:
(1)EDA
(2)特徵的選擇與WOE分箱的結合
(3)模型選擇
(4)模型驗證
(5)評分卡轉換

數據準備

本文使用的數據是著名的德國信用卡數據集。數據預處理包括:
(1)將target從’good’ / 'bad’替換爲0,1;
(2)劃分訓練集測試集;
(3)增加一列表示訓練和測試的特徵。訓練集將用於建模,而測試集將僅用於驗證。

import pandas as pd
import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
import toad

data = pd.read_csv('germancredit.csv')
data.replace({'good':0,'bad':1},inplace=True)

print(data.shape) # 1000 data and 20 features 
data.head()

  劃分訓練集和測試集:

Xtr,Xts,Ytr,Yts = train_test_split(data.drop('creditability',axis=1),data['creditability'],test_size=0.25,random_state=450)
data_tr = pd.concat([Xtr,Ytr],axis=1)
#增加一列區分訓練/測試的特徵
data_tr['type'] = 'train'
data_ts = pd.concat([Xts,Yts],axis=1)
data_ts['type'] = 'test'

一、EDA數據處理

  Toad支持常用的特徵EDA分析,包括檢測缺失值和特徵分佈。

toad.detector.detect():返回每個特性的EDA報告,包括數據類型、分佈、缺失率和惟一值。

toad.detector.detect(data_tr).head(10)

二、特徵選擇,WOE轉換

  Toad可以用來過濾大量的特徵,如高缺失率、低iv和高度相關的特徵。它還可以使用各種分箱技巧進行分箱和實現WOE轉化。

toad.selection.select():用於根據缺失百分比、iv(20箱)和多重共線性(帶有VIF和/或自相關)來過濾特徵。

  下面以缺失率大於0.5.IV值小於0.05或者相關性大於0.7(保留較高的特徵)來進行特徵篩選。

selected_data, drop_lst= toad.selection.select(data_tr,target = 'creditability', empty = 0.5, iv = 0.05, corr = 0.7, return_drop=True, exclude=['type'])

selected_test = data_ts[selected_data.columns]

print(selected_data.shape)
drop_lst 

  可以看到,8個特徵由於IV值過低被剔除。

toad.quality(dataframe, target):返回每個特徵的質量,包括iv、基尼係數和熵。可以幫助我們發現更有用的潛在信息。

quality = toad.quality(data,'creditability')
quality.head(6)

分箱

第一步:分箱

toad.transform.Combiner():可以用來對數值型和類別型變量進行分箱,支持決策樹分箱、卡方分箱、最優分箱等。該行代碼生成一個Combiner類,這個類有以下方法:
combiner().fit(data, y = ‘target’, method = ‘chi’, min_samples = None, n_bins = None ):分箱,支持卡方、決策樹、等頻和等寬。
combiner().set_rules(dict):設置箱號。
combiner().transform(data): 將特徵的值轉化爲分箱的箱號。

# 初始化一個combiner類
combiner = toad.transform.Combiner()

# 訓練數據並指定分箱方法,其它參數可選
combiner.fit(selected_data,y='creditability',method='chi',min_samples =  0.05,exclude='type')

# 以字典形式保存分箱結果
bins = combiner.export() 

#查看每個特徵的分箱結果
print('status.of.existing.checking.account:',bins['status.of.existing.checking.account'])
print('credit.amount:',bins['credit.amount'])
print('duration.in.month:', bins['duration.in.month'])

第二步:WOE分箱可視化

toad.plot.badrate_plot(data,target = ‘target’, x = None, by = None): 畫出不同數據集的每一箱的bad_rate圖。這裏可以是訓練集測試集,也可以不同月份的對比。by後面是縱軸。x是需要對比的維度,比如訓練集測試集、不同的月份。
toad.plot.proportion_plot(datacol): 畫出一個特徵每一箱的比例。

# 根據bad_rate圖調整分箱

# 比如查看duration.in.month這個變量的分箱情況
adj_bin = {'duration.in.month': [9, 12, 18, 33]}

c2 = toad.transform.Combiner()
c2.set_rules(adj_bin)

data_ = pd.concat([data_tr,data_ts],axis = 0)
temp_data = c2.transform(data_[['duration.in.month','creditability','type']])

from toad.plot import badrate_plot, proportion_plot
badrate_plot(temp_data, target = 'creditability', x = 'type', by = 'duration.in.month') 
proportion_plot(temp_data['duration.in.month'])

  第一張圖是訓練集和測試集下每一箱對應的壞樣本率,第二張圖是每一箱的佔比情況。可以看到第一張圖中的第一箱和第二箱的bad_rate存在倒掛,說明bad_rate不單調,需要進行調整。可以嘗試將第一箱和第二箱進行合併。

# 假定將第一箱、第二箱合併
adj_bin = {'duration.in.month': [9, 18,33]}
c2.set_rules(adj_bin)

temp_data = c2.transform(data_[['duration.in.month','creditability','type']])
badrate_plot(temp_data, target = 'creditability', x = 'type', by = 'duration.in.month')

adj_bin = {'duration.in.month': [9, 18,33],'foreign.worker': [['no'], ['yes']]}

  調整之後可以看到分箱的bad_rate大致呈現單調的趨勢。

第三步:分箱轉化

toad.transform.WOETransformer():對分箱後的數據進行WOE轉化
WOETransformer().fit_transform(data, y_true, exclude = None):

#設置分箱號 
combiner.set_rules(adj_bin)

#將特徵的值轉化爲分箱的箱號。
binned_data = combiner.transform(selected_data)

#計算WOE
transer = toad.transform.WOETransformer()

#對WOE的值進行轉化,映射到原數據集上。對訓練集用fit_transform,測試集用transform.
data_tr_woe = transer.fit_transform(binned_data, binned_data['creditability'], exclude=['creditability','type'])
data_ts_woe = transer.transform(combiner.transform(selected_test))

模型選擇

toad.selection.stepwise():可以通過向前、向後、雙向選擇來進行特徵選擇,使用AIC/BIC/KS/AUC作爲選擇標準。

final_data = toad.selection.stepwise(data_tr_woe.drop('type',axis=1),target = 'creditability',direction = 'both', criterion = 'aic')

final_test = data_ts_woe[final_data.columns]
print(final_data.shape)
print(final_data.columns)

  可以看到經過模型選擇,15個特徵減少爲8個特徵。

建模

Xtr = final_data.drop('creditability',axis=1)
Ytr = final_data['creditability']
Xts = final_test.drop('creditability',axis=1)
Yts = final_test['creditability']

lr = LogisticRegression()
lr.fit(Xtr, Ytr)

模型評估和驗證

  1. 常用的評估指標如KS、F1、AUC
from toad.metrics import KS, F1, AUC

EYtr_proba = lr.predict_proba(Xtr)[:,1]
EYtr = lr.predict(Xtr)

print('Training error')
print('F1:', F1(EYtr_proba,Ytr))
print('KS:', KS(EYtr_proba,Ytr))
print('AUC:', AUC(EYtr_proba,Ytr))

EYts_proba = lr.predict_proba(Xts)[:,1]
EYts = lr.predict(Xts)

print('\nTest error')
print('F1:', F1(EYts_proba,Yts))
print('KS:', KS(EYts_proba,Yts))
print('AUC:', AUC(EYts_proba,Yts))

  1. PSI
    比較訓練集和測試集各變量的穩定性。
psi = toad.metrics.PSI(final_data,final_test)
psi.sort_values(0,ascending=False) # Further tune the unstable feature if any 

  1. KS
tr_bucket = toad.metrics.KS_bucket(EYtr_proba,Ytr,bucket=10,method='quantile')
tr_bucket

分數轉換

card = toad.scorecard.ScoreCard(combiner = combiner, transer = transer , C = 0.1) 
card.fit(Xtr, Ytr)
card.export(to_frame = True,).head(10)

  可以輸出每個變量的得分情況。

A complete tutorial

  以下參考自A complete tutorial,對基礎版中未提到的部分進行補充。

  1. 卡方分箱時加上min_samples參數。
      不設置min_samples參數的話,默認分爲10箱,分箱結果由於bad_rate不單調而不能直接使用,不過可以手動對分箱進行調整。
combiner = toad.transform.Combiner()
combiner.fit(data_tr2,y='creditability',method='chi',min_samples = 0.05)
combiner.export()
  1. 使用bin_plot()畫圖對分箱進行調整
      使用bin_plot對樣本集分箱進行調整,使用bad_rate驗證分箱在測試集或者跨時間驗證集上的穩定性。
from toad.plot import bin_plot

transformed = combiner.transform(data_tr2,labels=True)
#傳給bin_plot的數據必須是分箱轉化之後的
bin_plot(transformed,x='duration.in.month',target='creditability')

  柱形圖表示每一箱的佔比,折線圖表示每一箱的壞樣本率。一般折線圖要呈現出單調的趨勢。
  再看一個對類別型變量分箱進行調整的例子。對類別型變量進行分箱的時候,易出現某個類別只有好樣本/壞樣本,這樣對計算WOE值造成問題,所以需要將只有好/壞樣本的箱進行合併。

#分箱合併
c2.set_rules({'purpose': [['domestic appliances','retraining','car (used)'], ['radio/television'], ['furniture/equipment','repairs','business','car (new)'], ['education','others']]})
bin_plot(c2.transform(data_tr2[['purpose','creditability']],labels=True),x='purpose',target='creditability')

總結:Toad庫的出現使得評分卡建模越來越傻瓜式,技術是通用的,但是背後的業務理解需要在實踐中不斷加深理解。評分卡建模的代碼基本可以固化成一套,接下來就是根據業務理解去調整模型。總之,任何脫離業務的模型都是空中樓閣,只有帶來實際價值纔是王道。

Toad庫相關的文檔:

github主頁:
https://github.com/amphibian-dev/toad
文檔:
https://toad.readthedocs.io
中文文檔:
https://toad.readthedocs.io/en/dev/tutorial_chinese.html
演示:
https://toad.readthedocs.io/en/latest/tutorial.html
whl下載地址:
https://pypi.org/simple/toad/

【作者】:Labryant
【原創公衆號】:風控獵人
【簡介】:某創業公司策略分析師,積極上進,努力提升。乾坤未定,你我都是黑馬。
【轉載說明】:轉載請說明出處,謝謝合作!~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章