序言:
作为年后的首篇实操干货文章,番茄风控一如既往向业内小伙伴输出相关的干货文章。有实操能落地,有数据可撸码,继续将会是番茄风控提供给各位小伙伴的业内标配内容。
近期,我们花费了时间容整理了目前业内各位小伙伴关心的内容,本次文章是其中一个问题就是模型跟规则在现有的风控系统内是如何规范上线的,基于此,我们给大家带来了这样的一篇内容。本次文章内容翔实,章节就有四大部分,内容绝对干货满满,实操性十足。老规矩,文章中提及的更详情(数据集+代码内容)可以直接到知识课堂中下载学习。
本文有理论,有方法,有实操,还有数据集跟代码。此外在知识星球中更会手把手讲解具体的实操内容,包括数据展示(excel)、数据案例跟代码(python),基本一看就懂,一跑就会。
因为完整内容较长,本次整体的内容将分成六大部分跟大家介绍,整体目录如下:
第一部分.特征的上线计算
1.1.特征离线计算
1.2.特征实时计算
第二部分.模型的上线部署
2.1.模型离线部署
2.2.模型实时部署
第三部分.特征和模型的一致性校验
3.1.模型正式启用前的一致性校验
3.2.上线后的监控和校验
第四部分.实操–pmml文件转换和一致性校验
4.1.PMML文件的转换
4.2.特征和模型分的一致性校验
正文:
风控模型线下开发好后,接下来就是上线部署的流程,上线部署关系到模型的稳定性和可控性,是需要去规范化,细心做的一个环节。本文主要介绍的就是模型和特征常见的上线方式,以及上线后如果做数据校验,如何监控等问题。在介绍各种方法时,我们会分适用的场景,部署的步骤和细节,以及方法的优缺点等进行阐述。
Part 1.特征的上线计算
模型上线分为特征计算和模型部署两部分,特征计算好才能跑模型进行预测打分,其中特征计算又分为实时计算和离线计算,模型部署分为实时部署和离线部署。特征是否要实时计算取决于是否需要实时调用收费数据源或使用当天的实时数据,若特征为实时计算,则模型必须要实时部署,若特征为离线计算,模型可根据需求选择实时还是离线部署。下面先讲一下特征的上线计算的方法:
一.特征离线计算
特征离线计算不需要用到当天的实时数据,只需要往前回溯的历史数据,例如贷中的B卡分一般用T+1的申请贷后数据,贷后的C卡一般用T+7的催收贷后行为数据。
1.用sql进行计算,即使用sql进行离线的特征开发。sql中的count,sum,case when等用法可开发一些统计类的特征(如下图所示),这种方式相当于把底层数据源清洗,创建中间表,特征开发都放在数仓里进行,建模同学在数仓里完成开发工作后,可以让管理数仓的同学设置定时跑批任务,例如每天(T+1)在凌晨跑出一批用户的特征供当天风控使用。用sql的好处在于可大批量定时自动的进行特征计算,且可保存每天的记录供后面回溯使用,但缺点在于sql这种查询语言,在开发一些复杂逻辑的特征时比较吃力,逻辑校验起来也不如python灵活,另外如果跑批量很大,会占用一定的数仓资源。
2.本地python计算,相比于sql,用python做特征开发会更加省力,可减少代码工作量,能衍生出各种计算逻辑的特征,当然缺点在于很难能像数仓那样设置定时跑批任务,且受到本地内存,CPU,python处理速度等限制,跑大批量样本时比较耗时间。所以此方法不适合线上调用数据的场景,适合根据线下不定期的需求来做特征计算。
二.特征实时计算
前面提到如果需要调用实时的数据,就必须用实时计算的方式,那对于T+1这种历史数据,其实也可以用实时计算,比如每天定时准备好特征计算需要的数据源,当天用这个数据源来做实时计算,想当于数据源是离线准备好的,特征是实时算的。
1.用java做实时计算,相当于线下用python开发的特征,再用java来实现一遍,这么做看起来很麻烦,还得重写一遍逻辑,其实是为了考虑计算的性能,面对大的数据量和特征维度,python处理数据的速度不如java,哪怕只是多个一两秒,对于线上的风控都有很大影响。这种计算方式一定要做好特征的一致性比对,包括数据源,计算逻辑,特征缺失映射逻辑,数值精度等。另外这种方式不仅增加了开发的工作量,其实也影响了后面新增特征的上线及时性,建模同学每次要加新的特征,还得先提需求,再进行开发,最后校验上线,非常影响模型上线的进度。
2.用python计算特征。对于轻量化的特征计算显然用python更合适,我们可以利用flask,django等框架在外部搭建一个python服务,在这个服务里进行特征计算,建模同学线下开发特征的代码可以直接移值到这个服务中,省去了二次开发的工作量。然后创建一个API接口,让java直接通过接口来调用计算好的特征值。这种方法不仅减少了开发资源,也可以省去计算逻辑的一致性校验,并且灵活程度更高,每次要增加新的特征,建模同学可直接在python服务里进行操作,不过此方法要求建模同学有较强的工程开发能力,或者通过开发同学协助上线。
Part2.模型的上线部署
一.模型离线部署
离线部署适用的场景有这么几个:
1.贷中环节的审批和额度管理,例如B卡用到的是用户历史信用数据,可在离线环境跑好T+1的模型分供当天审批或额度决策使用。
2.贷后环节的催收场景,例如常用的迁徙率模型,还款预测模型,这些只需要T+1,或者根据使用需求离线跑出模型分即可。
常见的离线部署方式:
1.用sql在数仓里部署,这种方式只适合逻辑回归(LR)传统评分卡,由于LR评分卡的跑分逻辑为每个特征对应评分的加总,所以可用sql来实现这种逻辑(如下图所示),利用sql里的case when…then…的语法写出特征在每个箱体对应的分数,最后加上基础分即得出模型分。
这种方式特征+模型都在数仓里进行部署,具体的步骤为:
1)对底层数据源做清洗,合并等操作,生成可供特征衍生的中间表。
2)用sql对中间表做特征开发工作,生成一张特征宽表。
3)对这张特征宽表用case when的方法得到每个特征对应的分数,最后对分数进行加总得到模型分。
4)让数仓同学根据以上逻辑配置跑批任务,例如每天定时跑出所有目标用户的模型分。
用sql来做模型部署最大的好处在于简单,不需要额外的开发能力。但这种方法只适合LR这种传统评分卡,对于机器学习模型不适用,并且在上一part也提到用sql做特征开发有局限性,一些逻辑复杂的特征sql实现起来很麻烦。
2.本地python部署,具体的步骤为:
1)数据准备,在本地对一批用户进行取数,跑特征,生成入模特征变量宽表。
2)模型载入,读取python的model或者pkl文件。
3)预测打分,对这批用户进行打分,然后交给交给业务方使用。
这种方法因为在python环境里部署,所以对任何算法都适用,且实现起来简单,跟线下开发模型步骤类似。但它的问题跟离线计算特征一样,很难做到定时跑批,并且本地内存资源有限,跑大批量用户的模型分时非常耗时间,所以一般用在线下决策场景,例如跑一批目标用户的B卡分给策略同学做提额,或者在催收场景,每周对入催用户跑分做催收等级划分,给贷后同学做参考等。
二.模型实时部署
实时部署的使用场景在实时审批阶段,例如授信和支用审批,常见的A卡,反欺诈模型都需要实时部署在线上。
常见的实时部署方式:
1.跨平台部署–PMML
线下我们开发模型是在python环境中,那怎么把模型移植到线上的生产环境,例如java环境,这时候就要用到pmml的方法。pmml是数据挖掘的一种通用规范,是使用XML格式来描述我们生成的机器学习模型,简单说就是先在python环境里将模型转成pmml格式文件,然后用java代码来加载读取这个模型做预测。具体的部署步骤为:
1)在python环境里开发好模型。
2)在自己的本地配置java环境,安装JDK,并在python里安装sklearn2pmml包
3)利用sklearn2pmml将python的model文件转成pmml文件
4)将pmml文件交给开发同学,开发同学用java来读取pmml并做预测
pmml是目前跨平台部署模型最常用的方法,无论你的模型是sklearn,R还是sparkMLlib生成的,都可以转成pmml格式,具有广泛的支持性,同时具有可读性,用文本编辑器可直接打开pmml文件查看里面的内容。不过pmml也有以下两个缺点,在使用时需要注意:
1)pmml为了实现跨平台,牺牲了很多平台独有的优化,pmml文件要比在python环境的模型文件大很多,并且pmml文件的加载速度也比python文件慢很多。尤其对于大规模的机器学习模型,lightgbm,xgboost这种,生成的pmml文件很容易达到几百MB,导致在java环境加载预测会非常慢,所以在训练模型时,很有必要限制入模特征的数量和模型复杂度来减小文件容量。
2)pmml文件和python的model文件在预测时会有一点偏差,这是由于pmml用的是64位浮点,python用的是32位浮点,会在预测概率的小数4-6位上有稍许偏差。不过这个偏差并不大,且出现的概率也比较小。如果必须要保证两者结果一致,可以在做分数转换时将概率四舍五入至4位小数,这样可接近100%一致。
2.利用flask,django等框架创建python的API接口,跟上文提到的特征实时计算一样,模型的预测在python环境里进行,然后通过API接口输出预测结果,开发同学通过这个接口用java来调用。这种部署方式就不需要跨平台了,可以让特征衍生,模型预测都在python环境里进行,不会出现pmml的精度偏差和文件加载速度的问题,在预测效率和结果一致性上都有保障。
3.风控决策平台或算法平台部署,例如蚂蚁金服的PAI机器学习平台,可通过workflow的方式自助式搭建模型,实现快速部署。并且可以跟阿里云的Dataworks实现无缝打通,建模同学可完成数据处理,特征开发,模型训练,到部署上线的一站式建模,降低了开发和业务部门的沟通成本和开发资源。另外有些公司可通过外购或自己研发一套决策平台,在决策平台上可实现LR评分卡这种简单模型的部署。
以上3种部署方法我们更倾向于推荐创建API接口这种方式,它实现了线下开发和线上部署都在同一套环境中进行,相当于一整套从数据处理到模型预测的外部服务,在可扩展性,灵活性,数据校验一致性,稳定性等方面都比较好。
剩余部分Part 3与Part 4的部分,主要包括的还有特征跟模型的一致性校验问题以及实操部分,实操部分为模型特征的上线部署监控及使用csv格式的文件实现pmml文件转换等内容。
Part 3.特征和模型的一致性校验
一.模型正式启用前的一致性校验
当特征和模型部署完成后,需要做特征和模型线下结果和线上结果的一致性校验,上线前先用一批离线测试样本校验,校验没有问题后模型上线进行空跑,等空跑一段时间积累了线上样本,再用线上的样本做一次校验,校验两次都没问题模型才能正式启用。对于校验一致性的维度,我们主要关注这三个:数据层,特征层,模型层。
1)数据层:XXXX
2)特征层:XXXX
3)模型层:XXXX
二.上线后的监控和校验
线上环境会发生各种异常问题,如数据源API接口调用失败,入模变量误操作,三方数据源出问题等,为了保证及时发现线上问题,我们还需要采取一些监控手段。
XXX
Part 4.实操–pmml文件转换和一致性校验
一.PMML文件的转换
二.特征和模型分的一致性校验
XXX
关于本次文章更详细的内容,欢迎大家到知识星球中查看:
另外关于本文进一步的实操内容,更有相关的数据集提供给大家练习,详细的数据可以到星球进行下载学习:
~原创文章
…
end