评分卡模型

2018-08-07  本文已影响0人  这是沸羊羊的干爹
#  评分卡转化
## 前提:WOE转化,逻辑回归各变量系数
## score = A+B*model_score
## 1.给某个特定的比率设定特定的预期分值;设定为p,好坏比设定为15
## 2.比率翻番时下降的分数(PDO)设定为20分
## 3. 基准分数定位700分,分数越大,信用度越好
## 从woe的公式来看,就是逻辑回归中机会比的含义。评分卡模型,对每个类别的woe乘以一个参数和评分权重,最终得到了模型分数。
from math import log
temdf = pd.DataFrame([result.params,round(result.pvalues,4),result.tvalues],index = ['coef','pvalue','z']).T
p = 15 / math.log(2)
q = 700 - 20 * math.log(15) / math.log(2)
print(p,q)
baseScore = round(q - p * temdf['coef'][0], 0)
print(baseScore)

# 第i个变量各区间的分数计算公式:  A-B*(alpha/n+betai*woei1)
def trans(p,beta,datawoe):
    credit_score = OrderedDict()
    n = len(smlogit_summary.iloc[1:,:]['index'].tolist())
    for var in smlogit_summary.iloc[1:,:]['index'].tolist():
        tem_score = OrderedDict()
        coef_ = smlogit_summary[smlogit_summary['index']==var]['coef'].values[0]
        for j in dataiv[var].keys():
            tem_score.update({str(j):round(-coef_*datawoe[var][j]*p,4)})
        credit_score.update({var:tem_score})
    return credit_score
trans_score = trans(p,smlogit_summary,datawoe)
lst = []
for i in trans_score.keys():
    for j in trans_score[i].keys():
        lst.append([i,j,trans_score[i][j]])

## 得到每个变量每个区间对应的分数(字典形式)
# 最后根据每条数据每个变量的得分求得总分即可
def final_score_fun(data_,dict_,variables):
    temp_dat = copy.deepcopy(data_)
    for variable in variables:
        temp_dat[variable] =[dict_[variable][i]  if i in dict_[variable].keys() else 0  for i in data_[variable] ]
    temp_dat['BaseScore'] = 653
    temp_dat['final_score'] = temp_dat[variables+['BaseScore']].apply(lambda x:x.sum(),axis=1)
    temp_dat = temp_dat.merge(SCORE_TR[['LOAN_NO','y','SCORE_SMLOGIT','train_test']],left_on = 'LOAN_NO',right_on ='LOAN_NO',how = 'left')
    return temp_dat
final_score = final_score_fun(dat_[['LOAN_NO']+smlogit_summary.iloc[1:,:]['index'].tolist()],trans_score,list(trans_score.keys()))

上一篇 下一篇

猜你喜欢

热点阅读