<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          數(shù)據(jù)挖掘?qū)崙?zhàn):個(gè)人信貸違約預(yù)測(cè)

          共 10848字,需瀏覽 22分鐘

           ·

          2021-05-25 12:26

          大家好,我是東哥。本次分享一個(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); 
          • '進(jìn)賬單數(shù)'與'進(jìn)賬金額'的相關(guān)系數(shù)很高,相關(guān)系數(shù)為0.99
          • '支出單數(shù)', '支出金額'的相關(guān)性較高,相關(guān)系數(shù)分別為0.82,0.85
          • '進(jìn)賬金額'與'支出單數(shù)', '支出金額'的相關(guān)性較高,相關(guān)系數(shù)分別為0.81,0.85
          • '支出單數(shù)'與 '支出金額'的相關(guān)性很高,相關(guān)系數(shù)為0.99
          • '工資筆數(shù)'與'工資收入'相關(guān)系數(shù)為1
          • 可見收入、支出、工資三個(gè)指標(biāo)的金額跟筆數(shù)是線性關(guān)系,那么后續(xù)將構(gòu)建一個(gè)新的特征:筆均=金額/筆數(shù),取工資筆均;而且收入、支出是強(qiáng)相關(guān)(0.82),所以只取一個(gè)即可,支出筆均。
          • 后續(xù)將用'進(jìn)賬金額/進(jìn)賬單數(shù)','支出金額/支出單數(shù)','工資收入/工資筆數(shù)'得到'進(jìn)賬筆均','支出筆均','工資筆均'

          總表相關(guān)性分析

          # 相關(guān)性結(jié)果數(shù)據(jù)表
          corrmat=df_train[internal_chars].corr()
          # 熱力圖
          sns.heatmap(corrmat, square=False
                      linewidths=.5, annot=True);  
          • '本期賬單金額'與'本期賬單余額'相關(guān)系數(shù)為0.85
          • '上期賬單金額'與'上期還款金額'相關(guān)系數(shù)為0.75
          • '本期賬單金額'與'上期還款金額'相關(guān)系數(shù)為0.64
          • '信用卡額度'與'上期賬單金額'和'上期還款金額'相關(guān)系數(shù)分別為0.54和0.52
          • '本期賬單金額'與'上期賬單金額'相關(guān)系數(shù)為0.5

          本期的賬單余額與最低還款額具有高度共線性,決定只選用最低還款額。

          生產(chǎn)衍射變量

          上期還款差額 =上期賬單金額 - 上期還款金額, 上期還款差額還會(huì)直接影響用戶的信用額度以及本期的賬單金額。

          調(diào)整金額和循環(huán)利息是跟“上期的還款差額”有關(guān)的:

          • 還款差額>0,需要計(jì)算循環(huán)利息,調(diào)整金額不計(jì)
          • 還款差額<0,需要計(jì)算調(diào)整金額,循環(huán)利息不計(jì)

          可以將還款差額進(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(1201)}
          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ù)和源碼請(qǐng)掃二維碼添加?xùn)|哥微信獲取,務(wù)必備注:信貸

          同類挖掘項(xiàng)目推薦

          數(shù)據(jù)挖掘?qū)崙?zhàn):客戶價(jià)值識(shí)別實(shí)現(xiàn)精準(zhǔn)營(yíng)銷

          數(shù)據(jù)挖掘?qū)崙?zhàn):電商銷量預(yù)測(cè)

          數(shù)據(jù)科學(xué)實(shí)戰(zhàn):保險(xiǎn)產(chǎn)品交叉銷售預(yù)測(cè)分析

          數(shù)據(jù)挖掘?qū)崙?zhàn):北京二手房房?jī)r(jià)分析

          瀏覽 69
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产专区在线播放 | 最好看2019中文在线播放电影 | 久久久夜色精品亚洲在线播放 | 日韩欧美国产黄色电影 | A V免费视频在线观看 |