智能风控:原理、算法与工程实践(txt+pdf+epub+mobi电子书下载)


发布时间:2020-05-17 08:26:06

点击下载

作者:梅子行

出版社:机械工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

智能风控:原理、算法与工程实践

智能风控:原理、算法与工程实践试读:

前言

为什么要写这本书

风控是机器学习新兴的应用场景之一,该应用场景特点非常明显:

第一,负样本占比极少,是不均衡学习(Imbalance Learning)的典型应用之一。有标签样本的稀缺,使得半监督和无监督算法在风控场景下大放异彩。

第二,业务对模型解释性要求偏高。同时业务对时效性也有一定要求,所以在实际建模中需要权衡模型复杂度与精度,并且适当优化算法内核。

第三,业务模型多样。每一个模型都和业务目标有着非常紧密的联系,因此每一个从业者都需要对业务和模型有很好的理解,从而为业务定制合适的模型。

第四,风控数据源丰富。围绕人展开的数据皆可用,而数据的多样性带来的是新兴技术的井喷,结构化数据、图像、文本等多个领域的方法都在风控领域有一定应用。

风控的子方向有很多,如信贷平台的贷款欺诈检测、社交平台的垃圾内容检测、媒体平台的流量作弊检测等。各个方向的场景大多具有相似的特点,虽然因数据源不同,实际应用中的算法选择略有差异,但整体的算法应用策略一致。在各场景中,信贷业务经过简化后相对容易理解,并且数据多元,包括结构化数据、时间序列数据、文本数据等。读者在了解基本的信贷概念后,就可以快速展开对机器学习相关内容的学习了。

笔者研读市面上智能风控相关的学习资料时发现,入门资料非常丰富,而专门介绍风控领域机器学习技术的进阶资料几乎没有,因此决心写一本构建风控领域机器学习体系的书,且希望原理与实践并重,帮助入门后的从业者进一步学习提高。本书围绕信贷风控展开,重点介绍欺诈检测的机器学习方法。读者对象

本书主要面向从事风险控制工作的广大分析师、建模师、算法工程师,也适合对传统信用评分卡有初步认识的在校学生,以及对机器学习在风控领域应用感兴趣的读者。本书特色

与市面上许多风控建模相关的图书不同,本书主要使用机器学习方法进行信用管理,而不是使用传统的统计分析手段与逻辑回归评分卡的内容。有关构建信贷评分卡的内容,本书最后的参考文献中所列的书籍已经讲解得非常透彻了,因此传统评分卡在本书中仅以对比机器学习评分卡的形式出现。对于信贷领域的基础概念,本书不作过多展开,只对本书中涉及的部分加以解释。

本书初稿的篇幅是目前的两倍以上,详细介绍了风控领域每一个场景的算法原理及业务逻辑,但经与专业人士反复探讨,笔者最终决定将与参考文献中所列图书重合度较高的内容去掉,而将笔墨集中在解决问题相关的算法及实际应用上。

本书的大部分章节都由问题、算法、案例三部分组成。期望读者通过对本书的阅读,可以更快、更好地解决实际问题,而非纸上谈兵。本书中的案例大多为业内尚未普及的前沿案例,希望能够对读者有所启发。

本书中有大量公式和代码,为提高可读性,特邀请资深设计师毛鑫宇老师为本书手绘素材及插图,希望在保证内容丰富、严谨、实用的同时,让读者感受到读书的乐趣。如何阅读这本书

本书是一本专注于介绍机器学习算法在风控领域的应用的书籍,具有很强的实践性。全书共8章,包含21种实用算法与26种解决方案。

第1~2章讲解了信贷业务的基础知识及常用的规则引擎、信用评估引擎的建模方法。

第3章围绕迁移学习展开,并以项目冷启动为背景进行介绍。迁移学习在风控领域的应用非常广泛。

第4~5章介绍了幸存者偏差与不均衡学习中所使用的无监督学习与半监督学习方法。在实际应用中,迁移学习可以为这两种场景带来很多帮助。

第6章重点讲解了无监督的异常识别算法。该方法常用于数据清洗与冷启动项目,是反欺诈引擎中常用的个体欺诈检测方法。

第7章分享了一些经笔者实践证明效果较好的模型优化方法,并对模型融合的思路进行了较为详细的介绍。

第8章重点介绍了知识图谱相关的复杂网络基础知识及网络表示学习方法,其中的社区发现算法常用于团伙欺诈检测。除团伙欺诈检测外,第8章所涉及的部分方法对信用评估模型的优化也有很大帮助。

本书更多是为读者提供一些实践经验以及深入挖掘的方向,读者可以在本书基础上进行深入研究与实践。笔者认为阅读一本书应分为两大阶段:第一阶段将书“由厚读薄”,抽象出主体知识与脉络架构,形成自己的思维体系;第二阶段将书“由薄读厚”,将抽象的思维体系与书本内容进行交叉验证,发现其中的细节,并加以引申。切勿在第一阶段结束后就自以为掌握了核心思想而不再有进取之心。希望读者在阅读本书时能多思考、多总结、勤于实践,最终实现学以致用。

本书的内容结构如下图所示。勘误与支持

写作本书时虽力求完美,但由于作者水平有限,错误和疏漏之处在所难免,在此,期望得到各领域专家和广大读者的批评指正。如果你有关于本书的建议或意见,欢迎发送邮件至yfc@hzbook.com。本书中的代码及数据文件可从华章网站www.hzbook.com获取。本书内容结构致谢

感谢机械工业出版社华章公司策划编辑杨福川老师、责任编辑罗词亮老师,以及本书的封面、插画、素材设计者毛鑫宇老师。以上各位为本书花费了大量的时间和精力,并在本书的创作过程中提出了宝贵的修改建议,特此感谢。

感谢赵越老师(知乎ID:微调),其开发维护的PyOD库为异常检测方法的实际应用提供了极大便利。感谢公众号“人工智能爱好者社区”负责人邬书豪兄、公众号“风控圈子”负责人孙耀武兄对本书的大力支持,以及梁官雪老师、周立烽老师等数十位好友在日常交流、工作中对我的指导。

感谢参与本书出版的全部工作人员的付出以及各位同事、朋友为本书带来的灵感。第1章 风控建模与规则挖掘

风险控制(Risk Control),简称风控,是互联网金融的核心,也是现阶段人工智能的主要应用场景之一。本章作为全书的第1章,首先为读者介绍信贷业务以及企业风控建模相关流程;然后对建模的每个环节和注意事项进行解读;最后通过一个实际案例,为读者介绍一种基于决策树进行自动化规则挖掘的方法。1.1 信贷与风险1.1.1 信贷业务与互联网金融风控体系

信贷业务又称信贷资产或贷款业务,是商业银行及互联网金融公司最重要的资产业务和主要赢利手段,通过放款收回本金,获得利息,赢得利润。对于有贷款需求的用户,贷款平台首先要对其未来的还款表现进行预测,然后将资金借贷给有大概率还款的用户。

互联网金融是在互联网场景下对传统信贷业务的继承与拓展。互联网金融风控体系主要由三大部分组成:

·数据信息:包括用户基本信息、用户行为信息、用户授权信息、外部接入信息。

·策略体系:包括反欺诈规则、准入规则、运营商规则、风险名单、网贷规则。

·人工智能(AI)模型:包括欺诈检测模型、准入模型、授信模型、风险定价、额度管理、流失预警、失联修复。

信贷模型体系如图1-1所示。图1-1 信贷模型体系“AI模型”这一栏中,准入模型、授信模型、额度管理、流失预警属于二分类模型,通常使用机器学习中的监督模型进行建模。本书中的大部分方法可以用于这些模型的建立。失联修复与欺诈检测模型通常需要借助贷款用户的社交关系,相关内容在第8章中进行介绍。风险定价模型涉及线性规划内容,与机器学习关系较弱,因此本书中不做过多介绍。风控系统开发每个板块所包含的内容如图1-2所示。图1-2 风控系统开发三大板块1.1.2 信贷风险与控制

在信贷领域有两类风险:

·信用风险:指借款人的还款能力和还款意愿在贷款后出现问题的风险。通常是由于不可抗力因素使用户的经济能力和思想状态发生改变导致的。

·欺诈风险:指因借款人的贷款目的不正当引发的风险。这类风险下借款人在贷款初始便没有还款计划。多见于组织架构完备的中介平台。

一般情况下,金融机构可通过风险定价策略等手段对信用风险进行防范,风险可控性较大。而如果借款人在一开始就以骗贷为目的进行借贷并且贷款成功,则会给金融机构带来损失。因为平台不仅没有盈利,还会被欺诈者骗走本金。尤其在遇上团伙欺诈时,信贷业务会在短时间内遭受非常严重的打击。金融机构面对欺诈风险几乎毫无处置能力,因此欺诈检测是信贷风险管控中最重要的一环。

而风险的管控主要依靠信贷领域的两大类系统完成:一类是信用评分系统,另一类是欺诈检测系统。大多数读者较为熟悉的信用评分系统会对借款人还款能力和还款意愿进行评估,针对的是信用风险。而欺诈检测系统则会对借款人的目的是否正当进行判断,针对的是欺诈风险。本书介绍的多数模型均服务于这两大系统。

与传统的人工信审相比,基于机器学习的人工智能风控(或大数据风控)模型最主要的优点是可以批量、迅速、准确地处理贷款申请。开发人工智能的根本目的是解放劳动力。在信贷领域中,智能风控模型解放的就是信审人员在中小额贷款上的劳动力。

很多金融机构平均一天会有几万个贷款请求,人工信审的压力是非常大的。因此,智能风控的主要作用是同时处理几十万甚至几百万个贷款请求,并且输出一个人的信用分数或者欺诈分数。1.2 工业建模流程

本节介绍工业中的完整建模流程,以免后续章节在对其细节进行优化时,部分读者会有疑惑。

首先来看一下在工业界建立一个机器学习模型的完整流程:

1)将业务抽象为分类或回归问题。

2)定义标签。

3)选取合适的样本,并匹配出全部的信息作为基础特征。

4)特征工程+模型训练+模型评价+模型调优(相互之间可能会有交互)。

5)输出模型报告。

6)上线与监控。

工业建模的整个流程如图1-3所示。图1-3 工业建模流程图1.2.1 抽象业务

在风控场景下会碰到的问题通常都可以转化为二分类问题,且通常将响应变量称为“负样本”。比如:

·信用评分模型期望用于预测一个用户是否会逾期,如逾期则该用户为负样本。

·营销模型期望用于预测一个用户被营销后是否会来贷款,如果贷款则该用户为负样本。

·失联模型期望用于预测一个用户是否会失联,如失联则该用户为负样本。

注意,在风控业务中,只有欺诈检测不是二分类问题。因为欺诈的方法多变,从数据角度来看,应该隶属于多分类任务。关于欺诈检测,在第6章和第8章中会有相关介绍。1.2.2 定义标签

在训练一个监督模型前,一定要得到样本集中每一个样本的标签。但是标签本身并不容易定义。在信贷评分模型中,通常只知道每个人的当前逾期情况,仅代表当前观察期内用户尚未还钱,事实上并没有真实的负样本标签。因此通常会选取一个截断点(阈值),当逾期超过某个阈值时,就认定该样本是一个负样本,未来也不会还钱。本书默认逾期15天为负样本的标记阈值,未特殊声明时,凡是被标记为响应变量(1)的客户均是逾期超过15天的客户。

在定义标签的过程中还有一个小技巧。通常负样本的定义较为简单,只要逾期大于15天即视为负样本。但逾期小于15天的人不会直接作为正样本,只会将按时还款和逾期较少的那一部分人标记为0。比如,现在将逾期超过15天的人作为负样本,将逾期少于5天和没有逾期的人作为正样本,至于逾期在5~15天之间的那些人,将他们从样本中去掉。

这是因为逾期15天和逾期14天的样本在本质上很接近,直接截断显然不合理。从分布的角度来讲,二分类问题假设样本服从二项分布。这里负样本与正样本的实际界限很模糊,去掉中间一部分“灰样本”,会使得样本分布更趋向于二项分布,对模型的学习更加有利。

通常建模过程将样本集划分为训练集(Train)和测试集(Test)。训练集用于模型学习,测试集用于检验模型是否拟合得当。“灰样本”通常放入测试集中,用于确保模型在训练结束后,对该部分样本也有区分能力。1.2.3 样本选取

建模过程的样本选取通常需要满足以下原则:

·代表性:样本必须能够充分代表总体。如此从样本中提炼的数理关系才能有效预测未来真实场景的数理关系。如消费金融场景客群可能和小额现金贷场景下的客群有所差异,因此不能直接使用不同客群作为样本建模。

·充分性:样本集的数量必须满足一定要求。当样本量较小时,无法满足统计的显著性(Statistical Significance)要求。评分卡建模通常要求正负样本的数量都不少于1500个。随着样本量的增加,模型的效果会显著提升。而对于神经网络等多参数模型,通常要求样本量在50万以上,否则很难保证模型的稳定性。

·时效性:在满足样本量充足的情况下,通常要求样本的观测期与实际应用时间节点越接近越好。如银行等客群稳定的场景,观察期可长达一年半至两年。然而在许多平台,很难保证样本都处在稳定的较近期的时间点上。此时可以通过迁移学习(Transfer Learning)等方法对样本进行挑选或对变量进行映射,使得早期样本与近期样本有相似的数据分布。

·排除性(Exclusion):虽然建模样本需要具有代表整体的能力,但某些法律规定不满足特定场景贷款需求的用户不应作为样本,如对行为评分卡用户、无还款表现或欺诈用户均不应放入当前样本集。

虽然评分卡建模通常要求正负样本的数量都不少于1500个,但样本量也并非越大越好。当总样本量超过50 000个时,许多模型的效果不再随着样本量的增加而有显著提升,而且数据处理与模型训练过程通常较为耗时。如果样本量过大,会为训练过程增加不必要的负担,因而样本量较大时,需要对样本做欠采样(Subsampling)处理。

由于负样本通常较少,因此通常只针对正样本进行欠采样。常见的欠采样方法分为:

·随机欠采样:直接将正样本欠采样至预期比例。

·分层抽样:保证抽样后,开发样本、验证样本与时间外样本中的正负样本比例相同。

·等比例抽样:将正样本欠采样至正负样本比例相等,即正样本量与负样本量之比为1:1。

需要注意的是,采样后需要为正样本添加权重。如正样本采样为原来的1/4,则为采样后的正样本增加权重为4,负样本权重保持为1。因为在后续计算模型检验指标及预期坏账时,需要将权重带入计算逻辑,才可以还原真实情况下的指标估计值,否则预期结果与实际部署后的结果会有明显偏差。而当负样本较少的时候,需要进行代价敏感加权或过采样(Oversampling)处理。实际应用中需要经过严格的数据清洗来保证效果稳定,这一内容将在第5章详细介绍。

在金融领域有一个概念叫时间窗口,一个用户的时间窗口分为观察期和表现期。

·观察期是指用户申请信贷产品前的时间段。在该时间段内进行特征的生成。

·表现期是定义好坏标签的时间窗口,如果在该时间窗口内触发坏定义,就是坏样本,反之就是好样本。

如设定用户在到期3个月内未还款,即认为用户为负样本,则称表现期为3个月。如在用户贷款前12个月的数据切片中抽取用户的历史行为表现作为变量,用于后续建模,则称观察期为12个月。样本时间窗口如图1-4所示。图1-4 样本时间窗口

选择样本时,应保证观察期足够长,从而保证有充分的数据用于特征生成。此外还需要注意样本的表现期能否充分暴露风险,即用户自逾期开始是否已有15天(本书定义的表现期)的贷后表现。观察期足够长有利于用户画像的建立与数据挖掘,而表现期足够长有利于风险暴露。由于观察期与表现期此消彼长,因此在实际建模中,要根据现有数据的情况设立合适的观察期与表现期。

在时间窗口确定之后,数据集也会固定下来。数据集在建模前需要划分为3个子集:开发样本(Develop)、验证样本(Valuation)和时间外样本(Out of Time,OOT)。其中开发样本与验证样本使用分层抽样进行划分,以保证两个数据集中的负样本占比相同。通常开发样本与验证样本的比例为6:4。而时间外样本通常使用整个建模样本中时间切片的最后一段样本。预测模型的本质是使用历史数据对未来的数据进行预测,因此在实际应用中,更关注模型对未来样本的预测能力,以及模型的跨时间稳定性。通常模型检测指标需要大量数据,以使得统计结果满足基本统计学假设,所以以每月数据的整体进行统计呈现。建模人员期望模型的预估表现,与模型上线后第一次报表呈现有最大的相似度。因此使用与其时间距离最接近的一整月数据进行评测。

在选取样本时,上一节提到,会将一些杂糅样本去除,以便于模型学习。这种思路的方法其实很多,上一节介绍的去除“灰样本”属于基于业务的样本清洗方法,此外还可以通过一些无监督算法进行筛选。第6章中会介绍如何使用异常检测方法进行样本清洗。1.2.4 特征工程与模型调优

用来解释现象发生的单一特性或者一组特性被量化之后,就被统一称为特征(或变量)。特征工程是指对特征进行处理与相互组合交叉的过程。

模型中的变量通常有两种类型,分别是连续型变量(Continuous Variable)与离散型变量(Discrete Variable)。

·连续型变量是指该变量为观察数据所得的实际数值,并没有经过群组处理。例如,客户的出生日期为1973年10月24日,以2009年12月31日为计算时点,则该客户的年龄为36岁。

·离散型变量是指质性变量或类别型变量。例如,将客户接受教育程度分为“中学及以下组”“大学组”及“研究生及以上组”。或者将变量实际数值进行分组处理,例如,将客户年龄进行分组处理:20~29岁为年龄群组一,30~39岁为年龄群组二。如果客户年龄为36岁,则归到年龄群组二。

在实际建模过程中,最重要的是数据、特征和模型。本书会深入挖掘信贷风控和欺诈检测领域特征的构造方式,包括基于业务的手动特征工程构造和通过一些算法对特征进行交叉衍生,并为每一类特征推荐最合适的算法和更好的表达。

模型优化是指通过对特征和模型进行调整,使模型表现达到当前最优的过程。通常调参对模型的提升不会有质的变化,更合适的变量与模型选择会带来更大的收益。实践中,通常会针对数据挑选接受度更高的模型,并引入通过模型自动组合特征的机制。这有助于数据信息的挖掘。而多模型的融合机制可以极大地降低模型的方差(Variance),这有助于增强模型的泛化能力。模型优化的主要内容在第7章进行介绍。

本书将尽量避免使用表现较差的网格搜索(Grid Search)等调参方法,而是从业务角度出发,介绍一种自动化调参策略。1.2.5 上线监控与评估报表

在实际场景下,一个模型做好之后,最终要被部署到线上。通常这部分主要进行的是变量的核对工作。其核心在于通过统计手段构造模型报告,继而对模型的效果进行评估,并在上线后按照月度监控相应指标。

1.模型报告

典型的模型报告如图1-5所示。

标准模型报告构建方法如下:

1)将测试样本的集合按照预估评分进行升序排列。

2)将样本等频切分(分箱后每一箱的人数相同)并分布到20箱中。

3)计算每一箱中的相应指标。

图1-5所示的每一列都表示具体每一箱样本的整体表现。

第1列表示每一箱中样本子集的KS(Kolmogorov-Smirnov)值。KS值通常用来描述模型的正负样本的区分能力,是风控领域最常用的指标。通常取得最大值的箱越靠前,表示该模型的效果越好。图1-5 模型报告模板

第2列为负样本个数。随着箱编码的增加,该列值应呈现严格递减趋势,但通常模型并不能保证严格递减。比如图1-5中,编号为8的箱(实则为第9箱)比编号为7的箱(实则为第8箱)的负样本个数要多。这种情况表明模型的排序能力出现波动。出现该现象的箱编码越靠前,说明模型的排序能力越弱。

第6列为捕获率(Capture Rate)。其计算方法为,当前箱的负样本累计个数除以样本集中负样本总数。捕获率常用于度量模型抓取负样本的能力。风控模型通常选择一个阈值对申请客群进行截断,因此期望在阈值以下的捕获率越大,模型的效果越好。

第7列为当前箱中负样本的占比。由于是等频分箱,该列所反映的排序能力与第2列的负样本个数相同。其余列是用于辅助计算上述列的辅助列,通常不需要特别关注。

模型部署后可能会遇到很多问题,初学者在这里会有很多困惑。下面来为读者讲解一些模型训练之后会遇到的问题以其解决思路。

2.常见问题及解决思路(1)模型训练效果很差

出现这种情况,通常的问题是模型特征没有做好,没有挖掘出更有价值的特征。当然也不排除数据质量很差的可能性,所以这时候应该从数据和特征两方面着手,首先重新做特征工程,然后尝试扩充数据集。(2)训练集效果好,跨时间测试效果不好

因为风控在大多数场景下使用历史数据来预测未来的数据,所以通常除了将样本集按照一定比例(如7:3或6:4)划分为训练集和测试集以外,还会预留出一部分比上述数据集更“新”的样本,也就是时间外样本集。

如果测试集和跨时间测试效果都不好,就说明这是一个很明显的过拟合问题。可以尝试减少模型的复杂度,比如减少特征的数量,做一些特征筛选;或者减少树模型的深度等。

如果在测试集上表现较好,但在时间外样本集上表现不好,此时称这种情况为模型的跨时间稳定性较差。这通常是因为特征的跨时间稳定性不够好造成的。特征的跨时间稳定性用于表示,随着时间的推移单个特征的取值分布是否有较大波动。这时候可以考虑去掉一些稳定性较差的特征。具体的稳定性衡量方法在第2章中介绍。(3)测试集和跨时间测试效果都很好,上线之后效果不好

这种情况下,仍然不能排除过拟合的嫌疑。跨时间测试效果好,可能只是预留出的这一部分时间外样本集和训练数据集比较接近所造成的假象。可以再取出一部分更“新”的数据集来训练以对模型进行调整。

还有一种可能是线上模型的特征做错了,和线下的特征逻辑不一致。这种状况需要仔细核对特征逻辑。(4)上线之后效果好,几周之后分数分布开始下滑

这种情况基本上可以认为是特征的稳定性问题,解决方案主要聚焦在特征的跨时间稳定性上。这时由于模型表现较差,通常需要进行模型重构(Rebuild),即从数据准备开始,重新建模。(5)没有明显问题,但模型每个月逐步失效

这是工业界模型普遍存在的问题,目前比较常规的解决方式是通过频繁迭代来更新模型,即模型迭代(Refit)。只要一直使用比较新的样本,就可以保证在未来的几个月模型效果让人满意。

有一些学习方式可以减少这种问题的影响,比如在线学习(online-learning)就可以解决这个问题。但某些场景下在线学习是不适用的,比如风控评分模型如果做成在线学习,贷前的审批通过率会持续波动,这对业务分析人员和策略制定人员都很不友好。在欺诈检测中可以使用在线学习。1.3 规则挖掘方案

在风控领域有两种常见的风险规避手段:规则挖掘和人工智能模型。通常规则挖掘期望使用一系列判断逻辑对客户群体进行区分,使得不同分区中客户的期望风险有显著差异。如判断用户的多头借贷数量是否超过10个,超过则认为风险较高,不予通过;否则认为用户在这一维度上风险较低,进入下一条规则。人工智能模型使用机器学习手段预测用户未来违约的风险。它相比于规则引擎更加灵活,不会根据某维度信息直接将用户拒绝,但也更加复杂。通常人工智能模型从建立到部署上线需要经历相当长的一段时间。在实际应用中,风控人员更期望使用规则挖掘法,找到有区分度的规则,从而迅速解决问题。人工智能模型则更常用于对精度要求较高的场景。

与一般的策略分析方法不同,本节要介绍的方法主要通过特征工程与决策树模型相结合,利用均方差最小化原理实现规则的自动挖掘。常见的决策树(Decision Tree)算法有ID3、C4.5、CART分类树、CART回归树等。本节使用CART回归树进行规则引擎的制作。

1.案例背景

假设某互联网公司旗下拥有多个服务板块,每个板块下都有专门的贷款产品,比如旗下外卖平台的骑手可以向平台申请“骑手贷”,旗下电商平台的商户可以申请“商品贷”,旗下电商平台的用户购买商品时可以申请“分期贷”,等等。

该公司有10个类似的场景,共用相同的规则引擎及申请评分卡,贷款人都是该公司的兼职人员。最近公司发现,“骑手贷”的逾期率明显比其他场景要高很多,整个金融板块30天逾期率为1.5%,而“骑手贷”产品的30天逾期达到了5%。

考虑到现有的风控架构趋于稳定,上线排期及开发速度都有要求,如果想解决当前遇到的问题,且尽量不使用复杂的方法,最优的解决方案一定是既简单效果又好的。

2.数据预览

本次建模用到的基础变量字典如图1-6所示。图1-6 变量释义

3.加载本次案例的包

加载本次案例包的方法如下:1. import pandas as pd2. import numpy as np3. import os4. #为画图指定路径5. os.environ["PATH"] += os.pathsep + 'C:/Program Files (x86)/Graphviz2.38/bin/'6. #读取数据7. data = pd.read_excel('./data/data_for_tree.xlsx')8. data.head()

数据预览如图1-7所示。图1-7 数据集部分预览

由上图可以看到,用户的ID是有重复的。数据集中包含了用户多个切片下的数据表现,其中,bad_ind是用户的标签,1表示逾期用户,0表示未逾期用户。接下来通过特征工程对用户的数据进行聚合,得到将每个人用一行表示的数据。

4.特征分类

在常规的特征工程中,通常对连续型变量进行聚合处理,对离散型变量进行特征编码。离散型变量的处理方式在第2章进行系统介绍,本节只统计每个样本离散型变量的取值个数。首先将连续型变量名字存入agg_lst列表中,将离散型变量放入dstc_lst列表中。1. org_lst = ['uid', 'create_dt', 'oil_actv_dt', 'class_new', 'bad_ind'] 2. agg_lst = ['oil_amount', 'discount_amount', 'sale_amount', 'amount', 3. 'pay_amount', 'coupon_amount', 'payment_coupon_amount'] 4. dstc_lst = ['channel_code','oil_code','scene','source_app','call_source'] 5. 6. df = data[org_lst].copy() 7. df[agg_lst] = data[agg_lst].copy() 8. df[dstc_lst] = data[dstc_lst].copy() 9. 10. base = df[org_lst].copy()11. base = base.drop_duplicates(['uid'], keep='first')

5.对变量进行加工衍生

对连续统计型变量进行函数聚合。聚合的方法包括对历史特征值计数、求历史特征值大于0的个数、求和、求均值、求最大值、求最小值、求方差、求极差、求变异系数。1. gn = pd.DataFrame() 2. for i in agg_lst: 3. # 计算个数 4. tp = pd.DataFrame(df.groupby('uid').apply( 5. lambda df:len(df[i])).reset_index()) 6. tp.columns = ['uid', i + '_cnt'] 7. if gn.empty == True: 8. gn = tp 9. else:10. gn = pd.merge(gn, tp, on = 'uid', how = 'left')11. # 求历史特征值大于0的个数12. tp = pd.DataFrame(df.groupby('uid').apply(13. lambda df:np.where(df[i]>0,1,0).sum()).reset_index())14. tp.columns = ['uid',i + '_num']15. if gn.empty == True:16. gn = tp17. else:18. gn = pd.merge(gn,tp,on = 'uid',how = 'left')19. # 对历史数据求和20. tp = pd.DataFrame(df.groupby('uid').apply(21. lambda df:np.nansum(df[i])).reset_index())22. tp.columns = ['uid',i + '_tot']23. if gn.empty == True:24. gn = tp25. else:26. gn = pd.merge(gn,tp,on = 'uid',how = 'left')27. # 对历史数据求均值28. tp = pd.DataFrame(df.groupby('uid').apply(29. lambda df:np.nanmean(df[i])).reset_index())30. tp.columns = ['uid',i + '_avg']31. if gn.empty == True:32. gn = tp33. else:34. gn = pd.merge(gn,tp,on = 'uid',how = 'left')35. # 对历史数据求最大值36. tp = pd.DataFrame(df.groupby('uid').apply(37. lambda df:np.nanmax(df[i])).reset_index())38. tp.columns = ['uid',i + '_max']39. if gn.empty == True:40. gn = tp41. else:42. gn = pd.merge(gn,tp,on = 'uid',how = 'left')43. # 对历史数据求最小值44. tp = pd.DataFrame(df.groupby('uid').apply(45. lambda df:np.nanmin(df[i])).reset_index())46. tp.columns = ['uid',i + '_min']47. if gn.empty == True:48. gn = tp49. else:50. gn = pd.merge(gn,tp,on = 'uid',how = 'left')51. # 对历史数据求方差52. tp = pd.DataFrame(df.groupby('uid').apply(53. lambda df:np.nanvar(df[i])).reset_index())54. tp.columns = ['uid',i + '_var']55. if gn.empty == True:56. gn = tp57. else:58. gn = pd.merge(gn,tp,on = 'uid',how = 'left')59. # 对历史数据求极差60. tp = pd.DataFrame(df.groupby('uid').apply(61. lambda df:np.nanmax(df[i])-np.nanmin(df[i])).reset_index())62. tp.columns = ['uid',i + '_ran']63. if gn.empty == True:64. gn = tp65. else:66. gn = pd.merge(gn,tp,on = 'uid',how = 'left')67. # 对历史数据求变异系数,为防止除数为0,利用0.01进行平滑68. tp = pd.DataFrame(df.groupby('uid').apply(69. lambda df: np.nanmean(df[i])/(np.nanvar(df[i]) \70. +0.01)).reset_index())71. tp.columns = ['uid',i + '_cva']72. if gn.empty == True:73. gn = tp74. else:75. gn = pd.merge(gn,tp,on = 'uid',how = 'left')

6.对离散变量的历史取值进行计数

例如计算每个骑手在多少个平台上接过单。1. gc = pd.DataFrame()2. for i in dstc_lst:3. tp = pd.DataFrame(df.groupby('uid').apply(4. lambda df: len(set(df[i]))).reset_index())5. tp.columns = ['uid',i + '_dstc']6. if gc.empty == True:7. gc = tp8. else:9. gc = pd.merge(gc,tp,on = 'uid',how = 'left')

7.合并衍生数据和基础用户信息

将两部分衍生数据和基础用户信息合并在一起,base中主要是用户的ID和逾期标签。1. fn = base.merge(gn,on='uid').merge(gc,on='uid')2. fn = pd.merge(fn,gc,on='uid')3. fn.shape

输出结果为:(11099, 74)

8.使用CART回归树进行规则挖掘

调用sklearn包中的决策树模型对衍生特征进行拟合,得到两层的CART回归树。CART树是一种二叉树,在每一层分化的时候,会遍历每一个特征的每一个取值进行二分,并计算划分后叶节点上的均方差,然后将均方差最小的特征和特征值作为当前节点的分化依据。使用CART回归树进行规则挖掘的主要原因是,在二分类任务下,决策树叶节点的输出是当前节点标签的均值,这与负样本占比(bad rate)的意义相同。授信通过群体中有更小的负样本占比,这是风控场景下的主要优化目标,因此使用CART回归树更符合当前的业务要求。

注意,参数max_depth控制树的深度为2层,考虑到逻辑上的复杂程度,在生成规则引擎时一般不适用太深的树。参数min_samples_leaf控制每一个叶节点上的样本个数,由于一个节点上的样本过少,不具有统计意义,有非常大的可能产生过拟合,故在这里设置最小值为500。参数min_samples_split控制父节点分化的最小样本个数为5000个,当节点样本数量少于5000时,则不再分化。1. from sklearn import tree2. x = fn.drop(['uid', 'oil_actv_dt', 'create_dt', 'bad_ind', 'class_new'], axis=1)3. y = fn.bad_ind.copy()4. dtree = tree.DecisionTreeRegressor( max_depth = 2,min_samples_leaf = 500,min_samples_split = 5000)5. dtree = dtree.fit(x,y)

9.输出决策树图像

输出决策树图像的代码如下:1. import pydotplus 2. from IPython.display import Image 3. from sklearn.externals.six import StringIO 4. import os 5. os.environ["PATH"] += os.pathsep \ + 'C:/Program Files (x86)/Graphviz2.38/bin/' 6. dot_data = StringIO() 7. tree.export_graphviz(dtree, out_file=dot_data, 8. feature_names=x.columns, 9. class_names=['bad_ind'],10. filled=True, rounded=True,11. special_characters=True)12. graph = pydotplus.graph_from_dot_data(dot_data.getvalue())13. Image(graph.create_png())

最终决策树的形式如图1-8所示,图中value计算的是叶节点中的正负样本标签的均值。在二分类的情况下,均值和标签为1的样本在总样本中占比是等价的,即字段value的数值和逾期率是一样的,因此可以直接在图中看到每一个叶节点的负样本占比。这也是选用CART回归树的原因之一。可以看到,样本通过两个特征被划分为3个客群。负样本占比逐渐减小,分别为0.074、0.03、0.012。

10.实现决策树的决策逻辑

通过DataFrame中的条件判断,实现决策树的决策逻辑。图1-8 决策树生成规则1. dff1 = fn.loc[(fn.amount_tot>9614.5)&(fn.coupon_amount_cnt>6)].copy()2. dff1['level'] = 'past_A'3. dff2 = fn.loc[(fn.amount_tot>9614.5)&(fn.coupon_amount_cnt<=6)].copy()4. dff2['level'] = 'past_B'5. dff3 = fn.loc[fn.amount_tot<=9614.5].copy()6. dff3['level'] = 'past_C'

通过简单的逻辑判断可以实现对客户的分群,并大大减少业务损失。如果拒绝past_C类客户,则可以使整体负样本占比下降至0.021;如果将past_B也拒绝掉,则可以使整体负样本占比下降至0.012。至于实际对past_A、past_B、past_C采取何种策略,要根据利率来做线性规划,从而实现风险定价。这些内容不是本书的重点,在这里不做过多解释。但客群的逾期率越大,通常给予其越低的额度和越高的实际利率。1.4 本章小结

本章主要介绍了风控领域的基础概念与建模流程,并通过决策树算法实现风控规则的自动挖掘。希望读者通过对本章的阅读,掌握机器学习在策略生成中的一般应用。在数据源确定的情况下,从下一章开始,正式介绍风控领域的一些典型问题,以及机器学习模型在其中的应用。第2章 集成模型评分卡

本章主要介绍如何通过极端梯度提升机(eXtreme Gradient Boosting,XGBoost)模型生成评分卡;同时会对建模过程中的特征工程和特征筛选部分进行详细解析;还会通过一些具体的案例,帮助读者理解风控领域的数据处理、特征构造和筛选思路,以及集成模型相比于传统逻辑回归评分卡的优势。由于XGBoost模型对输入没有逻辑回归模型那么敏感,因此其特征处理过程会有所简化。但XGBoost模型的参数调整远比逻辑回归模型复杂,因此本章还会介绍一种实践最优的自动化调参策略。2.1 特征工程解析

特征工程指的是通过数据处理方法,从源数据中抽取关键信息进行组合,挖掘出更加深入的信息的过程。在传统的机器学习领域,特征工程对模型的帮助非常大。多数算法最终结果的好坏很大程度上取决于特征工程的优劣。2.1.1 特征与模型

工业界的两种主流建模思路是复杂特征加简单算法和简单特征加复杂算法。整体来看这两者并没有优劣之分,但是算法越简单可解释性越强。在传统信用评分建模中,业务人员更希望得到一个解释性更强的模型,所以使用复杂的特征工程加逻辑回归算法进行建模。然而随着机器学习模型在各个领域的普及,风控领域使用的模型正在慢慢地向更复杂的模型过渡。

目前实用性较强的复杂算法的代表为卷积神经网络(Convolutional Neural Network,CNN)、循环神经网络(Recurrent Neural Network,RNN)等表征学习算法,这些算法对特征工程的要求非常低,建立一个优秀的模型不一定要有大量业务经验的支撑,也就意味着对新手更友好。美中不足的是,复杂算法对数据量和计算资源的要求更高。

现阶段风控领域部分业务仍追求一定的解释性,并且考虑到模型融合的整体复杂度,将复杂模型作为一种特征构造方法,使用复杂模型的输出作为传统评分卡的输入,最终仍使用传统逻辑回归进行训练。具体内容将在第7章中介绍。2.1.2 信用模型的特征

信用评分模型的主要目的是衡量一个用户的信用风险。因此,特征的构造也要围绕着反映用户信用等级的数据展开。特征构造进行的主要是时间维度的聚合统计及跨时间维度的特征比较。比如,计算一个用户的历史消费数据,可能会分别统计借款时间点之前的每一个月用户的消费金额,然后再计算最近一个月相比于之前几个月的均值是否有显著变化;或者计算历史6个月内,用户每个月的消费金额的增长量,从而得到5个特征,用来度量用户某一维度特征的稳定性。

通常衡量一个用户的偿还能力和还款意愿,主要会从以下几个角度出发:

·个人基本信息:个人基本信息是每个场景下都一定会有的数据,比较典型的信息有年龄、性别、家庭情况等。基本思路是年龄太小和太大都有风险,因为太小没有收入来源,太大有寿命风险。对于性别,女性通常还款意愿强。对于家庭情况,亲戚朋友少的人,逾期时较难向其施压。

·金融信息:直接反映用户偿还能力的数据,比如收入、家庭资产等。

·多头信息:多头是指用户在多家借款平台贷款的情况。当用户借款平台较多时,会被判断为有负债严重的倾向,这类人通常被认为偿还能力较差。这些可能会被作为策略使用。达到或超过某一阈值,比如15家借款平台,这样的用户是无法通过申请的。

·消费信息:典型的消费信息有电商数据、出行数据、外卖数据、点评数据等,这反映了用户在某一段时间内的消费水平。可以尝试计算用户过去一个月在每一种消费上所付出的金额,从而计算出他的购买力。还可以与用户的收入进行对比来估计用户的负债情况。消费过高或过低,或者近期有大幅度开销的情况都需要引起注意。

·历史平台表现:用户在借款平台上可能会有一些历史表现。比如,在B卡中,用户有历史还款表现,这是可以直接体现用户还款意愿的特征。可以通过计算用户历史最大、最小逾期天数,以及历史借款的金额之和来估计用户的情况。

·埋点数据:App埋点数据也是使用较多的数据之一,用于记录用户点击App上每一个按钮的具体时间和频次。据此可以做一些聚合特征,或者计算不同点击之间的时间间隔。类似的字段在欺诈检测中使用得尤为频繁。

·外部征信数据:市场上有很多种征信数据,这些数据对于衡量用户的信用风险会比较有帮助。通常征信公司不会将具体的征信分计算逻辑告诉甲方公司。这里通常直接提取征信分数作为特征,还可以将多条历史征信数据取出来计算均值方差,或者估计增降趋势。

·稳定性:除了通过一些固定的维度来看用户的近期表现外,还可将用户上述的每一种维度的变化趋势做成特征,用来衡量用户现在处于生命周期的哪个阶段。比如,电商数据中用户每个月购买总金额的方差一直比较小,就说明客户处于一个稳定的状态。如果贷款前期突然有了巨大开销,那么最近一周消费总金额除以最近一个月消费总金额所得的特征值就会显著增大,这可能会被识别为信用降低的信号。类似的特征还有很多,比如每两个月之间特征的比值,最近一个月单项特征与之前6个月单项特征的均值的比值,等等。

·数据密度:在用户的多头记录中,一个用户在一天之内在10家公司贷款和10天每天在一家公司贷款是两种完全不同的概念,按照月份粗粒度统计是不能体现这种信息的。这时候就可以考虑用数据密度来衡量用户的借贷密集程度。数据密度是一种特殊的特征构造方式。比如对多头数据进行月度聚合,可以衍生出另外几个字段:一个月内有多头数据的天数/30,一个月内申请的多头数量/一个月内有申请的天数,等等。这本质上是希望将用户的行为活动所覆盖的时间维度考虑进来。2.2 特征衍生方案

业内常用的特征衍生方案有以下两种:

·通过算法自动进行特征交叉,虽然不可以解释但是可以将特征挖掘得较为深入和透彻。可以很轻松地从基础的几百维度衍生至任意维度,比如可以通过XGBoost对特征进行离散,或者通过FM算法进行特征交叉,也可以通过神经网络进行表征学习,然后将内部的参数取出来作为模型的输入。总之,只要是升高了特征维度,再和原始特征合并一起建模,都可以看成是特征衍生。

·通过一些跨时间维度的计算逻辑对特征进行时间维度的比较,从而衍生出具有业务含义的特定字段。这种做法会具有更强的解释性,是早些年银行或者信用卡中心惯用的衍生方法之一。

举一个简单的例子,现在计算每个用户的额度使用率,记为特征ft。按照时间轴以月份为切片展开,得到申请前30天内的额度使用率ft1,申请前30~60天内的额度使用率ft2,申请前60~90天内的额度使用率ft3,…,申请前330~360天内的额度使用率ft12,于是得到一个用户的12个特征,如图2-1所示。图2-1 基础特征预览

下面根据这个时间序列来进行一些基于经验的人工特征衍生。

1)计算最近mth个月特征feature大于0的月份数。1. def Num(feature, mth):2. df = data.loc[:,feature+'1': feature+str(mth)]3. auto_value = np.where(df>0, 1, 0).sum(axis=1)4. return feature + '_num' + str(mth), auto_value

为什么要用mth和feature来代替月份和特征名呢?这是因为在工业界通常都是对高维特征进行批量处理。所有设计的函数最好有足够高的灵活性,能够支持特征和月份的灵活指定。对于函数Num来说,传入不同的feature取值,会对不同的特征进行计算;而指定不同的mth值,就会对不同的月份进行聚合。因此只需要遍历每一个feature和每一种mth的取值,就可以衍生出更深层次的特征。

2)计算最近mth个月特征feature的均值。

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载