基於Python的信用評分卡模型分析(二)


上一篇文章基於Python的信用評分卡模型分析(一)已經介紹了信用評分卡模型的數據預處理、探索性數據分析、變量分箱和變量選擇等。接下來我們將繼續討論信用評分卡的模型實現和分析,信用評分的方法和自動評分系統。

六、模型分析

證據權重(Weight of Evidence,WOE)轉換可以將Logistic回歸模型轉變為標准評分卡格式。引入WOE轉換的目的並不是為了提高模型質量,只是一些變量不應該被納入模型,這或者是因為它們不能增加模型值,或者是因為與其模型相關系數有關的誤差較大,其實建立標准信用評分卡也可以不采用WOE轉換。這種情況下,Logistic回歸模型需要處理更大數量的自變量。盡管這樣會增加建模程序的復雜性,但最終得到的評分卡都是一樣的。
在建立模型之前,我們需要將篩選后的變量轉換為WoE值,便於信用評分。

6.1 WOE轉換

我們已經能獲取了每個變量的分箱數據和woe數據,只需要根據各變量數據進行替換,實現代碼如下:

#替換成woe函數 def replace_woe(series,cut,woe): list=[] i=0 while i<len(series): value=series[i] j=len(cut)-2 m=len(cut)-2 while j>=0: if value>=cut[j]: j=-1 else: j -=1 m -= 1 list.append(woe[m]) i += 1 return list 

我們將每個變量都進行替換,並將其保存到WoeData.csv文件中:

    # 替換成woe data['RevolvingUtilizationOfUnsecuredLines'] = Series(replace_woe(data['RevolvingUtilizationOfUnsecuredLines'], cutx1, woex1)) data['age'] = Series(replace_woe(data['age'], cutx2, woex2)) data['NumberOfTime30-59DaysPastDueNotWorse'] = Series(replace_woe(data['NumberOfTime30-59DaysPastDueNotWorse'], cutx3, woex3)) data['DebtRatio'] = Series(replace_woe(data['DebtRatio'], cutx4, woex4)) data['MonthlyIncome'] = Series(replace_woe(data['MonthlyIncome'], cutx5, woex5)) data['NumberOfOpenCreditLinesAndLoans'] = Series(replace_woe(data['NumberOfOpenCreditLinesAndLoans'], cutx6, woex6)) data['NumberOfTimes90DaysLate'] = Series(replace_woe(data['NumberOfTimes90DaysLate'], cutx7, woex7)) data['NumberRealEstateLoansOrLines'] = Series(replace_woe(data['NumberRealEstateLoansOrLines'], cutx8, woex8)) data['NumberOfTime60-89DaysPastDueNotWorse'] = Series(replace_woe(data['NumberOfTime60-89DaysPastDueNotWorse'], cutx9, woex9)) data['NumberOfDependents'] = Series(replace_woe(data['NumberOfDependents'], cutx10, woex10)) data.to_csv('WoeData.csv', index=False) 

6.2 Logisic模型建立

我們直接調用statsmodels包來實現邏輯回歸:

    導入數據
    data = pd.read_csv('WoeData.csv') #應變量 Y=data['SeriousDlqin2yrs'] #自變量,剔除對因變量影響不明顯的變量 X=data.drop(['SeriousDlqin2yrs','DebtRatio','MonthlyIncome', 'NumberOfOpenCreditLinesAndLoans','NumberRealEstateLoansOrLines','NumberOfDependents'],axis=1) X1=sm.add_constant(X) logit=sm.Logit(Y,X1) result=logit.fit() print(result.summary()) 

輸出結果:


 
圖6-1 邏輯回歸模型結果.png

通過圖6-1可知,邏輯回歸各變量都已通過顯著性檢驗,滿足要求。

6.3 模型檢驗

到這里,我們的建模部分基本結束了。我們需要驗證一下模型的預測能力如何。我們使用在建模開始階段預留的test數據進行檢驗。通過ROC曲線和AUC來評估模型的擬合能力。
在Python中,可以利用sklearn.metrics,它能方便比較兩個分類器,自動計算ROC和AUC。
實現代碼:

    #應變量 Y_test = test['SeriousDlqin2yrs'] #自變量,剔除對因變量影響不明顯的變量,與模型變量對應 X_test = test.drop(['SeriousDlqin2yrs', 'DebtRatio', 'MonthlyIncome', 'NumberOfOpenCreditLinesAndLoans','NumberRealEstateLoansOrLines', 'NumberOfDependents'], axis=1) X3 = sm.add_constant(X_test) resu = result.predict(X3)#進行預測 fpr, tpr, threshold = roc_curve(Y_test, resu) rocauc = auc(fpr, tpr)#計算AUC plt.plot(fpr, tpr, 'b', label='AUC = %0.2f' % rocauc)#生成ROC曲線 plt.legend(loc='lower right') plt.plot([0, 1], [0, 1], 'r--') plt.xlim([0, 1]) plt.ylim([0, 1]) plt.ylabel('真正率') plt.xlabel('假正率') plt.show() 

輸出結果:


 
圖6-2 ROC曲線

從上圖可知,AUC值為0.85,說明該模型的預測效果還是不錯的,正確率較高。

七、信用評分

我們已經基本完成了建模相關的工作,並用ROC曲線驗證了模型的預測能力。接下來的步驟,就是將Logistic模型轉換為標准評分卡的形式。

7.1 評分標准

 

 
 

 
 

依據以上論文資料得到:
a=log(p_good/P_bad)
Score = offset + factor * log(odds)
在建立標准評分卡之前,我們需要選取幾個評分卡參數:基礎分值、 PDO(比率翻倍的分值)和好壞比。 這里, 我們取600分為基礎分值,PDO為20 (每高20分好壞比翻一倍),好壞比取20。

 

    # 我們取600分為基礎分值,PDO為20(每高20分好壞比翻一倍),好壞比取20。 p = 20 / math.log(2) q = 600 - 20 * math.log(20) / math.log(2) baseScore = round(q + p * coe[0], 0) 

個人總評分=基礎分+各部分得分

7.2 部分評分

下面計算各變量部分的分數。各部分得分函數:

#計算分數函數 def get_score(coe,woe,factor): scores=[] for w in woe: score=round(coe*w*factor,0) scores.append(score) return scores 

計算各變量得分情況:

    # 各項部分分數 x1 = get_score(coe[1], woex1, p) x2 = get_score(coe[2], woex2, p) x3 = get_score(coe[3], woex3, p) x7 = get_score(coe[4], woex7, p) x9 = get_score(coe[5], woex9, p) 

我們可以得到各部分的評分卡如圖7-1所示:


 
圖7-1 各變量的評分標准

八、自動評分系統

根據變量來計算分數,實現如下:

#根據變量計算分數 def compute_score(series,cut,score): list = [] i = 0 while i < len(series): value = series[i] j = len(cut) - 2 m = len(cut) - 2 while j >= 0: if value >= cut[j]: j = -1 else: j -= 1 m -= 1 list.append(score[m]) i += 1 return list 

我們來計算test里面的分數:

    test1 = pd.read_csv('TestData.csv') test1['BaseScore']=Series(np.zeros(len(test1)))+baseScore test1['x1'] = Series(compute_score(test1['RevolvingUtilizationOfUnsecuredLines'], cutx1, x1)) test1['x2'] = Series(compute_score(test1['age'], cutx2, x2)) test1['x3'] = Series(compute_score(test1['NumberOfTime30-59DaysPastDueNotWorse'], cutx3, x3)) test1['x7'] = Series(compute_score(test1['NumberOfTimes90DaysLate'], cutx7, x7)) test1['x9'] = Series(compute_score(test1['NumberOfTime60-89DaysPastDueNotWorse'], cutx9, x9)) test1['Score'] = test1['x1'] + test1['x2'] + test1['x3'] + test1['x7'] +test1['x9'] + baseScore test1.to_csv('ScoreData.csv', index=False) 

批量計算的部分分結果:


 
圖8-1 批量計算的部分結果

九、總結以及展望

本文通過對kaggle上的Give Me Some Credit數據的挖掘分析,結合信用評分卡的建立原理,從數據的預處理、變量選擇、建模分析到創建信用評分,創建了一個簡單的信用評分系統。
基於AI 的機器學習評分卡系統可通過把舊數據(某個時間點后,例如2年)剔除掉后再進行自動建模、模型評估、並不斷優化特征變量,使得系統更加強大。

參考文獻

基於R語言的信用評分卡建模分析
信用卡評分模型
信用標准評分卡模型開發及實現
手把手教你用R語言建立信用評分模型
Scorecard 評分卡模型
使用python進行數據清洗
Monotonic Binning with Python
Python異常值處理與檢測
結合Scikit-learn介紹幾種常用的特征選擇方法

代碼網盤地址

鏈接:http://pan.baidu.com/s/1gfEj4n5 密碼:55qt

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM