一、概述
辦理過(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è)樣子:

字段描述如下

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

家庭成員可以剔除特別高的
第一篇完