评分卡实现和评估
上一节讲得是模型评估,主要有ROC曲线、KS曲线、学习曲线和混淆矩阵。今天学习如何实现评分卡和对评分卡进行评估。
首先,要了解评分卡是如何从概率映射到评分的,这个之前写过评分卡映射的逻辑。见逻辑回归卡评分映射逻辑,一定要看,明白概率如何映射到评分的以及每个变量的得分如何计算。附上评分卡映射的代码。结合逻辑回归评分卡映射的原理才能看懂代码。
from sklearn.linear_model import LogisticRegression
'''
第六步:逻辑回归模型。
要求:
1,变量显著
2,符号为负
'''
y = trainData['y']
x = trainData[multi_analysis]
lr_model = LogisticRegression(C=0.1)
lr_model.fit(x,y)
trainData['prob'] = lr_model.predict_proba(x)[:,1]
# 评分卡刻度
def cal_scale(score,odds,PDO,model):
"""
odds:设定的坏好比
score:在这个odds下的分数
PDO: 好坏翻倍比
model:逻辑回归模型
return :A,B,base_score
"""
B = PDO/np.log(2)
A = score+B*np.log(odds)
# base_score = A+B*model.intercept_[0]
print('B: {:.2f}'.format(B))
print('A: {:.2f}'.format(A))
# print('基础分为:{:.2f}'.format(base_score))
return A,B
#假设基础分为50,odds为5%,PDO为10,可以自行调整。这一步是为了计算出A和B。
cal_scale(50,0.05,10,lr_model)
def Prob2Score(prob, A,B):
#将概率转化成分数且为正整数
y = np.log(prob/(1-prob))
return float(A-B*y)
trainData['score'] = trainData['prob'].map(lambda x:Prob2Score(x, 6.78,14.43))
可以看到,评分越高,违约概率越低。网上很多实现评分卡映射的代码,都没太看懂,这个是根据逻辑来写的,有时间再把映射逻辑整理一下。
1. 得分的KS曲线
和模型的KS曲线一样,只不过横坐标的概率变成了得分。
直接放上代码。
# 得分的KS
def plot_score_ks(df,score_col,target):
"""
df:数据集
target:目标变量的字段名
score_col:最终得分的字段名
"""
total_bad = df[target].sum()
total_good = df[target].count()-total_bad
score_list = list(df[score_col])
target_list = list(df[target])
items = sorted(zip(score_list,target_list),key=lambda x:x[0])
step = (max(score_list)-min(score_list))/200
score_bin=[]
good_rate=[]
bad_rate=[]
ks_list = []
for i in range(1,201):
idx = min(score_list)+i*step
score_bin.append(idx)
target_bin = [x[1] for x in items if x[0]<idx]
bad_num = sum(target_bin)
good_num = len(target_bin)-bad_num
goodrate = good_num/total_good
badrate = bad_num