机器学习在金融风控的经验总结!
由于这样的特殊性,在Kaggle比赛、推荐等领域中大发光彩的机器学习算法,却容易在金融风控场景中「水土不服」。道理很简单,不是算法不够强大,而是没有抓住金融风控的核心:「可解释性、稳定性」。因为是有关“钱”的安全,风控建模是比较严谨的,保证模型在可掌控、可理解范围内,包括如何评估数据、如何设计模型、如何进行特征工程以及后续模型开发和监控都有一套体系框架;而由于风险滞后性,模型上线后会运行很长时间,故对模型稳定性的要求其实要高于预测能力。
如何减少水土不服呢?下面笔者从数据质量评估、模型设计、特征工程、线上监控环节介绍下在金融风控场景实践的一些经验和踩过的坑。
一、数据质量评估:数据是万坑之源
1.线上线下一致性评估
「数据回溯的坑」
「不熟悉业务的坑」
「计算逻辑的坑」
2.其他评估项
「数据时间项检查」
「主键是否唯一」
过往每一家公司都遭遇过这种情况:离线数据可能存储时存在重复插入的现象,导致主键不唯一,导致计算“求和”、“次数”等指标会出错。实际为避免这种情况,习惯使用count(distinct key)替代count(key),或事先通过group by 去重。
「缺失值/异常值处理」
二、模型设计:如何让你的模型更贴近业务
1. 好坏用户定义
如何定义好坏用户其实是有“套路的”,首先介绍下图的时间轴中的三个术语:「观察点」、「表现期」、「观察期」
- 观察点:用于构建样本集的时间点,不同环节定义不同,比较抽象,这里举例说明:如果是申请模型,观察点定义为用户申贷时间,取19年1-12月所有的申贷订单作为构建样本集;如果是贷中行为模型,观察点定义为某个具体日期,如取19年6月15日在贷、没有发生逾期的申贷订单构建样本集。
- 表现期:定义好坏标签Y的时间窗口,信贷风险具有天然的滞后性,因为用户借款后一个月(第一期)才开始还钱,有得可能还了好几期才发生逾期。
- 观察期:构造特征的相对时间窗口,例如用户申请订单前12个月平均消费金额。设定观察期是为了每个样本的特征对齐,长度一般根据数据厚度决定。
「样本划分」
- 首先按时间将分成训练-验证集和测试集(Out of Time,OOT)
- 然后将训练-验证集随机划分成训练集(In the Sample, INS)和验证集(Out of Sample,OOS)
- 通过INS训练模型,OOS调参,最终以OOT的效果为准,同时要保证这三个数据集的KS相差不大。
「行业通用模型的样本如何设计」
- 特殊样本处理:特殊月份单独拿出来作为测试集/单独建模模型,如暴雷潮、疫情期间的样本。
- 时效性:筛选样本的时候,样本的发生日期不宜过早(比如近2年内),各月份样本量相对均衡,且确保有足够的表现期。
- 代表性:样本需要来自稳定合规的业务,能反应所在细分市场主流的业务场景,另外避开单一地域限制,剔除局部地域业务为主的合作方样本。
- 稳定性:各合作方的样本在各省份上的样本量分布与真实人口分布一致;各合作方在各月份的坏样率要相对稳定。
- 样本相对均衡:不同业务场景的样本量要相对均衡,如消金、银行、现金贷场景的样本量要相当。
2.模型选型:LR真的很差劲吗
- 仅在建模环节使用机器学习模型替代LR,这样一来就不用进行繁琐的用户分群、特征分箱转换等步骤,但是整个评分卡框架不变,包括样本定义、特征分析、模型设计、模型分析等
- 机器学习用于构造特征,如embedding, 这个在下面特征工程模块具体展开。
3.效果评估:KS表是与业务沟通效果最好的方式
- Rank:将模型预测的用户违约概率进行排序,并等分成k组,(k根据样本规模一般取5、10、20)
- #Total:每一组用户总数
- #Bad:每一组坏用户本数量
- %Total_bad:每一组坏用户在所有坏用户中占比
- Cum_%_Total_Bad、Cum_%_Total_Good:累积好坏用户占比
- K-S:每一组的KS=|Cum_%_Total_Bad-Cum_%_Total_Good|,模型的KS值=每一组KS的最大值。
「KS表还有哪些比较有价值的信息呢?」 例如可以看预测风险最高一组是否可以直接拒绝,又如看预测风险最低一组决策进行决策是否可以审批通过。
风控8个场景中的机器学习应用
Zain Mei
- 负样本占比极少,是均衡学习的算法的主战场之一。有标签样本稀缺,从而使得半监督和无监督算法在风控场景下大放异彩。
- 业务对模型解释性要求偏高。同时对时效性有一定要求,这要求在实际建模中要学会去权衡模型复杂度与精度,并且适当的优化算法内核。
- 业务模型多样。每一个模型都和业务目标有着非常高的联系,因此每一个从业者对业务和模型都有很好的理解,从而为业务定制合适的模型。
- 风控数据源丰富。围绕着人展开的数据皆可用,而数据多样带来的就是新兴技术的井喷,结构化数据、图像、文本等等多个领域的方法都在风控领域有一定应用。
信用管理主要分为两个概念,信用和管理。信用意味着先买后付,即使用信用值预支金钱购买相应服务。而管理即通过用户信息对用户的信用度进行评估,并根据信用情况定制风险规避策略。所谓风险控制(风控),即针对用户风险进行管理规避的过程。
智能风控中的机器学习
Zain Mei
Part1.监督训练
对于监督训练任务来说,换算法是最蠢的一个行为,这也是很多人觉得搞算法没用的根本原因。从LR换成XGBoost/LightGBM/CatBoost之后,结构化数据的表现就已经陷入瓶颈。神经网络其实也没有在这一块有特别明显的优势。我自己改了很多数据形态用来适配各种CNN结构,使其拥有拓扑关系,就目前来看提升可有可无。对于平台的风控能力来说,这时候更重要的是客群质量、数据源以及模型的鲁棒性等等。利率改一改,贷后催收,引流方选择,都能直接影响收益。扩充多个纬度的数据源,对模型的提升也远超算法本身。
从类别上来看,样本是有的,只是分布差异很大。也就是很多变量取值,其实是没有出现在开发样本中的。这时候精度越高的模型,或者越仔细的分箱(binning)处理,越可能造成离线时间外样本KS很高,线上场景过拟合的奇怪现象。这也是为什么从业者会经常强调,不要一味追求模型的离线效果(KS/AUC)。因此很多时候,大家更倾向于使用效果没那么好,但是结构透明,决策逻辑没太大问题的模型。
逻辑回归(LR)和决策树(DT)应该是风控用的最多的两种模型,前者用于评分卡,后者用于决策分析产生策略。有时候也用后者做一些特征工程,提取交叉特征给前者使用,毕竟逻辑回归只能对特征的全局进行加权求和,决策树特征工程的引入可以为评分卡模型增加一些非线性能力。然后通过与一些迁移学习算法相结合,也可以获得对应的学习能力。书上有一个通过权重转移实现迁移评分卡的案例。
各种比赛中大放异彩的集成模型(Random Forest/XGBoost/LightGBM/CatBoost)也被用在很多金融科技公司(这里本身是不想提到RF的,我理解它是集成模型的里程碑,但是从没在我的任何一个任务上,超越过LR模型。可能是因为我特征工程的部分被他的精度优势都做进去了,LR又因为复杂度低而稳健)。
- 从开发样本拆出30%样本,或者有测试集就直接用测试集,作为提前停止。
- 数值型不变,文本型转为woe编码;
- 计算IV,一些同学习惯将大于0.5的变量抽出去做加分规则个人觉得从验证集评价指标来说,应该是不会有提升的,不过以策略主导的体系中这样是会更有安全感;
- 计算相关系数,把相关系数大于0.75(举例)的变量中,IV小的那个去掉,避免特征重要性同时被削弱;
- 训练模型,使用SHAP删除贡献较小的特征,虽然逻辑和特征重要性差不多,但是他的一致性是个很好的性质,和书中的迭代删除效果差不多,逻辑也更简单;
- 计算PSI,删除开发样本和测试集以及oot上,PSI大于0.1的特征;
- 自动调参,和书上相同的逻辑,但是参数搜索方式建议使用贝叶斯优化或者遗传算法一类的会快一点;
- 逐个特征删除,个人最喜欢的一步,和书上逻辑一模一样,逐个去掉特征看oot上的ks是否提高,这一步看似使用了oot信息,但其实删特征是不会过拟合的,数据量可以的话,一般这样处理之后roc曲线几乎完全重合,线上稳定性也特别好;
- 将oot和开发样本合并,重新拟合模型,结束。
- 序列特征工程,转化为结构化数据,这块在《智能风控》第二本中有详细的代码,35个函数。基本输囊括了能用上的所有角度。
- 也可以看看海杰的文章;
- 序列模型,比较典型的就是循环神经网络(RNN/LSTM/BiLSTM),以及Transformer。
整个思路可以理解为,将一些文本数据转为词向量,或者具体的标签,用来支持其他模型。用过的模型主要是FastText/LDA/Bert,然后我就一个建议,下个预训练的Bert,在具体任务上Fine-tune一下,基本解决一切问题。还是像上面说的,搞个词向量,求求相似度还行。丢进树模型,感觉稳定性可能会差一些。
- 网络特征工程,不用算法,把 度和各种中心度指标都计算出来,就变成结构化数据了,接下来就是丢进前面的模型。此外还有各种矩阵表示、Node2Vec啥的就不展开说了,书上该有的都有,而且我有点不知道把他们放在这里好,还是放在无监督任务里面好;
- 网络表示学习,监督任务里面,掏出无敌大杀器GCN就完事了,阻碍它的更多是数据量。
Part2.无监督任务
无监督任务我把它分为三种吧:用户画像分析、反欺诈探索、反欺诈识别。当然反欺诈很多任务还是监督的。毕竟以无监督闻名的异常检测任务,现阶段也还是以有监督为主。
- 相关性分析,选择每类变量种最有代表性的变量出来,然后看不同类别变量的相关性,关键是找哪个本应相关却没相关,哪个应该正相关却成了负相关;
- 离群点分析,和bad-case分析本质是一样的。想知道一些具体样本,为什么被错分。现阶段最稳定的离群检测(异常检测)方法,应该还是孤立森林吧,假设欺诈变量池有n个特征,去掉一个,用剩下n-1个特征丢进孤立森林,去看欺诈样本的召回率,这过程本质是在筛选特征,实际上还有很多思路,比如结合GMM,用这些特征去做聚类看每个簇的欺诈比例等等;
模型主要还是针对网络数据来说的。通过社区发现,将团伙圈出来重点跟踪是一个很好的思路。这块算法用Louvian的公司比较多。其实复杂网络算法很多思路都别简单,变着法去找到聚成小簇的人群。问题就是它基于一个非常强的假设,聚集意味着风险 。用来做异常感知是有道理的。直接输出是否是欺诈,1是需要拍一个阈值的,比如这个团体有百分之多少的已知欺诈。2是大多数情况下一个欺诈都没有,只能让尽调团队去关注他们后续有没有开展什么多人运动。
另一方面这样识别的欺诈,依然只是历史欺诈手段,甚至都不能叫对手段的刻画,只能说找到几个和之前欺诈案例长得相似的人。因为参与生产环境决策的模型,不大可能是随机初始化质心的,一定引入了历史出现过的欺诈作为加权或者初始质心,不然精度就起飞了。一个能让人安稳入睡的风控系统,其能力应该是源自于对白样本的刻画,而不是黑样本的记忆。
Part3.优化任务
- 负样本在500以下,跑个决策树足够了,训练个模型KS 0.9,试着反推一下,你得到的这个叶子结点的置信度是多少,不慌么;
- 负样本在500~1500之间,非要训练个模型,怎么办?SMOTE之类的过采样算法以及GMM之类的可以一试,去噪过程写在这里了,用孤立森林去清洗样本也一样的,具体问题要套一下异常检测适配的分析过程,然后这是针对LR模型的,而且是WOE之后的,不要把分箱分的太精细,容易线上过拟合的的部分smote之后只会放大噪声。再提一句,树模型和SMOTE的组合不合理;
- 负样本在1500~50000之间,正样本下采样就行了,如果担心损失信息,可以尝试基于聚类的下采样,比如Kmeans中取质心作为到正负样本合适之类的。
- 负样本超过50000,随意,我觉得样本量已经对LR模型没什么影响了。个人追求变量越少越好,每次逐步回归我都只能剩下10~50个变量,不止LR,哪怕是XGBoost也是如此。
其实绝大多数情况下,模型的加权融合或者投票,都只是为了提高模型的稳定性。书里也提到了,遵守着好而不同的原则,通过MIC筛选差异化较大的优质模型进行融合,这种后融合的本质就是减少单个模型的波动引起的决策失误。
金融风控实战——风控领域涉及到的算法和风控算法工程师需要具备的能力
Grateful_Dead424 于 2022-01-28 15:27:12 发布 1414 收藏 9
一些简单的介绍
1、 银行、银行科技子公司等传统金融机构的算法部门 ,这类算法工程师面向的主要是银行业务的信贷、反欺诈等方向的建模工作;
2、 互联网金融公司 ,例如拍拍贷、马上消费、趣店等以消费贷等信贷业务为主的互联网公司,这类公司自身是有信贷相关业务的,这类算法工程师面向的常见的业务之一是小额消费类贷款;
3、 互联网科技公司 ,比较知名的例如猛犸、Datavisor以提供风控行业的解决方案——以产品或者人力或者二者兼有的方式,俗称乙方,这类公司一般没有自己的信贷业务,主要是以产品或者人力等形式为银行等大型机构提供相应的算法服务;
4、 数据商 ,比如典型的百融,同盾,当然这类公司也常常有一些针对风控的场景设计的一些产品;
可解释机器学习
- feature importance
- 逻辑回归本身的权重
- 部分依赖图
- shap
- Lime NN模型在金融风控场景中的应用
- permutation importance
- null importance
- 等等
不同的可解释性算法从不同的角度对模型进行解释,例如shap基于shap values的思想,可以实现样本粒度的解释;部份依赖图通过固定特征,在单个特征上进行随机取值从而对特征贡献度进行解释;permutation importance基于特征随机排列对预测结果的影响对特征进行解释等等
图算法与图神经网络
- pagerank
- 标签传播
- Louvain Modularity
- graph embedding系列包括deepwalk node2vec sdne等
- GNN系列例如现在常常听到的GCN,Graphsage等
- kmm
- tradaboost
- kliep
- 基于模型推断样本权重的方法
- 对抗性验证
- 子空间映射的一系列降维算法,包括典型的自编码器
- fine tuning
- 多任务学习
- tfidf
- 主题模型系列lsi、lda
- word2vec,glove、doc2vec
- lda2vec
- bert,xlnet等
自动化机器学习
- featuretools
- gplearn
- tsfresh
- 贝叶斯优化家族包括基于高斯过程、基于随机森林、基于gbdt的贝叶斯优化以及tpe(hyperot的核心)
- 前后项特征消除、rfe、boruta等
- 一些完整的大型的框架比如 automl、tpot等等
- 遗传算法系列
半监督学习
- 伪标签技术
- pu learning系列算法
- co training
- 最简单的时间窗统计;
- LSTM GRU
- 引入attention机制的RNN
不均衡学习
- 上下采样的方法,smote,adasyn,聚类采样,随机下采样;
- 集成采样,smoteboost,easysemble,cusboost等;
- 各种魔改损失函数,比如经典的二分类和多分类focal loss
传统的机器学习算法
除此之外还有一些其它的知识需要掌握,例如分箱系列的算法,包括决策树分箱、卡方分箱、自动分箱、等频分箱等,以及特征编码 woe编码,特征的过滤式指标,IV值,模型的评估指标ks auc psi等等
- 特征编码技术
- 特征交叉
- 过滤式、包裹式、嵌入式、混合式特征选择
- 缺失值处理技术包括了常值插补,极限值插补,多重插补等等
- 时间特征的展开,基于时间窗的各种统计
- 地理特征的经纬度编码
- 周期特征的cycle编码等
pu learning
pu learning,作为半监督学习的重要分支,主要解决one class的问题——即只有正类而没有反类或者说反类的数量极其稀少的情况,具体的应用场景和上面提到的半监督学习的应用场景类似,简单列举部分算法:
-
NN模型在金融风控场景中的应用
- spy;
- 伪标签技术(和半监督的伪标签类似)
- pu bagging
- bagging
- stacking
- blending
- voting
- nn的snapshot
- BP;
- sgd以及各类魔改的一阶优化算法,比如adam,rmsprop等;
- 梯度消失与梯度爆炸问题;
- bn层;
- dropout
- 三大网络架构,DNN、CNN、RNN以及经典的attention机制
大体上常见的有outliter detection和novelty detection,outlier detetion,outlier detection 分为global 和 local两种思想,global衡量全局异常性,即从全量数据上考虑样本的异常程度,例如GMM算法,isolation forest,local则衡量的是局部异常性,典型的如lof,之前做过一些简单的测试,可见:https://zhuanlan.zhihu.com/p/93779599 常见于一些缺乏标签或者是分类定义不明确且标签稀少的数据场景。
- lof
- 聚类家族
- 高斯家族
- isolation forest
- onclass svm
- 自编码器
- xgbod
- 集成异常检测
听起来思路挺简单,实现起来复杂,落地更复杂的领域。算法的原理大体上是变化不大的,主要是算法训练的过程中,包括了梯度的传输、数据的传输等都涉及到复杂的加密技术,并且需要有一定的基础设施的条件才有实现的可能,除此之外,金融数据的敏感与数据方的不信任等问题,目前要大面积推广还是存在比较多的困难。
一些流程性的工作介绍
- 项目的确定:并不是所有公司都有足够的资源去构建评分卡的,缺少数据与标签是最主要的问题,除此之外,特征字段是否丰富,内部数据的产生是否稳定等都是前期需要考虑的重要问题;
- 数据的接入,除了公司自身所拥有的一些数据例如申请人的基本申请信息,很多机构往往还会选择购买一些第三方数据商的数据,尤其是早期的一些规模不大的公司本身就没多少历史数据,非常依赖于第三方的数据,例如典型的用户的多头借贷数据,运营商信息等等
- 样本的清理: 一批新的申请人,并不是所有人都能进入评分卡模型的构建中,一般 命中黑名单规则、法院记录、反欺诈引擎或者是机构或国家规定的一些硬性规定(例如用户的年龄太大或太小)的用户后续是不会纳入建模体系中的。
- 特征的清理,关联率低,业务认为无效的特征,数据来源不稳定的特征,偏移太大的特征等等,初期都会进行一些粗筛的工作;
- 确定标签,如果公司本身内部就拥有比较充足的标签用户,这一步很快就能完成,如果缺乏,则需要考虑一些别的方法例如购买其它机构的信用评级分,或者初期考虑先人审,积累足够数据之后再建模;
- 确定观察期和表现期,常见的vintage分析和滚动率分析来确定其时间长短,当然,并不绝对,一些公司直接使用固定的时间跨度来定义观察期与表现期;
- 构建A卡,数据挖掘,特征工程,模型构建,调参,测试,oot test,模型的解释性。。。。。这一部的整个过程和竞赛类似,特征工程和模型构建之间是不断交互进行的。
- 模型构建完毕,达到上线标准,准备上线,特征工程的规则的固化,预测用的api的撰写,不同机构采用的上线方式不尽相同,目前使用的方式是平台+api,java工程师传入数据,我们提供python的api接口,在api中完成特征转换与模型预测,最后将结果输出传回,模型以pkl的形式保存和读取;
- 模型监控,检测模型预测的好坏客户的分布变化情况,模型的ks auc的变动情况,预测结果的psi反应模型的稳定性,以及各种各样的调试与修改,比如常见的特征转换的bug,模型衰减等等,如果模型的效果衰减的比较厉害就要考虑rebuild了
python的熟练使用
基本的pandas numpy 要熟练使用,算法工程师的工作过程中也会涉及到许多小型的开发工作,这个时候如何高效的写出高性能的代码就比较重要了,下面列举一些常用的方法: