风控业务背景
经过漫长的离线模型设计开发之旅,我们终于迎来了最终的在线部署的一环。 这也是你需要密切注意的步骤,也是一个需要规范的过程。 那么这个流程到底是什么样的呢?
本文主要介绍模型引入(在线)技术方案和在线一致性比对的注意事项。 目录
Part 1.风控模型部署框架
Part 2.统一数据源建设
Part 3.变量完整性匹配
Part 4.模型一致性匹配
Part 5. Python部署在线
Part 6. PMML部署在线
第7部分.总结
谢谢您
版权声明
参考资料
Part 1.风控模型部署框架
在《风控模型开发流程标准化》中,我们的系统介绍了模型开发流程。 但是在实际工作中,不仅仅是在这个过程中开发模型。 我们需要和上下游的同学沟通。 模型先生:根据业务需求,根据离线数据建立风控模型,负责模型的部署、监控、维护等。
战略学生:根据离线预测的模型分数,制定相应的风控战略方案,配置战略包等。
开发同学:支持基础数据源访问、问题排除、在线部署、平台建设等工作。
风控模型通常在正式上线运行后,至少持续运行半年以上。 这就要求模型的稳定性、可控性放在首位。
在实际的在线环境中,存在着数据源API接口调用失败、输入变量被错误操作覆盖、客户层发生了变化等各种干扰,这些因素导致风力发电系统(型号)发生异常这将引起决策失误,最终导致巨大的经济损失。
为了在第一时间发现在线问题,我们一般采取各种监测手段。 在线部署过程中,我们主要关注一致性监测,关注数据层,即实时数据和离线数据的字段名、格式、取值等三个匹配维度。
变量级别:匹配联机变量和脱机变量的字段名称、逻辑、可能的值等。
分数级别:模型的在线分数和离线分数值匹配。 图1 -风控模型部署框架
模型脱机放置通常涉及数据预处理,如准备数据、生成输入模态变量的宽表、输入缺少值、映射变量名称和类型转换。
加载模型:输入模型的pkl文件并将模型加载到内存中。
评分预测:整理业务逻辑流程,输入特征变量,对总量申请订单T 1进行批量预测评分。
匹配:用于检查与用于建模的呆帐销售订单的预测得分相比,模型文件版本存储错误、数据预处理与建模阶段不匹配等问题。
模型的实时部署通常采用几种利用Java、Spark等创建微服务API接口输出的方案,但这要求建模学生具有较强的工程开发能力。 或者,通过开发同学协助在线,交流成本很高。 另一方面,风力发电系统往往需要隐私,知道影响决策的因素越少的人越需要隐私。 所以,这不是个好方案。
平台工作流部署:例如蚂蚁金服的PAI平台,业务学生可以自行搭建工作流,快速实现在线部署。 这是一个比较友好的方案,可以对业务学生屏蔽很多技术细节,像积木一样构建业务工作流程。
虽然还有其他方案,如策略包SMG3自部署,但存在配置复杂的问题。
笔者倾向于推荐建立算法平台,当然这不是一件容易的事。 因此,根据公司的规模和业务需求,可以灵活选择合适的在线计划。
Part 2.统一数据源建设
在线数据=离线数据
数据治理是数据驱动的业务关键。 统一数据源意味着在线数据源是一致的。 建设统一数据源的必要性是变量一致性的前提:建模阶段的样本特征基于离线数据,在线预测基于实时数据。 数据源匹配是保证在线变量匹配的基本前提。
数据源质量监控:在线数据可能出现异常,需要长时间持续监测,比较检测异常值,发出报警。
因此,我们通常采用将实时数据快照T 1落在库中并生成离线数据的技术方案。 这包括限额、定价和支出等多个环节的数据源。
设立数据集市(Data Mart、DM ),监测数据分布(EDD )和记录数量等数据质量。
线下特征开发完成后,我们经过多次论证,确认符合变量命名规范、业务逻辑、可实时上线等要求,最后进入特征市场进行统一管理。
Part 3.变量完整性匹配
变量=数据逻辑
影响变量不匹配的主要因素分为数据源和逻辑两部分。 在前文中,首先确保数据源一致,需要故障排除的其余要素是计算逻辑。 实时变量开发:根据脱机变量结构逻辑,可以利用实时SQL引擎、Java、Spark等完成实时变量开发。 即使在线逻辑是离线错误的,也必须积极匹配在线逻辑。
变量匹配:自定义数值精度(例如小数点后3位),实时变量与脱机变量之间的匹配匹配通常要求至少95%以上的匹配。
Part 4.模型一致性匹配
模型分数=输入变量业务逻辑
在保证内模式变量一致性的前提下,在构建业务工作流的阶段仍然有可能出现问题。 特别是在需要设计变量有效性判断、多个分支(降级、分组等)、集成学习架构等复杂逻辑的情况下,细小的错误往往会引起预测结果的错误。
因此,我们需要和离线部署预测的模型分数进行比对,检查在线部署逻辑是否正确。为了能在真实环境中批量比对,我们一般会dry run(只打分,不决策)一段时间,等一致性评估达到预期标准后,才由灰度上线切换为正式上线。Part 5. Python部署上线
pkl文件是Python独有的格式,我们通常会将模型保存为该格式,实现快速读取和使用。但在模型保存中,常有一些注意事项:入模变量和顺序是否保存?
模型文件命名是否规范?
多个版本保存时是否覆盖?
附A1:PKL文件保存和载入方法
def pkl_save(model, save_file_path):
'''------------------功能:将训练完成的模型保存为pkl文件------------------:param model: sklearn机器学习包实例化后训练完毕的模型:param save_file_path: str, 保存模型文件的目标路径------------------:return None------------------'''
import pickle
if not save_file_path.endswith('.pkl'):
raise Exception('参数save_file_path后缀必须为pkl, 请检查!')
with open(save_file_path, 'wb') as f:
pickle.dump(model, f, protocol=2)
f.close()
print('模型文件已保存至{}'.format(save_file_path))
def load_pkl_model(save_file_path):
'''------------------功能:模型使用,载入pkl文件。注意此时预测时列名为['x0', 'x1', ...]------------------:param save_file_path: str, 保存模型文件的目标路径------------------:return model: sklearn机器学习包实例类型。预测时用法: model.predict_proba(df[feat_list])[:, 1]------------------'''
import os
from sklearn.externals import joblib
if not os.path.exists(save_file_path):
raise Exception('参数save_file_path指向的文件路径不存在, 请检查!')
model = joblib.load(save_file_path)
return model
Part 6. PMML部署上线
我们利用预测模型标记语言(Predictive Model Markup Language,PMML)可实现跨平台的机器学习模型部署。
PMML是一套基于XML的标准,通过 XML Schema 定义了使用的元素和属性,主要由以下核心部分组成:1. 数据字典(Data Dictionary),描述输入变量的取名、类型。
2. 数据转换(Transformation Dictionary和Local Transformations),应用在输入数据字段上生成新的派生字段。
3. 模型定义 (Model),每种模型类型有自己的定义。
4. 输出(Output),指定模型输出结果。
PMML预测过程符合数据挖掘分析流程:利用Python将离线训练得到的模型保存为PMML模型文件。
利用Java将PMML模型文件载入在线预测环境,进行预测。
附A2:PMML文件保存和载入方法
def pmml_save(model, feat_list, save_file_path):
'''------------------功能:将训练完成的模型保存为pmml文件------------------:param model: sklearn机器学习包实例化后训练完毕的模型:param feat_list: list, 最终入模的特征变量列表。若不指定feats_list, 那么写入的pmml中特征名默认取值为['x0', 'x1', ...]:param save_file_path: str, 保存模型文件的目标路径------------------:return None------------------'''
from sklearn2pmml import sklearn2pmml, PMMLPipeline
from sklearn_pandas import DataFrameMapper
if not save_file_path.endswith('.pmml'):
raise Exception('参数save_file_path后缀必须为pmml, 请检查!')
mapper = DataFrameMapper([([i], None) for i in feat_list])
pipeline = PMMLPipeline([('mapper', mapper), ("classifier", model)])
sklearn2pmml(pipeline, pmml=save_file_path)
print('模型文件已保存至{}'.format(save_file_path))
def load_pmml_model(save_file_path):
'''------------------功能:模型使用,载入pmml文件。------------------:param save_file_path: str, 保存模型文件的目标路径------------------:return model: sklearn机器学习包实例类型。预测时用法: model.predict(json_input_data)------------------'''
from pypmml import Model
if not os.path.exists(save_file_path):
raise Exception('参数save_file_path指向的文件路径不存在, 请检查!')
model = Model.fromFile(save_file_path)
return model
Part 7. 总结
本文系统梳理了模型上线部署的解决方案,主要内容在于:论述建设统一数据源的意义,以及线上线下一致性监控(数据、变量、分数维度)的框架。
将模型文件保存为pkl和pmml文件,并载入模型的相关方法。
致谢
感谢参考资料的作者带给我的启发。本文尚有理解不当之处,在此抛砖引玉。
版权声明
欢迎转载分享,请在文章中注明作者和原文链接,感谢您对知识的尊重和对本文的肯定。
⚠️著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处,侵权转载将追究相关责任。
参考资料Data Mining Groupdmg.org漫漫成长:PMML实现模型上线zhuanlan.zhihu.comAI-Predict:使用PMML部署机器学习模型zhuanlan.zhihu.com阿里重磅发布机器学习平台PAI 3.0blog.csdn.net
关于作者:
在某互联网金融公司从事风控建模、反欺诈、数据挖掘等方面工作,目前致力于将实践经验固化分享,量化成长轨迹。欢迎交流