1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

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

        共 10816字,需瀏覽 22分鐘

         ·

        2021-06-12 17:25

        本次分享一個(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)在過(guò)去時(shí)期借款一方對(duì)自身的財(cái)務(wù)狀況、還款能力及還款意愿有著較為全面的掌握,而金融機(jī)構(gòu)不能全面獲知借款方的風(fēng)險(xiǎn)水平,或在相關(guān)信息的掌握上具有明顯的滯后性。這種信息劣勢(shì),使得金融機(jī)構(gòu)在貸款過(guò)程中可能由于風(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è)違約

        模型選擇

        單模型: 決策樹(shù)、貝葉斯、SVM等
        集成模型: 隨機(jī)森林、梯度提升樹(shù)等
        評(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。(注意:并非每一位用戶都有非常完整的記錄,如有些用戶并沒(méi)有信用卡賬單記錄,有些用戶卻沒(méi)有銀行流水記錄。)

        相應(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)的用戶,并不在此問(wèn)題考慮的范圍內(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ù)得知并非每一位用戶都有非常完整的記錄,如有些用戶并沒(méi)有信用卡賬單記錄,有些用戶卻沒(méi)有銀行流水記錄。

        發(fā)現(xiàn)用戶信息表,是否逾期表,放款時(shí)間表這三張表的id數(shù)目都是55,596,銀行流水表為9,294,瀏覽信息表為47,330,信用卡賬單表為53,174。通過(guò)用戶id數(shù)得到并非每個(gè)用戶都有銀行流水記錄、信用卡賬單等信息,所以這里我們?nèi)?個(gè)表共同用戶的記錄篩選后組成完整的表。

        我們要預(yù)測(cè)的測(cè)試集都是還沒(méi)有放款的用戶特征,所以訓(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()

        查看完整表格的基本情況,無(wú)缺失值,均是數(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
        • 可見(jiàn)收入、支出、工資三個(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)行“特征二值化”來(lái)代替這兩個(gè)特征。

        預(yù)借現(xiàn)金額度,是指持卡人使用信用卡通過(guò)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

        方差過(guò)濾法

        過(guò)濾那些不帶有信息的變量,默認(rèn)參數(shù)為0,即過(guò)濾方差為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)性過(guò)濾--互信息法

        互信息法是用來(lái)捕捉每個(gè)特征與標(biāo)簽之間的任意關(guān)系(包括線性和非線性關(guān)系)的過(guò)濾方法。

        和F檢驗(yàn)相似,它既可以做回歸也可以做分類,并且包含兩個(gè)類mutual_info_classif(互信息分類)和mutual_info_regression(互信息回歸)。

        這兩個(gè)類的用法和參數(shù)都和F檢驗(yàn)一模一樣,不過(guò)互信息法比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)

        樣本不均衡

        通過(guò)觀察,正負(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)參

        文章一開(kāi)始已經(jīng)提到過(guò)了,可選模型較多,這里舉例三種模型邏輯回歸、決策樹(shù)、隨機(jī)森林模型,其余模型的選用,小伙伴們可以自己動(dòng)手練習(xí)練習(xí)。

        二分類模型——邏輯回歸模型

        互信息與正則化對(duì)模型效果的影響

        用學(xué)習(xí)曲線對(duì)參數(shù)C進(jìn)行調(diào)整,分別在兩個(gè)模型中進(jìn)行調(diào)參。

        超參數(shù)C : 一般不會(huì)超過(guò)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)過(guò)互信息過(guò)濾后,邏輯回歸模型得分明顯提高,且當(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()

        由圖可見(jiàn),樣本均衡前后模型效果有大幅度增長(zhǎng)。且兩種正則化方法相差無(wú)幾。

        樹(shù)模型——決策樹(shù)

        因?yàn)闃颖揪饣幚砬昂螅瑢?duì)模型效果提升較為明顯,因此在使用決策樹(shù)模型建立之前,對(duì)樣本進(jìn)行均衡化處理。

        因?yàn)樯疃葏?shù)max_depth是對(duì)決策樹(shù)模型影響最大的參數(shù)之一,因此本案例正對(duì)決策樹(shù)深度繪制學(xué)習(xí)曲線,探索決策樹(shù)最佳參數(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)有所下降,這就是模型過(guò)擬合現(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

        決策樹(shù)可視化

        這里提出一點(diǎn),如果需要深入理解決策樹(shù)決策過(guò)程,可以借助決策樹(shù)可視化來(lái)輔助理解。

        import graphviz
        from sklearn import tree
        #首先配置
        dot_data = tree.export_graphviz(dtc 
              # 要對(duì)已經(jīng)建成的dct這個(gè)實(shí)例化好的模型進(jìn)行畫(huà)圖
              ,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

        樹(shù)模型——隨機(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ù)是沒(méi)有參照的,一開(kāi)始很難確定?個(gè)范圍,這種情況下采用先通過(guò)學(xué)習(xí)曲線確定參數(shù)大致范圍,再通過(guò)網(wǎng)格搜索確定最佳參數(shù)。

        比如確定n_estimators范圍時(shí),通過(guò)學(xué)習(xí)曲線觀察n_estimators在什么取值開(kāi)始變得平穩(wěn),是否?直推動(dòng)模型整體準(zhǔn)確率的上升等信息。

        對(duì)于其他參數(shù)也是按照同樣的思路,如影響單棵決策樹(shù)模型的參數(shù)max_depth來(lái)說(shuō),?般根據(jù)數(shù)據(jù)的??來(lái)進(jìn)??個(gè)試探,比如乳腺癌數(shù)據(jù)很?,所以可以采?1~10,或者1~20這樣的試探。

        但對(duì)于像digit recognition那樣的?型數(shù)據(jù)來(lái)說(shuō),我們應(yīng)該嘗試30~50層深度(或許還不?夠),此時(shí)更應(yīng)該畫(huà)出學(xué)習(xí)曲線,來(lái)觀察深度對(duì)模型的影響。

        確定范圍后,就可以通過(guò)網(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ù)。

        決策樹(shù)驗(yàn)證集評(píng)價(jià)結(jié)果

        最后這里舉了一個(gè)決策樹(shù)模型效果評(píng)價(jià)的例子,其余分類型模型評(píng)價(jià)同樣可以使用。當(dāng)然,模型評(píng)價(jià)方法不止這一種,大家也可以嘗試著從其他角度來(lái)做模型評(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ù)挖掘的一般過(guò)程,沒(méi)有涉及到很復(fù)雜的算法,每個(gè)環(huán)節(jié),如數(shù)據(jù)預(yù)處理、特征工程、模型建立于評(píng)價(jià),均是常用的方法。本文數(shù)據(jù)也都給大家準(zhǔn)備好了。

        數(shù)據(jù)源代碼下載地址:

        鏈接:https://pan.baidu.com/s/1s0UycKtprCKwz0GAzIFtTA

        提取碼:niub


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

        手機(jī)掃一掃分享

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

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            中国毛片在线 | 台湾性一交一乱一色一情 | 69人人妻人人做人碰人人蜜 | 国产片婬乱一级毛片影片乱叫 | 高中女学生的粉嫩小泬 | 天天综合网天天综合色 | 波多野结衣成人在线 | 国模极品美軳人体销魂 | 欧美一级 片内射视频播放 | 高跟操逼视频 |