项目需求:现某金融公司想要通过建立信用风险评分卡对客户进行判断,是否发放贷款
项目描述:数据来源 kaggle 数据量 4 万条,原始字段数 33 个
项目目的: 使用机器学习构建信用卡评分模型,对新样本做出预测
环境和工具: Rstudio, prettyR, smbinning
流程:
1.数据探索:完全缺失字段,以及二分类变量正类缺失的字段进行删除,对异常值采取盖帽
法进行替换
2 对变量进行分箱操作。使用 smbinning 包中的函数,通过决策树进行最优分箱,得到每
个变量的分箱结果,以及对应的 IV 值和 WOE 值。
3 通过 IV 值大于 0.02 的部分,筛选变量(性别,年龄,婚姻,区编号,是否有家庭电话,
工作年限,收入共 7 个变量),并通过 smbinning.gen 和 smbinning.factor.gen 函数生成
新的变量并生成新的数据表。变量值为分箱后对应的 WOE 值,数据模型进行建模
4 采用 Logistic(逻辑回归)进行学习建模,对输出结果通过 smbinning.scaling 进行打分,
生成评分卡
5.通过评分卡对原数据客户进行打分, 基本判断,好坏客户的分数取值分布情况。其次通
过 smbinning.metrics()输出结果, 得到评分卡的分数最优阈值为 546, AUC 值为 0.66,
并不是很好,准确率(precision)达 87.6%
6 最后通过评分卡,使用 excel 表格,运用 vlookup 函数,对新的客户进行匹配打分
模型使用 Rstudiuo 进行搭建。使用包: base,subning,prettyR, 使用函数: glm subning
subning.factor subning.gen subning.factor.gen sunbning..plot
开始:
首先导入需要使用得包:
1 数据工程:
数据探索阶段
,发现数据中有部门字段内容全部缺失,以及部分二分类变量只有 1 个有值,
故这两种情况无法参加建模,将其找出删除。 同时识别出哪些字段是因子型,哪些是数值型,
方便后面分箱使用不同得函数,其中数值型字段用:smbinning 因子型使用:smbinning.factor
异常值处理
: 通过箱线图判断是否存在异常值, 使用盖帽法,用 99 分位点值代替极大异常
值,有 1 分位点值代替极小异常值的方法
由于 smbining 函数中得打分是 1 是信用高得客户,故这里将目标变量得 0 和 1 值互换
变量分箱
:使用 smbinning 函数,运用回归决策树最优分箱,从而使得类之间的相异性尽
可能大(由于变量较多,这里不一一列举,拿两个字段举例),其中连续变量使用得函数为:
smbinning 因子变量: smbinning.factor
连续型变量
举例: 首先用箱图查看数据分布情况,若分布区别不明显,可以使用 T 检验(数
值变量对分类变量得影响),有显著性再进行分箱,否则无意义
年龄属性得分布情况如上图,通过 T 检验, P<0.05,表明原假设被拒绝,认为属性对目标变
量有显著影响,可以进行分箱
Smbnning 对年龄得分箱结果,是通过回归树进行最有分箱,由树图可知:划分点为: 19,
22, 32, 37, 46, 59 六个点,分为 7 个区间属性,同时获取响应区间 WOE 值以及总得 IV
值。
年龄得 IV 值为 0.2.WOE 分布如下图,可加分箱分布有明显趋势,说明分箱结果不错,可以
加入模型。
用年龄字段进行分箱得完整代码如下:
对其他得数值变量,通过同样得方式进行分箱操作,并获取 IV 值。
因子型变量分箱
分类型变量
以性别举例说明:通过前期数据探索,发现性别变量有部分值没有指明性别,这
里用众数填充, :
对于分类变量采用得是卡方检验,来检验分类是否对目标变量有显著性得影响,这里 P 值
很小,表明拒绝原假设,即性别对信用度有显著影响,可以进行分箱
分箱结果得分布如下:可以看出,女性相对于男性更容易违约
分类变量分箱也采用的是 smbinning 包,不过 smbinning 包中就是用原分类值进行属性
划分,未对划分属性处理,分类变量用的函数是 smbinning.factor(),最后得到 SEX 的 IV
值为 0.0274。具体执行代码如下:
再举一个电话区号得例子,可能很多人直接做数值型变量处理了。通过数据探索发现,大部
分得申请者都是来自于四个地方,其他得地方人很少很分散,这里有明显得地域偏向,所有
我将其处理为类别变量,除了 3 个申请人较多得地方分别为一类,其他得地区划分为一类,
共四类进行处理;
通过 WOE 分布还是比较好得分箱, IV 值 0.0389
具体代码如下:
接下来所有变量进行分箱之后,得到所有得 IV 值,一般认为 IV 大于 0.02,对构建评分卡
有一定得价值,所以这里以 0.02 为界限进行变量筛选。最终选择性别,年龄,婚姻,区编
号,是否有家庭电话,工作年限,收入共 7 个变量进行建模。
一下是 IV 值及分布情况:
对于分箱后的数据,使用 smbinning 得函数,生成分箱后的数据,生成新得数据集,通过
logistic (逻辑回归),建立评分卡模型。其中声中分箱结果数据使用得函数,数值型分箱
变量用函数 smbinning.gen(),因子型变量用函数 smbinning.factor.gen()。通过逻辑回归
结果可以看出,分箱后得变量都较为显著
有了模型给出得预测结果,就可以对其进行打分了。使用 smbinning.scaling 函数,通过调
节 pdo, score, odds 三个参数,是的评分卡得分值在合理得范围内。这里评分卡区间为
(345-798)。并将评分卡保存到文件。代码如下:
评分卡得最终结果展示如下:
评分卡建好,这里是使用 smbinning.scoring.gen 对原数据集数据进行一个打分。并查看
好坏客户的得分分布情况,
其次通过 smbining.metrics()函数,从输出报告可以看出,最优阈值为: 546, AUC 值为
0.66,并不是很好,准确率(precision)达 87.6%,结果及代码如下图
预测
:
针对新样本,我选择用 Excel 工具获得信用评分,使用 VLOOKUP 函数可以很方便地得到
想要的数据,评分展示如下,选择 cutoff 值为 546,这里认为(526,546)的客户为关注客
户,信用情况中等, 546 分以上的客户信用情况良好, 526 分以下的客户信用情况堪忧。 其
中符号: ✔表示信用良好, ! 表示信用中等, × 表示信用较差
附上数据源:kaggle:https://www.kaggle.com/yuzijuan/credit-card-scoring/data