文/周瑞珍
金融機構審批貸款時會收集客戶個人信息,包括年齡、收入、學歷、職業(yè)、家庭狀況、借貸歷史等,在對各項信息綜合考量的基礎上決定是否批準貸款。過去該項工作主要依靠人工審核,隨著人工智能技術的發(fā)展,數(shù)據(jù)分析和機器學習成為金融風控領域的重要工具。本文嘗試使用python 構建模型,利用模型預測貸款人的違約情況。通過貸款數(shù)據(jù)(包括用戶個人信息和貸款狀態(tài)是否違約)來訓練模型,通過模型分析貸款人的償還能力,預測貸款申請人是否會發(fā)生違約。因為已知貸款狀態(tài)是否違約以及各特征變量的值,判定貸款申請人會不會違約是一個二元分類問題,是一個監(jiān)督學習的場景,可以通過分類算法來處理。
本文采用數(shù)據(jù)科學競賽平臺kaggle 提供的貸款違約預測數(shù)據(jù)集,其中包含150000 個用戶的貸款信息,具體如表1。
SeriousDlqin2yrs 是要預測的對象(因變量),即根據(jù)其他變量判斷用戶會不會發(fā)生違約。其他10 個變量為自變量,分為兩類:客戶自身屬性(年齡,月收入,家屬數(shù)目),客戶信貸歷史(負債比率,循環(huán)貸款使用率,信用卡和貸款數(shù)量)。自變量較少,而且它們對是否發(fā)生違約都有不同程度的影響,在此不進行特征工程。
df = pd.read_csv("cs-training.csv") # 讀入數(shù)據(jù)
在對數(shù)據(jù)處理之前,首先查看數(shù)據(jù)的缺失值和異常值情況進行。用df.describe()查看基本信息,包括每個特征的均值、各分位數(shù)等。SeriousDlqin2yrs 的均值為0.06684,說明違約率是6.684%(發(fā)生違約的客戶,該值為1,把所有值加起來就是違約客戶的個數(shù),除以客戶總數(shù)也就相當于該列的均值)。age 的最小值為0,存在異常值,銀行不可能給18 歲以下客戶貸款。
df=df.drop(df.columns[0],axis=1) # 刪除Unnamed 列
df=df[df.age>=18]#只保留年齡大于18 的客戶
df.isnull().sum() # 計算每個列的空值數(shù)目,MonthlyIncome 和NumberOfDependents的缺失值分別為29731 和3924。采用均值插補的方法,用pandas.fillna()處理文本變量缺失值。
df['MonthlyIncome'].fillna(df['Monthly Income'].mean(),inplace=True)
df['NumberOfDependents'].fillna(df ['NumberOfDependents'].mode()[0],inplace =True)

表1
按照80%的比例,把兩個數(shù)據(jù)集分為訓練集和測試集(X_1,Y_1 是訓練集,X_2,Y_2是測試集)。
X_1,X_2,Y_1,Y_2 = cross_validation.train_test_split(x_features,y_feature,test_size=0.8,random_state=0)
logic_clf = LogisticRegression() #生成一個邏輯回歸模型
logic_clf.fit(X_1,Y_1) #用訓練集進行擬合,獲得模型
score = logic_clf.score(X_2,Y_2) # 用模型對X_2 進行測試,并與Y_2 比較,獲得準確率
matrix = confusion_matrix(predictions,Y_2) #顯示混淆矩陣
準確率和混淆矩陣如下:
accuracy: 0.933141666667
[[111803 7854]
[169 174]]
樸素貝葉斯法屬于有監(jiān)督學習的方法,是數(shù)據(jù)分析十大算法之一,由于其易于理解、實現(xiàn)相對簡單,性能良好,因此被廣泛用于解決分類和排序問題。該算法原理如下:假設X 是n 維隨機向量(X(1),X(2),...,X(n))T,其中X(j)是X 的第j 個分量,即第j 個特征,Y 是標簽變量,有K 個取值,取值集合為{C1,C2,…,Ck},訓練數(shù)據(jù)集為包含N 個樣本{(x1,y1),(x2,y2),...(xN,yN)},根據(jù)貝葉斯定理,可得后驗概率

其中P(Y=Ck)是先驗概率,P(X=x|Y=Ck)是條件概率,假設各特征之間條件獨立,可得后驗概率

從公式中可知,所有分類的后驗概率的分母都是一樣的,因此只需比較各后驗概率的分子即可,從而得到預測模型

使用scikit-learn 提供的樸素貝葉斯分類算法GaussianNB,該算法假設特征的先驗概率為正態(tài)分布,主要用于連續(xù)變量中。本數(shù)據(jù)集中各特征接近于連續(xù)型隨機變量,適合本算法。
fromsklearn.naive_bayesGaussianNB
gnb_clf = GaussianNB()
gnb_clf.fit(X_1,Y_1)
gnb_prediction = gnb_clf.predict(X_2)
gnb_matrix = confusion_matrix(gnb_prediction,Y_2)
gnb_score = gnb_clf.score(X_2,Y_2)
準確率和混淆矩陣如下:
accuracy: 0.9314
[[111589 7849]
[383 179]]
以上兩個模型的準確率均為93%左右。在后續(xù)的工作中,將嘗試采用其他算法例如神經(jīng)網(wǎng)絡的方法構建模型,進一步提高模型準確度。