作者:凌岸
来源1:https://zhuanlan.zhihu.com/p/459324020
来源2:https://zhuanlan.zhihu.com/p/541893675
文末点击阅读原文跳转知乎,阅读作者更多精彩文章
建模问题的假设:研究对象未来一段时间内的行为模式与过去相似。社会政治大环境基本不变。
机器学习中监督学习的本质:寻找y到x的一个映射。
一、业务问题转化
如何将业务问题转化为二分类问题。在金融风控领域比较常见的如:
零售客户/小微企业/对公客户/融资人/借款人/交易对手是否会违约
零售客户/对公客户/融资人/借款人/交易对手的信用评级(信用风险)
投融资项目风险预警
汽车保险理赔风险预测/车险团伙欺诈
保险代理人留存预测
银行/证券销售人员违规销售
客户在银行交易/保险/证券/支付等场景是否存在洗钱行为、可疑交易(洗钱风险评级)
是否发生财务报销费用违规、采购人员舞弊(舞弊风险);
是否发生贷款/信用卡/保险/支付/交易欺诈行为(欺诈风险)、
理财/证券/信托客户是否会发生群诉(声誉风险)
以业界较为成熟的贷款的信用评分模型为例:
二、时间窗口设计
1、根据不同的场景,其确定样本时间窗口的方法大同小异,主要以以下三个准则:
确定样本观察点。多根据业务类型,选择距建模时间较近的事件发生时间点。
根据观察点确定数据时间范围,一般选观察点前一年为观察期,观察点后一段时间为表现期。
由于样本中的每个主体的观察点可能不同,得到的时间窗口会不一样。
2、 以贷款违约预测模型场景为例
先验知识:Roll rate table(贷款迁徙率表) 和 Month on book(MOB)帐龄表。其中Roll rate table是迁徙率表,观察的时间颗粒度最好为每个月的累计资产质量分布,这里面需要注意的是累积。
我们的整个定Y的确定,是围绕着两份报表来确定:贷款迁移率表和账龄表。通常比如逾期天数超过某阈值标记为坏样本,如M3+标记为坏样本,且表现期、观察期各限定6个月,当然也根据不同的贷款产品,对着两张报表来看也是不一样的。
我们来介绍一下,贷款迁移率如何确定Y,我们看到迁移率矩阵,一旦到了M2,变坏的概率高达70%-80%,那么处于M2+逾期状态的客户可以认为坏客户,此时就确定了Y。
我们再介绍下(MOB)帐龄表,根据MOB表可以得到Vintage图。这里的话客户的真实违约风险随着时间推移逐渐暴露。
根据行业经验,正常还款12期以上的客户,在12期以后的逾期率会趋于稳定,我们可以作为表现期。从上图我们发现,我们看到12个月的样本表现期(MOB=12)逾期率就趋于稳定。一般建模经验与巴塞尔以协议针对内部风险因子的规范而言,建议12个月较为合适。
这里我们最终确定违约2期以上的比例大概在12期达到稳定,表现期定义为12期。但是使用上面方法去确定Y和模型样本,也要两种方法同时去平衡好,既要保证坏客户精准性(或者表现成熟),也要保证模型样本量。
三、样本选择与好坏样本定义
1、样本选择的原则(结合第二部分):
代表性:样本要可以代表总体。
充分性:总共样本数量大于2000,若太小,则置信度太低。
时效性:样本与未来上线应用的时间越接近越好。
排除性:灰样本需要剔除。比如贷款信用违约/车险理赔风险预测,在构建模型时候,需要剔除掉欺诈样本,以及信用违约里面的Y处于逾期天数在1-90天的(当设置Y为M3+),这样做的目的是为了样本更纯,在业务上没有其他样本进行干扰,在模型上,数据表现不会有太多的异常噪音。
2、按照业务逻辑以及建模假设,确定好、坏样本定义,要有区分度,不包含灰样本。
3、确定数据集
好、坏样本的比例尽量控制在10:1以内。比例控制可以在因子体系构建完成之前或者之后,采用分层抽样的方式进行调整。
样本总量也不能太少,会没有代表性。
区分时间内(观察期,用于训练模型)与时间外(表现期,用于验证模型)样本,两个区间在时间上无缝衔接,时间内样本去
4. 关于样本不均衡问题
随机欠采样 :一般是将正样本采集至预期比例。
分层采样:基于模型的假设,对多类样本进行分层抽样,比如按月进行抽样。
算法采样:样本加权,比如调整模型参数class_weight。对于少类样本进行过采样,如SMTOE算法。其中,SMTOE算法基本思想是合成少量负样本的过采样方法,对少数样本进行分析并进行插值,将合成的样本放入数据集中进行训练。
四、数据集切分
区分时间内(观察期,用于训练模型)与时间外(表现期,用于验证模型)样本,两个区间在时间上无缝衔接。
时间内样本区分训练集和测试集,一般比例为7:3 或者 6:4 或者8:2 ,可自行决定。
数据和特征决定了机器学习的上限, 而模型和算法只是逼近这个上限而已。
特征工程工程做得好决定了模型的上限。金融风控领域对于特征是极为挑剔的,由于大数据的预测模型都是使用过去的历史数据来预测未来几个月或者一年后发生的事件,所以对于模型的效果、特征的稳定性、可解释性需要不断的平衡。
五、特征衍生与特征构造(因子体系构造)
这个在业界的叫法很多,比如变量、特征、因子、指标,英文一般是feature,其实都是大同小异,差不多一个意思。
有一个很重要的就是,在我们利用机器学习来进行分类的时候,需要十分明确的我们的场景,从而才能确定出来我们的因子体系树是什么样子的。可能一家公司在长期做一类场景和模型的时候,会基本上固定套路,但是呢,但凡面临的业务较广,(比如各种机构:银行、保险(财产险、寿险、养老险)、支付、证券、信托、融资租赁等,太多的场景的时候,都需要重新做一套特征,这的确是很大的调整和挑战。
这里我们仍然以贷款违约模型为例。
我们将因子体系划分为:主因子、从因子、分因子、具体指标特征,这样一个特征(因子)树,在进行相关构造特征,进行考量的时候能更加全面。
如下图,我们给出一个特征树,一般业务稍微多元化的金融机构能获取的数据大致如下,本图权当抛砖引玉:
针对征信这类数据展开来说,大概可以从以下几个维度进行衍生,
征信衍生:查询原因:(查询、信用卡审批、贷款审批、但保资格审查、本人查询、贷后管理)
贷款类型:贷款、消费贷款、经营贷款、消费贷款、其他贷款、车贷、房贷、个人消费贷款
贷款状态:开户、结清、未结清、逾期、正常、坏账、到期
时间序列:(近1、3、6、12、24个月)
查询机构:(四大行、除四大行外、公司、小额贷款、微众银行、消费金融)
计数项:(次数、最大值、最小值、时间间隔、比值、平均值)
同时在衍生特征的时候我们要注意几个要点:
a.特征:如期间内单日交易金额。
b.特征衍生:如期间内单日交易金额最大值、最小值、均值、方差。
c.特征交叉:如某年龄段x期间内单日交易金额。
d.不能放入泄露结果信息的因子。
c.feature_tools 可以自动衍生特征。
以上是较为传统的特征衍生方法,即从结构化的数据中抽取特征。这里一般一家企业都会有一个成熟的特征库,以金融行业举例可以映射到如 个人客户、公司客户等维度,已经有成熟的计算逻辑,且可以保证离线更新。实际上在风控领域,目前使用的方法还包括,从LBS数据、文本数据、关系图谱里面提取特征加入到建模特征中,进而提升整个模型的效果。
下面我们说说从关系图谱中提取的特征:
a.浅层关联特征(通过业务经验在子图中直接查询到):
浅层关联特征举例:多个节点的联系人电话相同、多个非同名的账户都是对应一个地址,主体邻居的节点个数
b.深层关联特征(通过图算法计算出的图特征):
深层关联特征举例:主体中心度、主体聚类系数、主体PageRank值,经过主体的三角形数量;主体通过多层穿透转入某一账户、主体与异常账户关联强度高;(需要通过单位时间的交易金额和交易时间去计算交易权重,进行资金流向穿透识别)
六、特征工程/特征选择
实际上特征选择就是考量预测能力、相关性、稳定性、业务合规性、可解释性等维度,从而不断剔除掉一些特征的过程。
一般来说从两个角度判断:
技术角度:基于缺失率、xgb/RF特征重要性(选择top95%,可多次训练看看结果)、线性相关(皮尔森系数)、变量多重共线性(膨胀因子)、变量稳定性(<0.1)、shap的特征贡献度排序。
业务角度:合规性、可解释性、能否实时上线。
下面介绍几个常用的方法,也是由简单到复杂。
1、同质性检验
检测某特征/因字取值是否几乎一致,阈值可设为90%,类似特征看下是否考虑加入规则引擎作为强规则进行过滤。
2、缺失值处理
缺失率 80-90%,缺失值太多不可用。
缺失率20-80%,单独分箱。(树模型对于缺失值也不敏感)
缺失率20%以下,可用0或者均值、中位数等进行填充,需依据业务经验进行填充。
3、离群/缺失值处理
异常值回溯检验,或根据业务或依据统计值修改填充。
4、WOE分箱与IV值计算
分箱有几种方法:等频分箱(按照样本量等分)、等宽分箱(按照实际取值等分)、最优分箱、决策树分箱、卡方分箱、聚类分箱等方法。
我们这里采取一种解释性和操作性比较好的方法:在通过等频分箱后,根据bad_rate和pcrt再进行分箱调整,采用负样本占比差异最大化原则。
(1)相邻分箱之间的负样本占比差异化最大(箱合并原则),这样bad_rate之间有区分度。
(2)分箱数量不要太多,最好是5个(可适当性调整,通常不超过10箱),而且每一箱的占比不能低于5%
(3)bad_rate 和prt(分箱占比),bad_rate符合单调递增或者递减,符合业务解释。
(4)WOE值与IV值:可以参考我的另外一篇文章,如下:
要注意的是 U型变量对于广义线性模型的区分能力有一定的贡献。
5.、特征之间的相关性
相关性检验单的原因:对于广义线性模型假设了自变量之间是不存在严格的线性关系。
计算方法:皮尔森相关系数, r = x1和x2的协方差/ (x1的方差 * x2的方差)再开方
最终在筛选的时候可以考虑保留特征区分度大的,IV值高的。
6、方差膨胀因子进行检验
7、shap贡献度
使用shap进行模型可解释性分析,对特征贡献度进行排序,筛选特征贡献度较高的因子入模,降低过拟合程度。通过特征重要性排序,然后使用for循环,每次去掉一个特征,看看最佳是多个特征,AUC开始下降,从而确定入模型的特征个数。
8、业务角度进行筛选
在做特征构造和筛选的时候,往往大家都会把区分度好的特征都堆进模型,这样在测试集上的模型性能会非常的好看,但在挑选特征的时候,除了区分度之外,还有其他的因素也是不能忽略的:
a. 特征的覆盖度
只有特征的覆盖度够高,能在众多样本上发挥作用,才能让模型的线上的整体性能提升。
b .特征的稳定性
时间也是一个重要维度。只有特征的分布随时间的变化不是很大的前提下,历史学习到的统计信息才能在尽可能长的未来保持相应的区分度性能。
c .特征的可解释性
风控的对象是人,我们要透过数据去理解人的行为,所以我们构建的特征是需要人能够理解其风险情况的,如果一个特征的效果很好,但它在风险上的表现和我们常识相违背或无法理解,这样的特征是很难去说服业务方采纳的。
题外话,同时本文的很多地方在整个风险领域建模是通用的,反而获取新的数据源才能有效提升模型的效果。
文章来之知乎大佬:凌岸。有兴趣的可以关注下,获取更多文章。
往期精彩:
SynchroTrap-基于松散行为相似度的欺诈账户检测算法