由于前几个月参与了一家股份制银行的信贷风控项目,其中我负责了贷前评分卡建模相关工作,最近刚完成模型交付,在此总结记录一下,从数据诊断到样本提取,再到模型构建的全流程工作内容。

本文主要侧重实地驻场建模时,遇到的问题和需要关注的点,对一些技术上的原理不作赘述,主要按以下顺序记录:

一. 数据诊断

二. 数据提取

三. 数据预处理

四. 变量分箱

五. 变量筛选

六. 模型建立及评估

七. 评分卡构建及生成

一. 数据诊断

此处的「数据诊断」,是指针对行方数据库中那些对我们之后建模工作可能有用的相关数据,进行探索分析及诊断,也属于样本筛选的前期准备工作。在数据诊断过程中,可熟悉行方数据库的构成,后续可更精准地筛选样本,更快速地提取数据。

一般来说,这步工作包括:

1)原始数据检测

虽然不同银行的数据库结构不会完全相同,但大都是根据业务上不同的作用进行分块的,所以当我们接触过两三家银行的数据后,会发现基本是大同小异的。一般来说,不同的业务场景会设置专有的数据系统,例如台账系统、监管系统、理财平台等;另外,如今大多数商业银行都会和第三方平台合作,针对这些合作的业务,也会有专门的数据系统,例如:微粒贷、京东白条、蚂蚁借呗、 花呗等。

当我们结合数据字典,通过写一些SQL逐步摸数(其间也需要和行方对接人员进行一些关键问题及细节的确认),大致了解行方的数据库系统后,就可以基本上确认我们的数据使用范围了,这个环节也需要和行方数据/业务人员进行确认,保证数据范围选择无误且无疏漏。

2)贷款数据统计分析

由于本次的建模场景是一个全新的贷款产品,行方并没有该场景下的数据积累,因此只能使用类似贷款产品的历史数据来作为训练模型。那么若要从过去的业务场景中找出相似产品,需要关注哪几个维度呢?一般可以看以下几方面:

  • 贷款类型:有抵押 or 无抵押

  • 额度范围

  • 利率范围

  • 目标客户

按照以上几个维度,在行方过去的业务数据中挑选相似场景的样本,如果体量实在太小,也可以把几个不同场景的数据合并,虽然从业务意义上来看,这样会影响模型的精度,但还是应该以保证样本量为前提。按照目前的实践经验来看,样本量最好能在1w以上,如果变量的数据质量高,5k也勉强可以。

注:在某些实际场景的贷前评分卡建模工作中,若行方已提供可用来建模的样本(该信贷产品可能已经上线一段时间,有样本数据积累),建模人员可能就不需要进行「数据诊断」工作了。

二. 数据提取

进行这一步的前提是,我们已经确定了建模样本以及特征变量的范围,及它们所在的数据库位置。数据提取包括以下两步:

1)样本提取及y标签划分

一般根据业务经验,可以提取近3-5年的数据,如果样本量实在过小,也可适当放宽时间范围。在大部分数据入模训练的同时,还要保留一小部分时间外的样本,验证模型的效果。例如,现提取近5年的样本数据,可用前4年的数据作为训练+测试数据,第5年的数据作为时间外样本来验证模型的效果。也就是说,全部的数据被分成了三块:训练集、测试集、验证集。

此处的样本即对应每一笔贷款,其主键为贷款申请的ID或编号。提取完样本后,这里还需要给每个样本打标签,划分这笔贷款是不是一笔“坏”的贷款,即确认这条数据的y是1还是0。科学的划分方法是 —— 计算滚动率。关于滚动率如何计算已经有很多大佬出过教程了,如求是汪大佬的这篇:求是汪在路上:信贷风控中Vintage、滚动率、迁移率的理解

2)特征变量X提取

对于银行来说,特征变量一般包括以下几方面:

  • 客户基本信息:年龄、学历、婚姻情况等;

  • 行内数据:如果是主要面向本省或特定区域的业务,申请人大概率是银行的老客户,可根据申请人之前在银行的交易和信贷行为,制作一些衍生变量,如:信用卡使用率、行内贷款最高逾期期数、行内信用卡最大逾期金额等。一般来说,行内数据的提取相对麻烦,因为乙方人员不了解甲方银行各业务条线数据的表逻辑,需要与行方人员多沟通确认;

  • 人行征信:这块数据是一定会有留存的,大多数风控建模人员对征信变量的衍生也较熟悉,可以从中造出很多有用的变量;

  • 外部三方数据:随缘,有些规模小的银行,几年前的业务可能还不太会引入外部数据辅助风控决策。就算之前在业务里有用过,也要看新业务中是否还会使用同一外部数据源。

三. 数据预处理

由于直接从数据库提取出来的数据都比较脏,为了保证后续的数据分析及建模,需要对其预处理,一般包括以下几步:

  • 纠正时间格式:由于不同表提取出来的时间变量格式不同,此处把它们统一处理成相同格式,以便后续用Python处理;

  • 缺失值处理:针对不同变量,选择不同的缺失值处理方式。根据变量的业务含义,有些变量的缺失值可能有意义,直接用“missing”填充。有些变量可用平均值或频次最高的枚举值来填充。若某些变量的缺失率达到一定阈值(一般设定80%),可以直接剔除掉。

  • 异常值处理:可对各变量分别进行可视化,观察其分布上是否存在异常值;也可通过计算分位数的方法进行观察。如出现异常值,需判断是系统录入过程中出现的错误,还是具有业务意义的值。若是前者,例如年龄变量下出现168岁,则根据申请人出生日期和贷款申请日期计算当年的年龄,进行修正。

注:后两步处理都依赖业务经验,还需具体情况具体分析。

四. 变量分箱

如果我们搜索“为什么要做变量分箱”或者“变量分箱的目的”,你会看到以下解释:

离散特征的增加和减少都很容易,易于模型的快速迭代;

稀疏向量内积乘法运算速度快,计算结果方便存储,容易扩展;

离散化后的特征对异常数据有很强的鲁棒性,降低了模型过拟合的风险;

逻辑回归属于广义线性模型,表达能力受限。单变量离散化为N个后,每个变量有单独的权重,相当于为模型引入了非线性,能够提升模型表达能力,加大拟合;

离散化后可以进行特征交叉,由M+N个变量变为M*N个变量,进一步引入非线性,提升表达能力;

可以将缺失作为独立的一类带入模型;

将所有变量变换到相似的尺度上。

毫无疑问,以上每一条都是变量分箱的优点,但在实际风控建模场景下,个人感觉最关键的三点是:

1)帮助模型找到更明显的规律

在建模数据中,大多数变量的分布都比较平缓,少有特别强的特征(特别强的特征可以直接拿去做规则策略了,不用非得苦哈哈建模了)。通过分箱,可以使某些分布平缓的连续变量转化成更有规律的离散变量。

2)避免异常值干扰

如果不对变量分箱,模型很易受异常值的干扰。例如,在我们的训练数据中,某个变量a的取值范围可能是0-100,后来出现的新数据中a=500,此时该异常值会对模型结果产生很大影响。但如果我们对变量做了分箱,如使 [80, +∞) 区间内的数据有同样权重,即可避免异常值的出现对预测y产生过度干扰。

3)使结果具有可解释性

这也是目前银行和互金公司的一个区别,互金公司更倾向于更高的精度和时效性,对可解释性的要求较低;而银行倾向于以可解释性和稳定性为前提,然后追求更高的AUC和KS。

分箱后的变量全部变成了离散数据,不仅模型受到新数据的影响较小,且模型结果的解释性更强。人眼很容易看出模型为什么会给出这样的评分结果,因为可以看到申请人各变量所处的分箱及对应的分数,直观又简单,让风控人员有种“一切尽在掌握”的感觉。

当然,随着银行线上化、数字化的程度越来越高,业务模式将会越来越接近互金的模式,到那时银行的侧重点也会随之变化。

那么变量分箱有哪些方法呢?主要有以下几种:

  • 卡方分箱

  • 决策树分箱

  • Best-KS分箱

每种分箱的详细步骤在此不赘述,网上一搜一大把。另外,谢博士-scorecardpy中的woebin()提供了卡方分箱和决策树分箱两种方法。scorecardpy的使用方法可以参考这篇:

哥布林守护者:评分卡建模工具scorecardpy全解读​

并不是用函数完成分箱这一步就结束了,还要去check一下各变量的分箱结果是否合理。常见的问题有:

  • 部分区间的好坏比例失衡,甚至会出现好或坏的样本数为0,此时的WOE值无穷大;

  • 分箱后,随着分箱的取值,bad_rate不具备单调性。

一般可借助可视化的方法进行观察,如使用scorecardpy的woebin_plot()可得到下图:

经观察,可通过手动剔除一些分箱中的分割点,将一些箱合并,来解决上述问题。但值得强调的一点是,不是所有变量都是单调才合理的,还有一些变量可能是U型的。例如年龄变量,大多数场景下年轻人和老年人的违约风险要高于中间群体。基于上图的分箱,可考虑将28岁这个分割点剔除,将[26, 28)和[28, 35)两个箱合并,可得到更合理的分箱方式。

完成分箱后,就可以作WOE转化了,这里也不赘述,方法很简单,很多工具包也都有现成的函数可以直接计算。

五. 变量筛选

完成变量分箱后,来到了变量筛选环节,本环节一般涉及以下两步:

1)计算IV值

做完WOE转化就可以继续计算IV值了,WOE对应的是单个变量的某个分箱,而IV对应的是单个变量的整体。计算完各变量的IV值后,就可以用来筛选变量了。

一般来说,IV值越高,代表该变量的区分能力越高。一般我们会剔除掉IV<0.2的变量,若在实际项目中,按0.2筛选后留下的变量实在太少,也可以考虑适当调低阈值,改为剔除IV<0.1的变量。不过也要注意,IV值过大也不正常,若有IV>0.5的变量,需确认变量的业务含义,是否为滞后变量。

2)相关性分析

接下来,就是对所有保留下来的变量做相关性分析了。若变量之中存在共线性,会导致以下问题:

  • 信息冗余

  • 模型不稳定

  • 降低显著性,甚至造成符号失真

这里可选择皮尔逊相关系数,得到相关系数矩阵后,找到那些相关性大于0.8的变量组合,保留其中一个,选择标准可参考:

  • 选择IV值较大的那个

  • 选择分箱较均衡的那个

六. 模型建立及评估

到最后两个步骤,就相对简单了,都是比较标准化的流程,不太涉及业务上的东西。

值得一提的是模型效果,贷前评分卡场景需关注AUC和KS两个指标:

在我参与的这个建模场景下,由于样本本身的来源和质量问题,AUC达到0.7算合格,如果在0.75以上可以算是良好水平。KS在0.2以上属于合格水平,大于0.4就很优秀了!

在驻场建模时,最痛苦的情况可能是,一路披荆斩棘来到了倒数第二步,然后发现模型AUC只有0.6…… 这时不要慌,回到最初的起点,调整一下各数据集切分的时间点,然后再一步步走一遍,适当调整各个阈值的设定。

多试几次,如果实在不行,再耐下心回头翻翻数据库,挖一挖有没有可用的特征了。

如果都试过了还是不行,也不要怪自己,把锅丢给数据质量问题(甲方)就对了!(狗头保命)

七. 评分卡构建及生成

以上就是用逻辑回归构建评分卡模型的过程,最后一步就是把模型转化为评分卡了。

关于评分卡转化的原理和推算过程,可以看看这篇:马东什么:信用评分卡的转换

此处需要提的一点是,在网上的一些介绍评分卡的文章中,评分卡的结果往往都是正负数混杂,观感不是很好,且在使用过程中,业务人员对各变量的分箱感受会有偏差。我们可以通过把base points均分给每个变量的得分,使所有分数都变成正数。


⬇️ 扫描下方二维码关注公众号【小数据研究院】 ⬇️

回复【算法】,获取最全面的机器学习算法网络图:

【项目经验总结】贷前评分卡建模全流程指南相关推荐

  1. 风控评分卡建模全流程

    风控评分卡建模全流程 前言 本文将通过 python 代码演示传统评分卡建模的全流程,比较通用的一个版本.评分卡已经发展得非常成熟了,对于不同业务或者不同建模人员下的模型构建过程可以称得上是大同小异. ...

  2. 金融风控评分卡建模全流程!

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:桔了个仔,南洋理工大学,数据科学家 知乎丨https://zhua ...

  3. 使用toad做一张逻辑回归贷前评分卡

    前言 对于金融信贷和保险行业,贷前/保前对客户的进行一个信用评级和打分是必要的,也就是需要构建一张评分卡,传统评分卡多是专家打分,基于机器学习的评分卡则更多是通过可解释更强的逻辑回归来构建,最近学习过 ...

  4. 【新书速递】评分卡建模红宝书,夯实智能风控底座

    近些年来,智能风控技术在金融风险管理中的应用越来越广泛.智能风控利用金融大数据.机器学习.深度学习.强化学习.时序数据分析.异常检测.社交网络分析.图深度学习.知识图谱.自然语言处理.文本挖掘等智能分 ...

  5. 风控建模系列(六):催收评分卡卡跟贷前申请卡关于目标变量的定义

    关注公众号" 番茄风控大数据",获取更多数据分析与风控大数据的实用干货.   在评分卡的所有的开发流程里,我一直在强调最重要的就是关于Y变量的定义了.目标的定义是重中之重.定义一旦 ...

  6. 数据挖掘项目:银行信用评分卡建模分析(上篇)

    kaggle上的Give Me Some Credit一个8年前的老项目,网上的分析说明有很多,但本人通过阅读后,也发现了很多的问题.比如正常随着月薪越高,违约率会下降.但对于过低的月薪,违约率却为0 ...

  7. 数据挖掘项目:银行信用评分卡建模分析(下篇)

    以下是银行信用评分卡建模分析下篇的内容,包括特征工程,构建模型,模型评估,评分卡建立这四部分.其中如果有一些地方分析的不正确,希望大家多多指正,感谢! 上篇文章的链接:数据挖掘项目:银行信用评分卡建模 ...

  8. 关于行为评分卡建模的数据准备

    ©作者 | 洪一潇 01 行为评分卡的介绍 信贷风控场景中,存在A卡(申请评分卡).B卡(行为评分卡)和C卡(催收评分卡)三张主要的评分卡.评分卡以分数的形式来衡量未来一段时间内违约.逾期.失联等风险 ...

  9. python 去除nan inf_Python实现半自动评分卡建模(附代码)

    作者:Summer Memories 个人公众号:风控汪的数据分析之路 知乎专栏:小鑫的数据分析笔记 这次分享一个自己写的python脚本,可以实现半自动化的评分卡建模.运行脚本时需要input已经预 ...

最新文章

  1. 解决oracle11g安装导致数据库无法自动搜集统计信息-转
  2. Nginx搭建静态网站
  3. boost::parameter::template_keyword相关的测试程序
  4. java哈希_Java Hashtable 类
  5. C4C里产品主数据和销售组织数据维护的相互作用和相互影响
  6. Serializable和Parcelable
  7. php cli和fastcgi,php的几种运行模式CLI、CGI、FastCGI、mod_php
  8. 搜索页面html代码怎么写,页内搜索功能源代码
  9. 操作系统——实验贰——进程通信(一)管道及共享内存
  10. Linux平台音频测试程序
  11. [转载] python string 字符串转换为字典 dict
  12. 春天的旁边_春天@PropertySource
  13. 长沙理工考研2021计算机软件科目,2021考研进行时:速览最新招生信息
  14. 每一个写博客的程序猿,都应该被温柔对待
  15. 《受欢迎的奶牛》和强连通分支Tarjan算法
  16. snapgene闪退?DNA序列无法显示?无法正常使用?
  17. 紫光华宇拼音输入法V5发布
  18. web开发 省市县三级联动
  19. Netty8# Netty之ByteBuf初探
  20. 只有程序员能看懂的西游记

热门文章

  1. C4D基础学习(四)-造型器
  2. 【报告分享】2020东京奥运-中国观众线上收视及消费行为洞察-易观(附下载)
  3. 云企业网CEN介绍与实践
  4. 银河英雄传说旗舰名称考证—同盟军
  5. Windows ICS 服务无法启动问题解决方法
  6. ubuntu0.18.04 出现 thunderbird-locale-zh-hans: Depends: thunderbird 错误的解决方法
  7. 无限的未知windows 2003完整安装版V6安装教程
  8. 站长在线Python精讲:在Python函数中理解形式参数和实际参数
  9. java获取radio选中的值_获取radio值
  10. 国金证券DevOps建设项目分享——嘉为蓝鲸