老饼讲解:一步一步上手学习
在评分卡实际项目中,一般都以是手动分箱为主,也就是说,"先自己手动分箱,然后构建评分卡"这种场景是最常见、最常用的,好了,我们这节就先来讲讲这种场景在bbbrisk中应该如何实现评分卡。
本节我们先来说说数据手动分箱后的结果,以及展示相关的代码。
在本文中,我们以bbbrisk的bloan小贷数据为例,来讲解如何构建评分卡。
bloan数据共2万条,包含10个变量,示例如下:

各个变量的意义如下:

我们都知道,在构建评分卡之前,需要先对数据进行分箱,而分箱又分为手动分箱和自动分箱,这里我们采取手动分箱,因为在比较正式的项目中,都是以手动分箱为主,这样可以确保评分卡更具解释性、稳定、合理。
手动分箱一般是指用badrate分析法来进行分箱,并根据badrate来选择出趋势较强的变量。
下面是笔者通过手动分箱后各个变量的分箱结果:

....

可以看到,10个变量的badrate都有非常明显的趋势,它们都是有效的,所以我们把它们都作为入模变量。
每个变量是分箱的、分析过程,详见《评分卡-手动分箱-示例》。
好了,在确定好数据的分箱规则之后,就可以构建评分卡,以及计算阈值表、打印相关报告等等了。
下面我们直接上代码,如下:
# 本代码展示手动分箱时,在bbbrisk中如何构建评分卡
# 本代码来自《老饼讲解-评分卡》www.bbblearn.com
import bbbrisk as br
#加载数据
data = br.datasets.load_bloan() # 加载数据
x = data.iloc[:,:-1] # 变量数据
y = data['is_bad'] # 标签数据
# 变量的分箱设置
bin_sets = {
'rev' :[[0,0.1],(['-',0],[0.1,0.37]),[0.37,0.64],([0.64,1.2],[2,'+']),[1.2,2],]
,'age' :[[80,'+'],[60,80],[45,60],['-',45]]
,'city' :[('J','E','I'),'_other',('D','N','S'),('F','P')]
,'income' :[[1000,5000],[5000,9000],(['-',1000],[20000,'+'],None),[9000,16000],[16000,20000]]
,'marital':[1,0,2]
,'debrate':[([0,0.1],[850,'+']),([0.1,0.5],[5,850]),([0.5,0.8],0),[0.8,5]]
,'due30' :[0,1,2,(3,4),[4,'+']]
,'due60' :[0,1,2,[2,'+']]
,'due90' :[0,1,[1,'+']]
,'loan_num':[[3,'+'],(2,3),1,0]
}
# 构建评分卡
model,card = br.model.scoreCard(x,y,bin_sets,train_param={'random_state':0}) # 构建评分卡
score = card.predict(x[card.var]) # 用评分卡进行评分
card.featureScore # 评分卡-特征得分表
card.baseScore # 评分卡-基础分
# 打印结果
print('\n-----【 模型性能评估 】----')
print('* 模型训练AUC:',model.train_auc) # 打印模型训练数据集的AUC
print('* 模型测试AUC:',model.test_auc) # 打印模型测试数据集的AUC
print('* 模型训练KS:',model.train_ks) # 打印模型训练数据集的KS
print('* 模型测试KS:',model.test_ks) # 打印模型测试数据集的KS
print('\n--------【 模型 】---------')
print('* 模型使用的变量:',model.var) # 模型最终使用的变量
print('* 模型权重:',model.w) # 模型的变量权重
print('* 模型阈值:',model.b) # 模型的阈值
# 计算阈值表与分数分布图
thd_tb = br.report.get_threshold_tb(score,y,bin_step=10) # 阈值表
br.report.draw_score_disb(score,y,bin_step=10,figsize=(14, 4)) # 分数分布代码运行结果如下:

在建模时,会先用逐步回归筛选变量,减少变量个数,如图所示,当添加marital变量时,AUC提升不明显,因此不再添加变量,最终只选择5个变量。建模完成后,可以看到模型的训练、测试数据的AUC和KS,以及模型参数等等。
好了,下面我们一起来详细看看评分卡的各项结果,例如模型训练结果、评分卡结果、报告结果等等。
在训练完成后,一般需要先评估一下模型的训练、测试AUC、KS指标,并检查模型系数的合理性,如下:

根据模型的参数,我们也可以得知,最终的逻辑回归模型表达式为:
备注:这里各个变量的值指的是变量的woe,即上式中的rev变量指的是rev变量对应的woe值。
好了,建模完成后得到的评分卡表在哪呢?它在card变量里,card.featureScore和card.baseScore分别存放了特征得分与基础分,两者合并后就是最终的评分卡表了,整理后得到评分卡表如下:

使用上述卡表进行评分,只需计算出每个特征的得分,再加上基础分,就是总评分了。
我们知道,评分卡也可以通过如下的评分公式来评分:
模型系数w、b在model.w和model.w中(具体值上面已经展示了),而评分系数则在card.factor和card.offset中,它们分别为factor=-28.85、offset=712.87,从而得到评分公式如下:
备注:同理,这里各个变量的值指的是变量的woe,即式中的rev变量指的是rev变量对应的woe值。
代码中的report.get_threshold_tb用于计算阈值表,阈值表计算结果如下:

根据阈值表,就可以选择一个合适的阈值,用于判断样本是否能通过。
代码中的report.draw_score_disb用于绘制分数分布图,所有样本的分数分布图如下:

这里横轴代表的是分数起始值,例如610代表[610,620)之间的样本个数,其中绿色是好样本、红色是坏样本。
这节我们讲解了在bbbrisk中,如何先手动分箱、再构建评分卡、打印报告的代码实现方法。在这里我们不具体讲解每个变量的手动分箱是怎么得来的,因为这在实践中是一个重头戏,所以我们放在后面再详细逐个变量讲解,事实上,当完成分箱后,直接套用本文的代码,一下就可以构建出评分卡了,所以整个评分卡的工作其实都在分箱上。
评论