目录
老饼讲解:一步一步上手学习

【实例】评分卡-建模代码(手动)

作者 : 老饼 发表日期 : 2026-03-13 07:34:24 更新日期 : 2026-05-12 12:04:00
老饼讲解-简单易懂,干货满满,爽过嗦螺!


在评分卡实际项目中,一般都以是手动分箱为主,也就是说,"先自己手动分箱,然后构建评分卡"这种场景是最常见、最常用的,好了,我们这节就先来讲讲这种场景在bbbrisk中应该如何实现评分卡。

一、评分卡-实现代码-手动分箱

本节我们先来说说数据手动分箱后的结果,以及展示相关的代码。

  • 数据介绍

在本文中,我们以bbbrisk的bloan小贷数据为例,来讲解如何构建评分卡。

bloan数据共2万条,包含10个变量,示例如下:

bbbrisk的bloan小贷数据

各个变量的意义如下:

bbbrisk的bloan小贷数据说明

1.1. 手动分箱

我们都知道,在构建评分卡之前,需要先对数据进行分箱,而分箱又分为手动分箱和自动分箱,这里我们采取手动分箱,因为在比较正式的项目中,都是以手动分箱为主,这样可以确保评分卡更具解释性、稳定、合理。

手动分箱一般是指用badrate分析法来进行分箱,并根据badrate来选择出趋势较强的变量。

下面是笔者通过手动分箱后各个变量的分箱结果:

手动分箱后rev变量的分箱结果

....

手动分箱后loannum变量的分箱结果

可以看到,10个变量的badrate都有非常明显的趋势,它们都是有效的,所以我们把它们都作为入模变量。

每个变量是分箱的、分析过程,详见《评分卡-手动分箱-示例》。

1.2. 评分卡-实现代码

好了,在确定好数据的分箱规则之后,就可以构建评分卡,以及计算阈值表、打印相关报告等等了。

下面我们直接上代码,如下:

# 本代码展示手动分箱时,在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,以及模型参数等等。

二、评分卡-结果详细解说

好了,下面我们一起来详细看看评分卡的各项结果,例如模型训练结果、评分卡结果、报告结果等等。

2.1. 模型训练结果

在训练完成后,一般需要先评估一下模型的训练、测试AUC、KS指标,并检查模型系数的合理性,如下:

模型的训练、测试AUC、KS指标

根据模型的参数,我们也可以得知,最终的逻辑回归模型表达式为:

备注:这里各个变量的值指的是变量的woe,即上式中的rev变量指的是rev变量对应的woe值。

2.2. 评分卡表

好了,建模完成后得到的评分卡表在哪呢?它在card变量里,card.featureScorecard.baseScore分别存放了特征得分与基础分,两者合并后就是最终的评分卡表了,整理后得到评分卡表如下:

制作好的评分卡表

使用上述卡表进行评分,只需计算出每个特征的得分,再加上基础分,就是总评分了。

2.3. 评分公式

我们知道,评分卡也可以通过如下的评分公式来评分:

模型系数w、b在model.wmodel.w中(具体值上面已经展示了),而评分系数则在card.factorcard.offset中,它们分别为factor=-28.85offset=712.87,从而得到评分公式如下: 

备注:同理,这里各个变量的值指的是变量的woe,即式中的rev变量指的是rev变量对应的woe值。

    代码中的report.get_threshold_tb用于计算阈值表,阈值表计算结果如下:

    评分卡阈值表

    根据阈值表,就可以选择一个合适的阈值,用于判断样本是否能通过。

    2.5. 分数分布图

    代码中的report.draw_score_disb用于绘制分数分布图,所有样本的分数分布图如下:

    评分卡分数分布

    这里横轴代表的是分数起始值,例如610代表[610,620)之间的样本个数,其中绿色是好样本、红色是坏样本。

    结束语

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



    图标 评论
    添加评论