金融風(fēng)控AI—評(píng)分卡模型算法(1)

一、概述

辦理過(guò)信用卡的朋友知道,開(kāi)卡需要先申請(qǐng)(篩選好壞用戶),可能還會(huì)根據(jù)你的信用情況會(huì)有不同的額度。這就是銀行的信用風(fēng)險(xiǎn)計(jì)量體系。對(duì)于信用卡有4類評(píng)分卡:

1)申請(qǐng)?jiān)u分卡(A卡)

2)行為評(píng)分卡(B卡)

3)催收評(píng)分卡(C卡)

4)欺詐評(píng)分卡(F卡)

這些評(píng)分卡算法一樣,只是訓(xùn)練的數(shù)據(jù)不同,所用的參數(shù)也就不同。

螞蟻金服的芝麻信用也是這樣的。

二、模型開(kāi)發(fā)

模型的開(kāi)發(fā)主要包含以下幾大部分工作:數(shù)據(jù)獲取、數(shù)據(jù)預(yù)處理、探索分析、特征選擇、模型訓(xùn)練、模型評(píng)估、建立評(píng)分系統(tǒng)。

1、數(shù)據(jù)獲取

?本項(xiàng)目數(shù)據(jù)來(lái)源于kaggle競(jìng)賽Give Me Some Credit。有訓(xùn)練數(shù)據(jù)共計(jì)15萬(wàn)條。

打開(kāi)數(shù)據(jù)文件大概這個(gè)樣子:

數(shù)據(jù)

字段描述如下

字段含義

2、數(shù)據(jù)預(yù)處理

這部分主要做2個(gè)事情:缺失值處理和異常值處理。

a、缺失值處理

pd的describe()函數(shù),可以了解數(shù)據(jù)集的缺失值情況。

#載入數(shù)據(jù)

data = pd.read_csv('cs-training.csv')

#數(shù)據(jù)集確實(shí)和分布情況

data.describe(include='all').to_csv('DataDescribe.csv')#了解數(shù)據(jù)集的分布情況


打開(kāi)DataDescribe.csv

我們可以看大部分?jǐn)?shù)據(jù)有15萬(wàn)條,其中月收入只有12萬(wàn)條,缺了近3萬(wàn)條,家屬數(shù)量14.6萬(wàn)條。

對(duì)于缺失值,根據(jù)不同的情況我們分類處理:

(1) 如果缺失的不多,比如家屬數(shù)量缺失不多,可以直接刪除含有缺失值的樣本。用dropna()

(2) 如果缺失較多,不宜直接全部刪除,根據(jù)樣本之間的相似性填補(bǔ)缺失值。比如用平均值

(3)如果缺失較多,不宜直接全部刪除, 根據(jù)變量之間的相關(guān)關(guān)系填補(bǔ)缺失值。比如用隨機(jī)森林法填補(bǔ)。

? (4)如果缺失巨大,就失去分析意義,可以將整個(gè)字段刪除

平均值填補(bǔ)只要一句話:

data=data.fillna({'MonthlyIncome':data['MonthlyIncome'].mean()})

隨機(jī)森林法填補(bǔ):

# 用隨機(jī)森林對(duì)缺失值預(yù)測(cè)填充函數(shù)

def set_missing(df):

? ? # 把已有的數(shù)值型特征取出來(lái)

? ? process_df = df.iloc[:,[5,0,1,2,3,4,6,7,8,9]]

? ? # 分成已知該特征和未知該特征兩部分

? ? known = process_df[process_df.MonthlyIncome.notnull()].values

? ? unknown = process_df[process_df.MonthlyIncome.isnull()].values

? ? # X為特征屬性值

? ? X = known[:, 1:]

? ? # y為結(jié)果標(biāo)簽值

? ? y = known[:, 0]

? ? # fit到RandomForestRegressor之中

? ? rfr = RandomForestRegressor(random_state=0, n_estimators=200,max_depth=3,n_jobs=-1)

? ? rfr.fit(X,y)

? ? # 用得到的模型進(jìn)行未知特征值預(yù)測(cè)

? ? predicted = rfr.predict(unknown[:, 1:]).round(0)

? ? print(predicted)

? ? # 用得到的預(yù)測(cè)結(jié)果填補(bǔ)原缺失數(shù)據(jù)

? ? df.loc[(df.MonthlyIncome.isnull()), 'MonthlyIncome'] = predicted

? ? return df

調(diào)用隨機(jī)森林:

data=set_missing(data)#用隨機(jī)森林填補(bǔ)比較多的缺失值

data=data.dropna()#刪除比較少的缺失值


b、異常值處理

異常值是指明顯偏離大多數(shù)抽樣數(shù)據(jù)的數(shù)值,或者直接違背常識(shí)的數(shù)據(jù),比如年齡是負(fù)數(shù)。對(duì)于違背常識(shí)的記錄直接刪除,而對(duì)于其他異常數(shù)據(jù)需要具體分析:

刪除。先取出異常記錄,看看數(shù)據(jù),如果不太多,也沒(méi)有特別的可以刪除。因?yàn)楫惓V悼赡軙?huì)影響結(jié)論。如果取出的異常記錄有明顯的相關(guān)性,那么這些記錄可以總結(jié)出一個(gè)規(guī)則。

放任不管。也許異常值代表的是真實(shí)的情況,這些值即使異常,也不會(huì)影響模型。

視為缺失值進(jìn)行填充。如果刪除數(shù)據(jù)可能會(huì)損失信息,而如果放任不管可能又影響我們的模型,所以可以考慮用均值、臨近值進(jìn)行填充。

具體采用哪種方式其實(shí)最好都試一下,看看最后得到的模型怎么樣。因?yàn)樗羞@些操作都是有假設(shè)條件的,而你的數(shù)據(jù)是否滿足這些條件,試過(guò)才知道。

從圖看有異常值不少,不過(guò)一般只把異常的0值去掉。

對(duì)于RevolvingUtilizationOfUnsecuredLines及DebtRatio都是百分?jǐn)?shù)類型。其中第一項(xiàng)肯定不能大于100%而且統(tǒng)計(jì)一下這部分異常數(shù)據(jù)不多,果斷刪掉。第二項(xiàng)債務(wù)百分比不敢確定是否可債務(wù)大于100%,統(tǒng)計(jì)了一下有3w多條,而且取出來(lái)看了一下不是很特別,同樣可以試一下刪除或者放入不管或者填充看看最后不同的效果。

這3個(gè)逾期不還次數(shù)指標(biāo)意義相似放一起看,發(fā)現(xiàn)有2個(gè)數(shù)據(jù)特別顯眼,是96,98。雖然按箱型圖的含義所有圓圈都是異常值,但仔細(xì)分析這三個(gè)指標(biāo)發(fā)現(xiàn)正常值絕大部分是0,這就導(dǎo)致了箱型圖的1/4線和3/4線都是0,所以我們通常把頭頂2個(gè)值作為異常值。我把這部分異常值取出來(lái)發(fā)現(xiàn)數(shù)量不多,只有200多條,理論上可以直接刪除或者放在里面置之不理。但是我看了這部分?jǐn)?shù)據(jù)發(fā)現(xiàn)非常異常。這208條數(shù)據(jù)有125條是違約用戶,違約占比62%,而全量數(shù)據(jù)里面違約占比7%不到,所以我覺(jué)得應(yīng)該把這部分?jǐn)?shù)據(jù)作為一條規(guī)則來(lái)處理,遇到這三個(gè)指標(biāo)有超過(guò)90的數(shù)值,直接報(bào)告警。那么是否可以把這部分?jǐn)?shù)據(jù)留著置之不理呢,后面我試了,發(fā)現(xiàn)會(huì)對(duì)變量之間的相關(guān)性有很大影響(后面會(huì)詳細(xì)講)。

同樣這個(gè)指標(biāo)我們把50以上作為異常值。

這個(gè)指標(biāo)pass

月收入可以去掉特別高的數(shù)據(jù)

家庭成員可以剔除特別高的

第一篇完

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容