我是小z
本次分享一個(gè)數(shù)據(jù)挖掘?qū)崙?zhàn)項(xiàng)目:個(gè)人信貸違約預(yù)測(cè),此項(xiàng)目對(duì)于想要學(xué)習(xí)信貸風(fēng)控模型的同學(xué)非常有幫助,數(shù)據(jù)源在文末。
項(xiàng)目背景
當(dāng)今社會(huì),個(gè)人信貸業(yè)務(wù)發(fā)展迅速,但同時(shí)也會(huì)暴露較高的信用風(fēng)險(xiǎn)。信息不對(duì)稱在金融貸款領(lǐng)域突出,表現(xiàn)在過去時(shí)期借款一方對(duì)自身的財(cái)務(wù)狀況、還款能力及還款意愿有著較為全面的掌握,而金融機(jī)構(gòu)不能全面獲知借款方的風(fēng)險(xiǎn)水平,或在相關(guān)信息的掌握上具有明顯的滯后性。這種信息劣勢(shì),使得金融機(jī)構(gòu)在貸款過程中可能由于風(fēng)險(xiǎn)評(píng)估與實(shí)際情況的偏離,產(chǎn)生資金損失,直接影響金融機(jī)構(gòu)的利潤(rùn)水平。
而現(xiàn)今時(shí)間金融機(jī)構(gòu)可以結(jié)合多方數(shù)據(jù),提前對(duì)客戶風(fēng)險(xiǎn)水平進(jìn)行評(píng)估,并做出授信決策。
解決方法
運(yùn)用分類算法預(yù)測(cè)違約
模型選擇
單模型: 決策樹、貝葉斯、SVM等
集成模型: 隨機(jī)森林、梯度提升樹等
評(píng)分卡模型: 邏輯回歸
項(xiàng)目可輸出: 評(píng)分卡
數(shù)據(jù)描述 數(shù)據(jù)總體概述
可用的訓(xùn)練數(shù)據(jù)包括用戶的基本屬性u(píng)ser_info.txt、銀行流水記錄bank_detail.txt、用戶瀏覽行為browse_history.txt、信用卡賬單記錄bill_detail.txt、放款時(shí)間loan_time.txt,以及這些顧客是否發(fā)生逾期行為的記錄overdue.txt。(注意:并非每一位用戶都有非常完整的記錄,如有些用戶并沒有信用卡賬單記錄,有些用戶卻沒有銀行流水記錄。)
相應(yīng)地,還有用于測(cè)試的用戶的基本屬性、銀行流水、信用卡賬單記錄、瀏覽行為、放款時(shí)間等數(shù)據(jù)信息,以及待預(yù)測(cè)用戶的id列表。
脫敏處理:(a) 隱藏了用戶的id信息;(b) 將用戶屬性信息全部數(shù)字化;(c) 將時(shí)間戳和所有金額的值都做了函數(shù)變換。
(1)用戶的基本屬性u(píng)ser_info.txt。共6個(gè)字段,其中字段性別為0表示性別未知。
用戶id,性別,職業(yè),教育程度,婚姻狀態(tài),戶口類型 6346,1,2,4,4,2
(2)銀行流水記錄bank_detail.txt。共5個(gè)字段,其中,第2個(gè)字段,時(shí)間戳為0表示時(shí)間未知;第3個(gè)字段,交易類型有兩個(gè)值,1表示支出、0表示收入;第5個(gè)字段,工資收入標(biāo)記為1時(shí),表示工資收入。
用戶id,時(shí)間戳,交易類型,交易金額,工資收入標(biāo)記 6951,5894316387,0,13.756664,0
(3)用戶瀏覽行為browse_history.txt。共4個(gè)字段。其中,第2個(gè)字段,時(shí)間戳為0表示時(shí)間未知。
用戶id,時(shí)間戳,瀏覽行為數(shù)據(jù),瀏覽子行為編號(hào) 34724,5926003545,172,1
(4)信用卡賬單記錄bill_detail.txt。共15個(gè)字段,其中,第2個(gè)字段,時(shí)間戳為0表示時(shí)間未知。為方便瀏覽,字段以表格的形式給出。
(6)顧客是否發(fā)生逾期行為的記錄overdue.txt。共2個(gè)字段。樣本標(biāo)簽為1,表示逾期30天以上;樣本標(biāo)簽為0,表示逾期10天以內(nèi)。
注意:逾期10天~30天之內(nèi)的用戶,并不在此問題考慮的范圍內(nèi)。用于測(cè)試的用戶,只提供id列表,文件名為testUsers.csv。
用戶id,樣本標(biāo)簽 1,1 2,0 3,1
各個(gè)數(shù)據(jù)表之間的關(guān)系
數(shù)據(jù)預(yù)處理
從表中數(shù)據(jù)得知并非每一位用戶都有非常完整的記錄,如有些用戶并沒有信用卡賬單記錄,有些用戶卻沒有銀行流水記錄。
發(fā)現(xiàn)用戶信息表,是否逾期表,放款時(shí)間表這三張表的id數(shù)目都是55,596,銀行流水表為9,294,瀏覽信息表為47,330,信用卡賬單表為53,174。通過用戶id數(shù)得到并非每個(gè)用戶都有銀行流水記錄、信用卡賬單等信息,所以這里我們?nèi)?個(gè)表共同用戶的記錄篩選后組成完整的表。
我們要預(yù)測(cè)的測(cè)試集都是還沒有放款的用戶特征,所以訓(xùn)練數(shù)據(jù)這里我們也選取放款時(shí)間之前的特征,將存在時(shí)間戳的表與放款時(shí)間表進(jìn)行交叉,只篩選此時(shí)間范圍內(nèi)的用戶id。
篩選出這6張表共有的用戶id,得出5735個(gè)用戶的記錄是完整的。
user.T
銀行賬單表
bank_detail_select?=?pd.merge(left=df_bank_detail_train,?
??????????????????????????????right=user,?
??????????????????????????????how='inner',?
??????????????????????????????on='用戶id')
統(tǒng)計(jì)用戶進(jìn)賬單數(shù),求和
統(tǒng)計(jì)用戶支出單數(shù),求和
統(tǒng)計(jì)用戶工資收入計(jì)數(shù),求和
銀行賬單表
bank_train.head()
瀏覽表
先剔除5735以外的數(shù)據(jù),再統(tǒng)計(jì)每個(gè)用戶的瀏覽記錄(count)
browse_train.head()
賬單表
去掉了時(shí)間、銀行id、還款狀態(tài)這幾個(gè)變量,按用戶id分組后對(duì)每個(gè)字段均值化處理。
逾期表、用戶表
合并五張表
將篩選后的五個(gè)表進(jìn)行合并,得出25個(gè)字段
df_train=user_train.merge(bank_train)
df_train=df_train.merge(bill_train)
df_train=df_train.merge(browse_train)
df_train=df_train.merge(overdue_train)
df_train.head()
查看完整表格的基本情況,無缺失值,均是數(shù)值類型。
df_train.info()
特征工程 基于業(yè)務(wù)理解的篩選 銀行流水記錄特征相關(guān)性分析
#?相關(guān)性結(jié)果數(shù)據(jù)表
corrmat=bank_train[internal_chars].corr()??
#熱力圖
sns.heatmap(corrmat,?square=True,?
????????????linewidths=.5,?annot=True);?
總表相關(guān)性分析
#?相關(guān)性結(jié)果數(shù)據(jù)表
corrmat=df_train[internal_chars].corr()
#?熱力圖
sns.heatmap(corrmat,?square=False,?
????????????linewidths=.5,?annot=True);??
本期的賬單余額與最低還款額具有高度共線性,決定只選用最低還款額。
生產(chǎn)衍射變量
上期還款差額 =上期賬單金額 - 上期還款金額, 上期還款差額還會(huì)直接影響用戶的信用額度以及本期的賬單金額。
調(diào)整金額和循環(huán)利息是跟“上期的還款差額”有關(guān)的:
可以將還款差額進(jìn)行“特征二值化”來代替這兩個(gè)特征。
預(yù)借現(xiàn)金額度,是指持卡人使用信用卡通過ATM等自助終端提取現(xiàn)金的最高額度,取現(xiàn)額度包含于信用額度之內(nèi),一般是信用額度的50%左右,所以可以不用這個(gè)特征,選擇信用額度即可。
df_train['平均支出']=df_train.apply(lambda?x:x.支出金額/x.支出單數(shù),?axis=1)??
df_train['平均工資收入']=df_train.apply(lambda?x:x.工資收入/x.工資筆數(shù),?axis=1)
df_train['上期還款差額']=df_train.apply(lambda?x:x.上期賬單金額-x.上期還款金額,?axis=1)
df_select=df_train.loc[:,['用戶id',?'性別',?'教育程度',?'婚姻狀態(tài)',?'平均支出',
??????????????????????????'平均工資收入',?'上期還款差額',?'信用卡額度',?'本期賬單余額',?'本期賬單最低還款額',?
??????????????????????????'消費(fèi)筆數(shù)',??'瀏覽行為數(shù)據(jù)',?'樣本標(biāo)簽']].fillna(0)
df_select.head()
基于機(jī)器學(xué)習(xí)的篩選
將上期還款差額二值化
from?sklearn.preprocessing?import?Binarizer
X=df_select['上期還款差額'].values.reshape(-1,1)
transformer?=?Binarizer(threshold=0).fit_transform(X)
df_select['上期還款差額標(biāo)簽']=transformer
方差過濾法
過濾那些不帶有信息的變量,默認(rèn)參數(shù)為0,即過濾方差為0的那些變量,只保留對(duì)模型有貢獻(xiàn)的那些信息。
from?sklearn.feature_selection?import?VarianceThreshold
VTS?=?VarianceThreshold()???#?實(shí)例化,參數(shù)默認(rèn)方差為0
x_01=VTS.fit_transform(x)
相關(guān)性過濾--互信息法
互信息法是用來捕捉每個(gè)特征與標(biāo)簽之間的任意關(guān)系(包括線性和非線性關(guān)系)的過濾方法。
和F檢驗(yàn)相似,它既可以做回歸也可以做分類,并且包含兩個(gè)類mutual_info_classif(互信息分類)和mutual_info_regression(互信息回歸)。
這兩個(gè)類的用法和參數(shù)都和F檢驗(yàn)一模一樣,不過互信息法比F檢驗(yàn)更加強(qiáng)大,F(xiàn)檢驗(yàn)只能夠找出線性關(guān)系,而互信息法可以找出任意關(guān)系。
from?sklearn.feature_selection?import?mutual_info_classif?as?MIC
result?=?MIC(x,y)
樣本不均衡
通過觀察,正負(fù)樣本比例為 836:4899,屬于樣本不均衡范疇,可采用上采樣的SMOTE算法對(duì)其進(jìn)行樣本不均衡處理。
from?imblearn.over_sampling?import?SMOTE
over_samples?=?SMOTE(random_state=111)
over_samples_x,?over_samples_y?=?over_samples.fit_sample(x,y)
模型建立與調(diào)參
文章一開始已經(jīng)提到過了,可選模型較多,這里舉例三種模型邏輯回歸、決策樹、隨機(jī)森林模型,其余模型的選用,小伙伴們可以自己動(dòng)手練習(xí)練習(xí)。
二分類模型——邏輯回歸模型 互信息與正則化對(duì)模型效果的影響
用學(xué)習(xí)曲線對(duì)參數(shù)C進(jìn)行調(diào)整,分別在兩個(gè)模型中進(jìn)行調(diào)參。
超參數(shù)C : 一般不會(huì)超過1, 越大懲罰力度越小,本次選取從 0.05 - 2范圍。
from?sklearn.linear_model?import?LogisticRegression?as?LR
from?sklearn.model_selection?import?cross_val_score?as?cvs
lrl1?=?LR(penalty='l1',?solver='liblinear',?
??????????C=i,?max_iter=1000,?random_state=0)
lrl2?=?LR(penalty='l2',?solver='liblinear',?
??????????C=i,?max_iter=1000,?random_state=0)
由圖可知,在經(jīng)過互信息過濾后,邏輯回歸模型得分明顯提高,且當(dāng)超參數(shù)C=0.6時(shí),模型效果是最好的。
包裝法篩選變量
以邏輯回歸為基分類器,結(jié)合包裝法篩選變量,并運(yùn)用交叉驗(yàn)證繪制學(xué)習(xí)曲線,探索最佳變量個(gè)數(shù)。
同時(shí),運(yùn)用SMOTE算法進(jìn)行樣本均衡處理,并比較均衡前后模型效果的變化。
from?sklearn.feature_selection?import?RFE
LR_1?=?LogisticRegression(penalty='l1',?solver='liblinear',?
??????????????????????????C=0.6,?max_iter=1000,?random_state=0)
selector1?=?RFE(LR_1,?n_features_to_select=i,?step=1)
X_wrapper1?=?selector1.fit_transform(x,?y)
once1=cvs(LR_1,?X_wrapper1,?y,?cv=5,?scoring='f1').mean()
由圖可見,樣本均衡前后模型效果有大幅度增長(zhǎng)。且兩種正則化方法相差無幾。
樹模型——決策樹
因?yàn)闃颖揪饣幚砬昂?,?duì)模型效果提升較為明顯,因此在使用決策樹模型建立之前,對(duì)樣本進(jìn)行均衡化處理。
因?yàn)樯疃葏?shù)max_depth是對(duì)決策樹模型影響最大的參數(shù)之一,因此本案例正對(duì)決策樹深度繪制學(xué)習(xí)曲線,探索決策樹最佳參數(shù)。
plt.plot(L_CVS,?'r')??#?交叉驗(yàn)證
plt.plot(L_train,?'g')#?訓(xùn)練集
plt.plot(L_test,?'b')?#?測(cè)試集
由學(xué)習(xí)曲線可知,在max_depth=5時(shí)訓(xùn)練集和測(cè)試集模型效果均達(dá)到了最佳狀態(tài),當(dāng)在max_depth大于5后,模型在訓(xùn)練集上的分?jǐn)?shù)依然在上升,而測(cè)試集上的表現(xiàn)有所下降,這就是模型過擬合現(xiàn)象,因此最終我們選用max_depth=5。
特征重要性
features_imp?=?pd.Series(dtc.feature_importances_,?
??????????index?=?x.columns).sort_values(ascending=False)
features_imp
上期還款差額標(biāo)簽 0.705916
性別 0.101779
平均支出 0.064218
平均工資收入 0.047644
瀏覽行為數(shù)據(jù) 0.044333
教育程度 0.015257
婚姻狀態(tài) 0.012665
本期賬單最低還款額 0.004455
消費(fèi)筆數(shù) 0.003734
本期賬單余額 0.000000
信用卡額度 0.000000
dtype: float64
決策樹可視化
這里提出一點(diǎn),如果需要深入理解決策樹決策過程,可以借助決策樹可視化來輔助理解。
import?graphviz
from?sklearn?import?tree
#首先配置
dot_data?=?tree.export_graphviz(dtc?
??????#?要對(duì)已經(jīng)建成的dct這個(gè)實(shí)例化好的模型進(jìn)行畫圖
??????,feature_names=?x.columns?
??????#?更改列名為中文
??????#?,class_names=[]?
??????#?更改標(biāo)簽名字
??????,filled=True?
??????#?給每一個(gè)節(jié)點(diǎn)分配顏色,顏色約深表示葉子的純度越高
??????,rounded=True
??????#?節(jié)點(diǎn)性狀為圓角
??????)
graph?=?graphviz.Source(dot_data)
graph
樹模型——隨機(jī)森林
from?sklearn.ensemble?import?RandomForestClassifier?as?RFC
from?sklearn.model_selection?import?GridSearchCV
rfc?=?RFC(n_estimators=i+1,
??????????n_jobs=-1,
??????????random_state=90)
score?=?cvs(rfc,over_samples_x_train,?
????????????over_samples_y_train,
????????????cv=5,?scoring='f1').mean()
模型調(diào)參
有?些參數(shù)是沒有參照的,一開始很難確定?個(gè)范圍,這種情況下采用先通過學(xué)習(xí)曲線確定參數(shù)大致范圍,再通過網(wǎng)格搜索確定最佳參數(shù)。
比如確定n_estimators范圍時(shí),通過學(xué)習(xí)曲線觀察n_estimators在什么取值開始變得平穩(wěn),是否?直推動(dòng)模型整體準(zhǔn)確率的上升等信息。
對(duì)于其他參數(shù)也是按照同樣的思路,如影響單棵決策樹模型的參數(shù)max_depth來說,?般根據(jù)數(shù)據(jù)的??來進(jìn)??個(gè)試探,比如乳腺癌數(shù)據(jù)很?,所以可以采?1~10,或者1~20這樣的試探。
但對(duì)于像digit recognition那樣的?型數(shù)據(jù)來說,我們應(yīng)該嘗試30~50層深度(或許還不?夠),此時(shí)更應(yīng)該畫出學(xué)習(xí)曲線,來觀察深度對(duì)模型的影響。
確定范圍后,就可以通過網(wǎng)格搜索的方式確定最佳參數(shù)。其他參數(shù)就不一一舉例了,大家可以動(dòng)手嘗試一下。
#?調(diào)整max_depth
param_grid?=?{'max_depth':np.arange(1,?20,?1)}
rfc?=?RFC(n_estimators=150,random_state=90,?n_jobs=-1)
GS?=?GridSearchCV(rfc,param_grid,cv=5,?scoring='f1')
GS.fit(over_samples_x,?over_samples_y)
GS.best_params_
GS.best_score_
模型評(píng)價(jià)
本次案例模型評(píng)估使用classification_report
sklearn中的classification_report函數(shù)用于顯示主要分類指標(biāo)的文本報(bào)告.在報(bào)告中顯示每個(gè)類的精確度,召回率,F(xiàn)1值等信息。
主要參數(shù):
y_true:1維數(shù)組,或標(biāo)簽指示器數(shù)組/稀疏矩陣,目標(biāo)值。
y_pred:1維數(shù)組,或標(biāo)簽指示器數(shù)組/稀疏矩陣,分類器返回的估計(jì)值。
labels:array,shape = [n_labels],報(bào)表中包含的標(biāo)簽索引的可選列表。
target_names:字符串列表,與標(biāo)簽匹配的可選顯示名稱(相同順序)。
sample_weight:類似于shape = [n_samples]的數(shù)組,可選項(xiàng),樣本權(quán)重。
digits:int,輸出浮點(diǎn)值的位數(shù)。
決策樹驗(yàn)證集評(píng)價(jià)結(jié)果
最后這里舉了一個(gè)決策樹模型效果評(píng)價(jià)的例子,其余分類型模型評(píng)價(jià)同樣可以使用。當(dāng)然,模型評(píng)價(jià)方法不止這一種,大家也可以嘗試著從其他角度來做模型評(píng)價(jià)。
precision recall f1-score support
0 0.70 0.74 0.72 1454
1 0.72 0.68 0.70 1454
accuracy 0.71 2908
macro avg 0.71 0.71 0.71 2908
weighted avg 0.71 0.71 0.71 2908
本文旨在梳理數(shù)據(jù)挖掘的一般過程,沒有涉及到很復(fù)雜的算法,每個(gè)環(huán)節(jié),如數(shù)據(jù)預(yù)處理、特征工程、模型建立于評(píng)價(jià),均是常用的方法。本文數(shù)據(jù)也都給大家準(zhǔn)備好了。
數(shù)據(jù)源代碼下載地址:
提取碼:niub