領(lǐng)取風(fēng)控資料合集 不知不覺(jué)中,Python已經(jīng)在短短幾年內(nèi)一躍成為最熱門的編程語(yǔ)言之一,尤其是在數(shù)據(jù)科學(xué)、人工智能和機(jī)器學(xué)習(xí)領(lǐng)域。這除了因?yàn)镻ython相對(duì)簡(jiǎn)單易學(xué),可讀性高之外,也有很大一部分原因是因?yàn)镻ython有著良好的開(kāi)源生態(tài)從而產(chǎn)生了許多強(qiáng)大的第三方庫(kù),這些庫(kù)可供直接調(diào)用,為開(kāi)發(fā)人員的工作提供了極大的便利。風(fēng)控領(lǐng)域亦是如此,以最常用、最經(jīng)典的信用風(fēng)險(xiǎn)評(píng)分卡模型為例,第三方的庫(kù)就有謝士晨博士開(kāi)發(fā)的Scorecardpy以及今天我們要重點(diǎn)介紹的toad。toad是針對(duì)風(fēng)險(xiǎn)評(píng)分卡的建模而開(kāi)發(fā)的工具包,其功能全面,性能強(qiáng)大,從數(shù)據(jù)探索EDA、特征篩選、特征分箱、WOE變換,到建模、模型評(píng)估、轉(zhuǎn)換分?jǐn)?shù),對(duì)評(píng)分卡模型的各個(gè)步驟都做了完整的封裝,極大的簡(jiǎn)化了建模的復(fù)雜程度,深受從業(yè)人員的喜愛(ài)。下面我們將根據(jù)建模實(shí)際的流程,分布為大家介紹toad包的各種功能。在開(kāi)始之前先簡(jiǎn)單說(shuō)一下toad庫(kù)的安裝與升級(jí),和其他的庫(kù)一樣,直接使用pip即可:- 升級(jí):pip install --upgrade toad
0.導(dǎo)入庫(kù)與數(shù)據(jù)讀取可以看到,演示數(shù)據(jù)共有50000條數(shù)據(jù),16個(gè)特征,包含14個(gè)特征變量,一列主鍵和一列標(biāo)簽(Defaulter)列。其中有若干個(gè)離散型變量和連續(xù)性變量,且有一定的缺失值。為了后續(xù)模型能夠檢驗(yàn),我們使用sklearn里的train_test_split將數(shù)據(jù)劃分為訓(xùn)練集(30000條)與測(cè)試集(20000條)。(1)toad.detect(dataframe)用于檢測(cè)數(shù)據(jù)情況(EDA),方便我們對(duì)數(shù)據(jù)有一個(gè)總體的印象。輸出每列特征的統(tǒng)計(jì)性特征和其他信息,主要的信息包括:缺失值、unique values、數(shù)值變量的平均值、離散型變量的眾數(shù)等。如下面的cell,可以得到以下信息:- 壞客戶的占比為16.2%:Defaulter的mean為0.162;
- 部分特征有缺失值,且缺失值不等:注意missing列;
- 數(shù)值型變量和離散型變量有若干個(gè),部分離散型變量的unique values較多,有10多個(gè)甚至61個(gè):離散型變量的unique列。
(2)toad.quality(dataframe, target='target', iv_only=False)輸出每個(gè)變量的iv值,gini,entropy,和unique values,結(jié)果以iv值排序。'target'為目標(biāo)列,'iv_only'決定是否只輸出iv值。- 對(duì)于數(shù)據(jù)量大或高維度數(shù)據(jù),建議使用iv_only=True
- 要去掉主鍵,日期等高unique values且不用于建模的特征
(1)toad.selection.select(dataframe, target='target', empty=0.9, iv=0.02, corr=0.7, return_drop=False, exclude=None)根據(jù)缺失值占比,iv值,和高相關(guān)性進(jìn)行變量篩選,各參數(shù)含義為:- empty=0.9:若變量的缺失值大于0.9則被刪除;
- iv=0.02:若變量的iv值小于0.02則被刪除;
- corr=0.7:若兩個(gè)變量的相關(guān)性高于0.7時(shí),iv值低的變量則被刪除;
- return_drop=False:若為True,function將返回被刪去的變量列;
- exclude=None:明確不被刪去的列名,輸入為list格式;
如下面的cell,沒(méi)有變量由于缺失值高被刪除,3個(gè)變量因?yàn)榈蚷v值被刪除,1個(gè)相關(guān)性高的變量被刪除。從14個(gè)特征中選出了10個(gè)變量。在實(shí)際工作中,只需要根據(jù)需求調(diào)整各個(gè)參數(shù)值,即可完成變量的初篩,對(duì)于有特殊含義需要保留但不滿足篩選要求的變量,也可以在exclude里保留。(2)分箱toad.transform.Combinertoad的分箱功能支持?jǐn)?shù)值型數(shù)據(jù)和離散型分箱,集成了各種常用的分箱方法,包括卡方分箱(默認(rèn))、決策樹(shù)分箱、等頻分箱、等距分箱、最優(yōu)分箱等。toad.transform.Combiner 是用來(lái)分箱的class,具體分箱步驟如下:- 初始化:c = toad.transform.Combiner()
- 訓(xùn)練分箱:c.fit(dataframe, y = 'target', method = 'chi', min_samples = None, n_bins = None, empty_separate = False)
Method:分箱方法,支持'chi' (卡方分箱),'dt' (決策樹(shù)分箱),'kmean','quantile' (等頻分箱),'step'(等步長(zhǎng)分箱)等min_samples:每箱至少包含樣本量,可以是數(shù)字或者占比n_bins:箱數(shù),若無(wú)法分出這么多箱數(shù),則會(huì)分出最多的箱數(shù)empty_separate:是否將空箱單獨(dú)分開(kāi)- 查看分箱節(jié)點(diǎn):c.export()
- 手動(dòng)調(diào)整分箱:c.load(dict)
- apply分箱結(jié)果:c.transform(dataframe, labels=False)
- Labels:是否將分箱結(jié)果轉(zhuǎn)化成箱標(biāo)簽。False時(shí)輸出0,1,2…(離散變量根據(jù)占比高低排序),True輸出(-inf, 0], (0,10], (10, inf)。
注意:記得刪去不需要分箱的列,比如是ID列和時(shí)間列(3)觀察分箱:toad.plot.bin_plot(dataframe, x = None, target = 'target')toad.plot的module提供了一部分的可視化功能,幫助調(diào)整分箱節(jié)點(diǎn)。bar代表了樣本量占比,紅線代表了正樣本占比(e.g. 壞賬率)(4)調(diào)整分箱:c.update(dict)WOE轉(zhuǎn)化在分箱調(diào)整好之后進(jìn)行,步驟如下:- 用調(diào)整好的Combiner轉(zhuǎn)化數(shù)據(jù):c.transform(dataframe, labels=False)
- 初始化woe transer:transer = toad.transform.WOETransformer()
- fit_transform:transer.fit_transform(dataframe, target, exclude = None)訓(xùn)練并輸出woe轉(zhuǎn)化的數(shù)據(jù),用于轉(zhuǎn)化train數(shù)據(jù)
target:目標(biāo)列數(shù)據(jù)(非列名)Exclude:不需要被WOE轉(zhuǎn)化的列注意:會(huì)轉(zhuǎn)化所有列,包括未被分箱transform的列,通過(guò)'exclude'刪去不要WOE轉(zhuǎn)化的列,特別是target列- 根據(jù)訓(xùn)練好的transer,轉(zhuǎn)化test數(shù)據(jù):transer.transform(dataframe)
toad.selection.stepwise(dataframe, target='target', estimator='ols', direction='both', criterion='aic', max_iter=None, return_drop=False, exclude=None)- estimator: 用于擬合的模型,支持'ols', 'lr', 'lasso', 'ridge'
- direction: 逐步回歸的方向,支持'forward', 'backward', 'both'(推薦)
- criterion: 評(píng)判標(biāo)準(zhǔn),支持'aic', 'bic', 'ks', 'auc'
- max_iter: 最大循環(huán)次數(shù)
- exclude: 不需要被訓(xùn)練的列名,比如ID列和時(shí)間列
Tip:經(jīng)驗(yàn)證,direction = 'both'效果最好。estimator = 'ols'以及criterion = 'aic'運(yùn)行速度快且結(jié)果對(duì)邏輯回歸建模有較好的代表性。toad.metrics.PSI(df_train, df_test)輸出每列特征的PSI,可以用于檢驗(yàn)WOE轉(zhuǎn)化后的特征穩(wěn)定性下面評(píng)估模型的結(jié)果,風(fēng)控模型常用的評(píng)分指標(biāo)有KS,AUC,PSI等。我們可以用toad快速輸出這些指標(biāo):另外,toad還提供了KS bucket功能,輸出模型預(yù)測(cè)分箱后評(píng)判信息,包括每組的分?jǐn)?shù)區(qū)間,樣本量,壞賬率,KS等。toad.metrics.KS_bucket(predicted_proba, y_true, bucket=10, method = 'quantile')- method:分箱方法,建議用'quantile'(等人數(shù)),或'step' (等分?jǐn)?shù)步長(zhǎng))
toad.ScoreCard(combiner = {}, transer = None, pdo = 60, rate = 2, base_odds = 20, base_score = 750, card = None, C=0.1,kwargs)邏輯回歸模型轉(zhuǎn)標(biāo)準(zhǔn)評(píng)分卡,支持傳入邏輯回歸參數(shù),進(jìn)行調(diào)參。- combiner:傳入訓(xùn)練好的toad.Combiner對(duì)象
- transer:傳入先前訓(xùn)練的toad.WOETransformer對(duì)象
- pdo、rate、base_odds、base_score:e.g. pdo=60, rate=2, base_odds=20,base_score=750
實(shí)際意義為當(dāng)比率為1/20,輸出基準(zhǔn)評(píng)分750,當(dāng)比率為基準(zhǔn)比率2倍時(shí),基準(zhǔn)分下降60分- kwargs: 支持傳入邏輯回歸參數(shù)(參數(shù)詳見(jiàn)sklearn.linear_model.LogisticRegression)
注意:評(píng)分卡在fit時(shí)使用WOE轉(zhuǎn)換后的數(shù)據(jù)來(lái)計(jì)算最終的分?jǐn)?shù),分?jǐn)?shù)一旦計(jì)算完成,便無(wú)需WOE值,可以直接使用原始數(shù)據(jù)進(jìn)行評(píng)分。至此,我們就用toad快速完成了一個(gè)評(píng)分卡模型的全流程,可以說(shuō)是非常方便了,沒(méi)有使用太多第三方庫(kù),除了基本的numpy,pandas就只用到了toad和一點(diǎn)點(diǎn)sklearn,這也可以看出toad確實(shí)將評(píng)分卡的全流程都進(jìn)行了完整的封裝,足以滿足大部分工作的需求。本文以介紹toad庫(kù)的功能為主要目的,展示了評(píng)分卡建模的基礎(chǔ)流程,實(shí)際工作中只需要根據(jù)數(shù)據(jù)的特點(diǎn)和工作的需求進(jìn)行流程和參數(shù)的一些調(diào)整即可。https://github.com/amphibian-dev/toad如果你喜歡、想要看更多的干貨類型的文章,可以把公眾號(hào)設(shè)為星標(biāo)??,順便轉(zhuǎn)發(fā)分享~
|