python 評分卡_評分卡原理及Python實現

本文致力于讓大家徹底弄懂評分卡的原理和實現。
本文目錄
評分卡原理
評分卡Python實現
2.1 根據客戶違約概率計算客戶得分
2.2 根據分箱WOE和特征系數計算客戶得分
一、評分卡原理

根據邏輯回歸原理,客戶違約的概率p有如下式子:

其中x為客戶特征,θ為特征系數,上式整理得:

即

違約概率和正常概率的比值稱為比率(Odds),即:

所以

設評分卡的評分Score為:

或

其中A、B是正常數,在風控中一般分數越高信用越好風險越低。所以B前面取負號,讓違約的概率越高分數越低。
由中學知識可知,兩個方程聯立可求出兩個未知數。為求出A、B的具體值,有如下兩個假設:
1.假設比率為θ
0
時的基準分為P
0
。
2.假設比率翻倍(2θ
0
)時分數的變動值為PDO。
把θ0、P0、PDO代入評分公式得:

①-②得:

即

最終解得:

將③代入①得:

即

假設θ0=0.001時,P0=600,PDO=40。
則
B = 40/np.log(2)=57.71
A=600+57.71*np.log(1/1000)=201.35
即

或

則

其中
x
1
、
x
2
、
x
n
等是出現在最終模型的入模變量。由于一些入模變量進行了WOE編碼,可以將評分寫成對應woe的形式。

其中θ
i
為第i個特征的系數,W
ij
為第i個特征第j個分箱的WOE值,

是0、1邏輯變量,當客戶對應特征的取值落在該分箱時為1否則為0。
所以最終的評分卡形式如下:

二、評分卡Python實現

從評分卡原理的分析中知,得到客戶的最終得分有兩個計算公式:

或

如果已經通過邏輯回歸的訓練得到客戶的違約概率,且只想得到客戶的最終得分??砂堰`約概率P代入第一個式子即可以得到客戶得分。
1根據客戶違約概率計算客戶得分
具體計算代碼如下:
def Prob2Score(prob, A, PDO):#將概率轉化成分數且為正整數y = np.log(prob/(1-prob))return?int(A-PDO/np.log(2)*(y))A, PDO = 201.35,40score['prob2score'] = score['predict'].apply(lambda x: Prob2Score(x, A, PDO))plt.hist(X_f_1['score'],bins=100)plt.show()
其中
Prob2Score
是根據第一個公式寫的函數,只要輸入違約概率prob、A和PDO的值即可計算客戶得分。
得到所有樣本的得分分布如下:

2根據分箱WOE和特征系數計算客戶得分
計算評分卡時先不考慮常值分A-Bθ0的值,只把每個特征對應分箱的分值算出。
根據最終評分卡形式編寫Python腳本如下,可得到標準評分卡。
def var_card(cut,woe,coef,B):import warningswarnings.filterwarnings('ignore')w1 = pd.DataFrame({'cut':cut,'woe':woe})w2 = w1.drop_duplicates(subset=['cut','woe'],keep='first')w2['name'] = cut.namew2['coef'] = coef[woe.name][0]w2['score'] = round(-w2['woe']*w2['coef']*B,0).astype('int64')w3 = w2[['name','cut','woe','coef','score']]return w3def score_card(card_name,data,B,coef):score_cards = pd.DataFrame({'name':[0],'cut':[0],'woe':[0],'coef':[0]})data = datafor i in range(card_name.shape[0]):cut = data[card_name.iloc[i,0]]woe = data[card_name.iloc[i,1]]coef = coefcard = var_card(cut,woe,coef,B)if card.shape[0]<20:score_cards = score_cards.append(card)score_cards_final = score_cards[['name','cut','woe','coef','score']]score_cards_final = score_cards_final.iloc[1:,:]return score_cards_finalcard_name = pd.DataFrame({'cut':columns_final_cut,'woe':columns_final_woe})data = dataA, PDO, B = 201.35,40,40/np.log(2)coef = coef_1score_card_1 = score_card(card_name,data,B,coef)
其中
card_name
中存儲每個特征對應分箱的woe值,data表示原始數據,B是公式中的常數,coef表示特征對應系數。
該計算公式只是我為了熟悉原始計算公式編寫,后續(xù)會進行代碼優(yōu)化,請悉知。
得到結果如下:

如果想根據評分卡對應分段的值得到最終得分,可在Python中輸入如下代碼:
def all_score(score_card,data,A,B,θ0):var_name = score_card[['name']].drop_duplicates(subset=['name'],keep='first')names = ['a']for i in range(var_name.shape[0]):sub = score_card[score_card['name']==var_name.iloc[i,0]]sub_1 = sub[['cut','score']]sub_1.rename(columns={'cut':sub['name'][0], 'score':sub['name'][0]+'_score'}, inplace = True)data = data.merge(sub_1, on=sub['name'][0],how='left')names.append(sub_1.columns[1])names = names[1:]score_model = data[names]score_model['woe_score'] = score_model.apply(lambda x:x.sum(), axis = 1)data['TOTALSCORE'] = score_model['woe_score']+A-B*θ0return datascore_1 = all_score(score_card_1,data,201.35,40/np.log(2),θ0=0.001)
其中
score_card_1
表示標準評分卡,data表示原始數據,A、B、θ
0
詳見上文中評分卡原理。
得到結果如下:

至此,邏輯回歸的原理和代碼闡述完畢,感興趣的同學可以自己根據公式,寫出對應的Python代碼。
轉載:https://blog.csdn.net/weixin_34534456/article/details/113644483

QQ學習群:1026993837 領學習資料? ? ? ?
在公眾號「python風控模型」里回復關鍵字:學習資料?
