评分卡实例:一步一步实现评分卡(详细长文)

老饼讲解-机器学习icon-default.png?t=N7T8https://www.bbbdata.com/ml/scorecard


目录

(前言一) 数据说明

(前言二) 评分卡建模步骤概述

一.变量分析、选择与分箱处理

(一) 使用badRate法(或iv法)分析变量

(二) 原始数据转为分箱数据

二.模型数据预处理

(一) 转WOE

(二) 归一化

(三) 总结

三.模型变量筛选与建立逻辑回归模型

(一)逐步回归选择尽量少的变量建模

(二)用选出的变量建立逻辑回归

四.模型评估

(一) 用AUC评估

(二) 检验系数是否为正数

五.模型输出(转评分)

(一) 模型输出与应用(概率预测)

(二) 模型输出与应用(转为客户评分)

六、模型阈值表与投产阈值

(一) 模型阈值效果表

(二) 通过阈值表确定阈值

(三) 分数分布图


本文以kaggle上的借贷数据:https://www.kaggle.com/c/GiveMeSomeCredit/data 为例,讲解《建立评分卡模型的全过程》。

本文只讲解流程,完整代码见《评分卡实例:完整建模代码》

备注:1、因为详细,代码略长,可只参考自己仅需要的部分。
           2、数据需要墙,如无法获取,请留邮箱

本文的流程是完整的,详细的,具体的,可以一步步跟着执行。由于文字上比较浓缩, 需要花些耐心。

特别告知:《评分卡系列》文章在本人网站作了更完善更全面的更新,由于改动过大,本文不再更新。一切以老饼的知识网站为主。


(前一) 数据说明

数据共包含10个变量与客户好坏标签:

变量名变量描述数据类型
SeriousDlqin2yrs是否有超过90天或更长时间逾期未还的不良行为二分类(0为好,1为坏)
RevolvingUtilizationOfUnsecuredLines信用卡和个人信用额度的总余额(除房地产以及分期付款债务(如汽车贷款))除以总信贷限额。定量
age借贷者的年龄定量
NumberOfTime30-59DaysPastDueNotWorse借款者逾期30至59天的次数(过去两年中没有恶化)定量
DebtRatio月债务支出、赡养费、生活费除以总收入(负债比率)定量
MonthlyIncome月收入定量
NumberOfOpenCreditLinesAndLoans公开贷款(如汽车和抵押的分期)和信用上线(比如信用卡)数量定量
NumberOfTimes90DaysLate90天逾期次数:借款者有90天或更高逾期的次数定量
NumberRealEstateLoansOrLines抵押和房地产数量(包括房屋净值信用额度)定量
NumberOfTime60-89DaysPastDueNotWorse借款者逾期30至59天的次数(过去两年中没有恶化)定量
NumberOfDependents家庭受抚养人数(不含自己)定量

数据共15万条,如下


(前言二) 评分卡建模步骤概述

评分卡的目标模型是,依据客户数据(10个变量),预测客户是否坏客户(数据中的SeriousDlqin2yrs变量).

整个建模过程共5步:
1.变量分析与分箱:筛选与标签SeriousDlqin2yrs有相关性的变量,并把变量进行分箱,作为建模的输入特征。
2.建模
(1)数据预处理:转woe,归一化
(2)用逐步回归选出尽量少的特征(同时保持建模效果)
(3)训练逻辑回归模型
3.模型评估:检验AUC是否达标,并检查系数是否都为正。
4.将逻辑回归模型预测结果转为评分
5.确定生产上的判定为坏客户的分数阈值


一.变量分析、选择与分箱处理

(一) 使用badRate法(或iv法)分析变量
 

本阶段分析和挑选变量,一般使用badRate法(或iv法)分析哪些变量与客户的质量相关,作为入模变量。

 完整分析流程与变量初探结果见:

《评分卡实例:变量分析-整体流程》

《评分卡实例:变量分析-初探结果》

这里挑选部分讲解如下:

1.badRate法分析过程简介

(1) 筛选出所有与badRate相关的变量,
(2) 精细化分箱
备注:(1)和(2)是反复进行的,一边分箱,一边确定要不要该变量。

2.例子
(1) 先粗略分箱,试探变量的badRate,如RevolvingUtilizationOfUnsecuredLines变量

(2)如果变量的badRate有一定的趋势,就进一步对变量仔细分箱

在本例中,所有变量与badRate都有明显的关系。因此以上10个变量都被选择用于建模。

(二) 原始数据转为分箱数据

最后,将原始数据转为分箱数据,如下:

由于原变量名过长,换成新的变量名:

完整结果见《评分卡实例:变量分析-变量分箱》


二.模型数据预处理

预处理时,将原数据映射成组号,如果直接把组号作为特征变量值,不够理想,组号是等距的,而badrate是不等距的。一般需先将组号转为WOE

WOE的意义与推导可见《评分卡-WOE的意义与推导》

(一) 转WOE

(1) 计算每个特征每个分组的WOE(特征WOE映射表):
即将变量X第i组的输入转为

(2) 将分组转换为WOE
(3) 举例说明
特征 rev_grp 计算得到的每组对应的WOE:

将rev_grp的分组数据转换成分组对应的woe数据:

备注:有些人在分箱时,只作分箱,而不按badRate大小重新调整分组,即badRate不随序号增加而增加,这时,作 WOE转换可解决此问题。

(二) 归一化

为了让模型求解更优秀,逻辑回归需要将数据归一化。
 

(1) 归一化公式 
归一化直接使用如下公式对数据缩放到[0,1]即可:

(2) 举例说明
特征rev_grp 归一化前的最大值为:2.11168472653793,最小值为:-1.49519682401574,则对rev_grp统一作归一化如下:

(三) 总结

总的来说,由分组数据-->woe数据-->归一化数据,如下:


三.模型变量筛选与建立逻辑回归模型

(一)逐步回归选择尽量少的变量建模

逻辑回归过拟合原因主要来源于变量多重共线性,为避免模型过拟合,我们通过逐步回归,在保障模型效果的同时,选择尽量少的变量参与模型。
逐步回归流程:

1.历遍所有变量,将单个变量与目标建模,把模型结果最好的变量作为第一轮选择变量。
2.在第一轮选择变量的基础上,添加第二个变量,历遍剩余变量,添加哪个变量能令模型结果最好,就将其作为第二轮选择变量。
3.在第二轮的基础上,添加第三个变量......
......
直到变量不再对模型效果果带来明显贡献时,就不再添加变量。

则选出的变量,就是变量池中,最具代表的变量。这样既保障了模型的效果,又尽量减少变量的个数。

代码结果:

===========逐回步归过程===============
本轮最佳AUC: 0.7797686643130279 ,本轮最佳变量: rev_grp
本轮最佳AUC: 0.819165147896963 ,本轮最佳变量: due3059_grp
本轮最佳AUC: 0.8410814099324723 ,本轮最佳变量: due90_grp
本轮最佳AUC: 0.8485557426525118 ,本轮最佳变量: due6089_grp
本轮最佳AUC: 0.8523064156957751 ,本轮最佳变量: debratio_grp ,效果不明显,不再添加变量
最终选用变量 4 个: Index(['rev_grp', 'due3059_grp', 'due90_grp', 'due6089_grp'], dtype='object')

可以看到,在加入第5个变量,deratio_grp时,AUC增长并不明显,则可以停止添加变量。只使用前4轮挑出的变量:rev_grp,due3059_grp,due90_grp,due6089_grp

(二)用选出的变量建立逻辑回归

将选出的变量,放到逻辑回归模型中建模,即得到最终的模型。
逻辑回归模型训练较为简单,可调参数也较少,在这一步直接调用模型进行训练即可。

备注:训练时, sklearn默认加入L2正则项,训练时可先将penalty选项设为'none'(即不加入正则项),如果最后训练系数不满意,再改回'l2'训练。

训练完成,即可得到各个特征的权重w和阈值b:

=========模型参数==========
模型系数(对应原始数据): [0.68737659 0.50670396 0.52947426 0.3666265 ]
模型阈值(对应原始数据): -2.5927673435722016

四.模型评估

(一) 用AUC评估

模型的效果评估一般是使用AUC。

PASS:为什么使用AUC,而不是准确率?因为模型预测的是概率,判断最终是好坏,还需要引入阈值(大于阈值,判为坏,小于阈值,判断为好),阈值不同,准确率也不同。而AUC则是所有阈值的准确率的综合评估。

计算模型的AUC,AUC值的意义如下:

AUC>0.63:模型对y有区分度(不可投产)。
AUC>0.68:有效益(不可投产)
AUC>0.73:模型才算优秀(可投产)。

(二) 检验系数是否为正数

除了评估AUC,还需要检验模型是否符合业务逻辑。
由于经过WOE转换,所有特征与badRate都是正相关,因此,系数应都为正数。
如果为负数,需要检验模型哪里出了问题。


五.模型输出(转评分)

(一) 模型输出与应用(概率预测)

上面模型得到的是概率的预测,如果生产上要应用概率模型,则如下输出
1.模型输出

共由三部分组成:

(1) 模型变量:
(2)WOE对应表:由于建模用的是WOE值,需要把分组转换成WOE。
(3)系数w,b

如下:
(1) 模型变量(model_feture):rev_grp,due3059_grp,due90_grp,due6089_grp
(2) WOE对应表:

(3)模型系数:

2.模型应用

预测时:
1.先通过客户特征数据,判断客户各个特征属于哪一组。
2.通过分组,查询WOE表,获得特征的WOE值。
3.根据模型公式,即可计算属于坏客户的概率。

(二) 模型输出与应用(转为客户评分)

评分卡,实际输出的是评分。因此一般是以评分模型作为输出,需要把模型转换成分数输出。
即:

 整理后可得:

备注:评分卡不使用概率转换分数,而是用线性部分转换成分数,这样做的好处是,每一个特征x的分数和就是总分,而如果用概率转分,则单个特征增加s分,总分并不增加s分。

1.将概率模型转换为评分模型

(1) 设置 init_socre,init_odds,delta_score,delta_rate

一般设为:
init_socre  = 600
init_odds   = 50
delta_score = 20
delta_rate  = 2
意思是,
当 odds(坏账概率:不坏账概率) = 50:1时,分数为600.
odds每降低2倍(例如从50:1降为25:1),分数提高20分。

(2) 计算模型的基础分和每个特征每个分组的评分。

先用公式计算offset和factor。

 计算基础分与特征得分:

公式的推导可阅读《评分卡-分数转换与推导》

2.最终评分模型输出

(1) 模型变量:模型使用的变量。
(2) 基础分
(3) 特征评分表:每个特征每个分组对应的评分。

如下:
(1) 模型变量(model_feture):rev_grp,due3059_grp,due90_grp,due6089_grp
(2) 基础分(BaseScore):692.8771237954945
(3) 特征评分表:

备注:(1)生产上往往将所有分数都取整。
             (2)实际交付生产时还需要把特征分组逻辑一起交付

3.模型应用

模型应用时,即对客户评分,如下使用:

(1)先通过客户特征数据,判断客户各个特征属于哪一组。
(2)通过特征所在分组,查询特征评分表,获取各个特征的评分。
(3)计算总分:总分=各特征评分+基础分。


六、模型阈值表与投产阈值

模型投产时,需要确定一个评分阈值,将低于评分阈值的客户拒绝。

(一) 模型阈值效果表

为了结合业务,确定阈值,一般统计阈值效果表。阈值表展示用不同评分阈值,模型在业务带来的效果。

阈值效果表的统计字段如下:

(二) 通过阈值表确定阈值

以评分分组在 [660-670) 为例: 
(1) 先查看《本组坏客户占比》确定阈值上限

该字段说明[660-670)分的客户有5335个,其中坏客户1031个,占比19.33%。说明该组大概切掉5个客户,会有一个是坏的,
先在这一列找到效益均衡点,例如,放款4个好客户的收益,才能抵掉一个坏客户的损失,说明19.33%这一分数是均衡点,阈值不能比670更大,否则损失大于收益。

(2) 再看《损失的客户%》确定阈值。

如阈值取<670,则损失 10.55%客户(15818个),如果损失客户过多,业务上不能接受,则阈值取更小。

(3) 最后评估综合信息.

损失的客户%:10.55%(15818个)
损失客户中坏客户占比:34.5%
剔除坏客户%:54.43%
即使用<670作为阈值,则会损失10.55%的左右,这部分客户里有34.5%是坏客户。使用模型后,坏客户能减少54.43%

(三) 分数分布图

最后的最后,画出分数布,进一步了解模型。
(实际生产中,分数分布图一般为正态分布)


相关文章

《评分卡-模型上线后的监控-PSI》

《评分卡实例:数据初探代码》