首页 > 数据库 > 数据库开发技术 > 评分卡原理及Python实现
逻辑回归已经在各大银行和公司都实际运用于业务,之前已经阐述了逻辑回归和sigmod函数的由来、逻辑回归(logistics regression)原理-让你彻底读懂逻辑回归。
本文致力于让大家彻底弄懂评分卡的原理和实现。
评分卡原理
评分卡Python实现
2.1 根据客户违约概率计算客户得分
2.2 根据分箱WOE和特征系数计算客户得分
一、评分卡原理



即







即

最终解得:

将③代入①得:

即

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

或

则


是0、1逻辑变量,当客户对应特征的取值落在该分箱时为1否则为0。
二、评分卡Python实现



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

计算评分卡时先不考虑常值分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)
得到结果如下:

如果想根据评分卡对应分段的值得到最终得分,可在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)



扫一扫关注我
19967879837
投稿微信号、手机号
原文作者:阿黎逸阳的代码;如有侵权,请联系管理员删除。