评分卡是小贷风控中一种基于逻辑回归的的模型,它以卡表的形式对用户质量进行评分。评分卡一般分为A卡(申请评分卡)、B卡(行为评分卡)、C卡(催收评分卡)、F卡(欺诈评级评分卡)。本文讲解评分卡的原理,以及如何使用python实现一个评分卡。
一、什么是评分卡
1.1.什么是评分卡
评分卡,一般是指用于小贷客户质量评分的评分卡表。评分卡利用历史客户数据,分析出有效的特征(变量),并对变量对行分组(离散化),然后使用逻辑回归模型确定每个变量的权重和基础阈值。最后根据阈值、权重,确定基础分数和每个每个各个分组的分数。评分卡样式如下:
在来了新用户后,根据以上卡表,算出用户最终的评分。
1.2. 评分卡的种类
针对评分的使用不同场景,评分卡一般分为A、B、C、F卡。
A卡(Applicationscorecard,申请评分卡)使用申请时的数据建立评分卡,一般用于审批放款。
B卡(Behaviorscorecard,行为评分卡)加入贷后还款等行为数据,一般用于借贷中的客户的授信等等。
C卡(Collectionscorecard,催收评分卡)使用贷后还款行为数据,一般用于逾期用户的催收。
F卡(Fraudscorecard,欺诈评级评分卡)作用于申请阶段,针对欺诈客户的判断。
使用得最多的是A卡,它是业务的最前端,也是借贷业务的关键。
二、评分卡-原理介绍
2.1. 评分卡原理介绍
评分卡的整个建模过程共4步,如下:
1.建模数据准备
数据准备主要是建模之前,对原始数据进行分箱与变量分析
筛选出与客户质量相关的变量,作为建模的输入特征
2.建模
(1)数据预处理:归一化,并预留测试数据
(2)用逐步回归选出尽量少的特征(同时保持建模效果)
(3)训练逻辑回归模型
(4)检验AUC是否达标,并检查系数是否都为正
3.制作评分卡
制作评分卡也俗称“模型转评分”
将3中得到的逻辑回归模型,制作成评分卡表
4.确定评分阈值
确定生产上判定为坏客户的分数阈值
当分数低于该阈值时,就拒绝客户
上述流程仅供参考,它涉及的细节有许多,这里我们不展开讲述,因为我们借助评分卡包来实现并不需要过分的涉及每一个细节。
相关细节可参考《老饼讲解-评分卡教程》
三、评分卡-实例讲解
这里我们使用bbbrisk评分卡包来实现评分卡,如果python里没有bbbrisk包,可以通过pip来安装。
pip install bbbrisk
3.1. 评分卡-数据介绍
bbbrisk包的bloan小贷数据共包含10个变量与客户好坏标签,数据包含的10变量和标签如下:
数据共2万条,示例如下:
评分卡模型的目标是,依据客户特征数据(10个变量),判断客户是否坏客户(is_bad).,根据客户的特征数据,对客户进行评分,客户质量越好,评分越高。
评分卡最终需要输出两样最基本的东西:
1.评分卡表
2.评分阈值
评分表用于计算客户的评分,而评分阈值则用来判断客户是否能通过,例如,评分阈值为650,那么评分为649的用户就会被拒绝。
3.2. 评分卡-变量分箱
在构建评分卡之前,需要先对变量进行分析与分箱,并选择出有效的变量作为建模变量,如果只是粗糙地看一下评分卡的效果,变量的分箱可以使用算法进行自动分箱。但在实际中往往会手动分箱,效果会更加可控。
bbbrisk包提供了bins.autoBin函数来对多个变量进行自动分箱, 具体代码如下:
import bbbrisk as br
# 加载数据
data = br.datasets.load_bloan() # 加载数据
x = data.iloc[:,:-1] # 变量数据
y = data['is_bad'] # 标签数据
# 自动分箱
bin_sets = br.bins.batch.autoBins(x, y,enum_var=['city','marital']) # 自动分箱,如果有枚举变量,必须指出哪些是枚举变量
bin_stats = br.bins.batch.bin_stats(x,y,bin_sets) # 统计各个变量的分箱情况
br.display.pd.set(width=300,max_colwidth=30,max_rows=30) # 美化pandas的显示方式
for var in bin_stats: # 逐个变量打印分箱结果
print('\n变量'+var+'的分箱结果:\n',bin_stats[var]) # 打印当前变量的分箱统计结果
# 选择iv足够大的变量
select_bin_set = {} # 初始化选择的变量的分箱
for var,stat in bin_stats.items(): # 逐个变量循环
if (stat['iv'].iloc[-1]>0.1): # 当前变量的iv值是否满足要求
select_bin_set[var] = bin_sets[var] # 如果满足,则添加到选择池
print('\n iv > 0.1 的变量与分箱结果:\n',select_bin_set) # 最终选择的变量的分箱
分箱结果如下:
进一步地,代码中统计了样本在各个分箱的分布,如下所示:
…
一般来说,会将iv值太小的变量筛选掉,参见代码里的逻辑。
3.3. 评分卡-建模
在完成变量分箱后,就可以直接使用bbb的评分卡包来构建评分卡,以及打印相关报告,具体代码如下:
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个变量。
card.featureScore和card.baseScore里分别存放了特征得分与基础分,两者合并后就是最终的评分卡表,如下:
代码中的report.get_threshold_tb用于计算阈值表,report.draw_score_disb则用于绘制分数分布图, 阈值表计算结果如下:
根据阈值表,就可以选择一个合适的阈值,用于判断样本是否能通过,具体方法见《阈值表与评分阈值》,所有样本的分数分布图如下:
这里的横轴代表的是分数起始值,例如610代表[610,620)之间的样本个数,其中绿色是好样本、红色是坏样本。
四、结束语
评分卡的内容比较多,更多的细节可以参考如下教程:
《评分卡-入门教程》
《评分卡-分箱教程》
《bbrisk-API说明》