日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

数据挖掘实战:个人信贷违约预测

發(fā)布時(shí)間:2023/12/20 编程问答 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据挖掘实战:个人信贷违约预测 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

大家好,我是東哥。本次分享一個(gè)數(shù)據(jù)挖掘?qū)崙?zhàn)項(xiàng)目:個(gè)人信貸違約預(yù)測(cè),此項(xiàng)目對(duì)于想要學(xué)習(xí)信貸風(fēng)控模型的同學(xué)非常有幫助,本文首發(fā)于公眾號(hào):Python數(shù)據(jù)科學(xué),作者云朵君

一、個(gè)人征信預(yù)測(cè)模型

1、項(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)估,并做出授信決策。

數(shù)據(jù)和源碼請(qǐng)?jiān)诠娞?hào)Python數(shù)據(jù)科學(xué)回復(fù)關(guān)鍵字:信貸 獲取。

2、解決方法

運(yùn)用分類算法預(yù)測(cè)違約

3、模型選擇

  • 單模型: 決策樹(shù)、貝葉斯、SVM等
  • 集成模型: 隨機(jī)森林、梯度提升樹(shù)等
  • 評(píng)分卡模型: 邏輯回歸
  • 項(xiàng)目可輸出: 評(píng)分卡

二、數(shù)據(jù)描述

1、數(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ù)字化;? 將時(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

2、各個(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

1、銀行賬單表

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()

2、瀏覽表

先剔除5735以外的數(shù)據(jù),再統(tǒng)計(jì)每個(gè)用戶的瀏覽記錄(count)

browse_train.head()

3、賬單表

去掉了時(shí)間、銀行id、還款狀態(tài)這幾個(gè)變量,按用戶id分組后對(duì)每個(gè)字段均值化處理。

4、逾期表、用戶表

5、合并五張表

將篩選后的五個(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()

四、特征工程

1、基于業(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

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

2、生產(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()

3、基于機(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檢驗(yàn)只能夠找出線性關(guān)系,而互信息法可以找出任意關(guān)系。

from sklearn.feature_selection import mutual_info_classif as MIC result = MIC(x,y)

4、樣本不均衡

通過(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í)。

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

互信息與正則化對(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ú)幾。

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

因?yàn)闃颖揪饣幚砬昂?#xff0c;對(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

3、樹(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(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è)類的精確度,召回率,F1值等信息。

主要參數(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ù)。

1、決策樹(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 support0 0.70 0.74 0.72 14541 0.72 0.68 0.70 1454accuracy 0.71 2908macro 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)備好了。

我是東哥,感謝各位人才的:點(diǎn)贊、收藏和評(píng)論,我們下期見(jiàn)!

原創(chuàng)文章持續(xù)更新,可以微信搜一搜「 Python數(shù)據(jù)科學(xué)」第一時(shí)間閱讀。

總結(jié)

以上是生活随笔為你收集整理的数据挖掘实战:个人信贷违约预测的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。