python模型如何部署上线_风控模型上线部署流程

风控业务背景

经过漫长的离线模型设计开发旅程,我们终于迎来了最终的上线部署环节。这同样是一个需要你细心的步骤,也是一个值得规范化的流程。那么这个流程到底是怎样的?

本文主要介绍模型部署(离线+在线)技术方案,以及线上线下一致性比对的注意事项。目录

Part 1. 风控模型部署框架

Part 2. 统一数据源建设

Part 3. 变量一致性比对

Part 4. 模型一致性比对

Part 5. Python部署上线

Part 6. PMML部署上线

Part 7. 总结

致谢

版权声明

参考资料

Part 1. 风控模型部署框架

在《风控模型开发流程标准化》中,我们系统介绍了模型开发流程。但是,真实工作中绝非只是按此流程开发一个模型而已,我们需要和上下游的同学沟通对接。模型同学:根据业务需求,基于离线数据构建风控模型,并负责模型部署、监控、维护等。

策略同学:根据离线预测的模型分数,制订相应的风控策略方案,配置策略包等。

开发同学:支持底层数据源接入、问题排查、上线部署、平台搭建等工作。

通常情况下,风控模型一旦正式上线运行后,将会保持运行至少半年以上。这就要求我们把模型的稳定性、可控性放在第一位。

真实线上环境存在着各种扰动,如数据源API接口调用失败、入模变量被误操作覆盖、客群变化等等,这些因素都会导致风控系统(模型)发生异常,偏移预期而失去控制。这会引起决策失误,最终导致巨大的经济损失。

为了保证第一时间发现线上问题,我们一般会采取各种监控手段。在上线部署过程中,我们主要关注一致性监控,着眼于三个维度:数据层:实时数据与离线数据的字段名、格式、取值等一致。

变量层:在线变量与离线变量的字段名、逻辑、取值等一致。

分数层:模型线上分数与线下分数取值保持一致。图 1 - 风控模型部署框架

模型离线部署通常采取以下步骤:数据准备:生成入模特征变量宽表,以及数据预处理,包括缺失值填充、变量名映射、类型转换等。

模型载入:读取模型pkl文件,载入模型至内存。

打分预测:梳理业务逻辑流程,输入特征变量,对全量申请订单T+1批量预测打分。

一致比对:与建模所用的放贷订单上的预测分数对比,用于检查模型文件版本错误保存、数据预处理未与建模阶段保持一致等问题。

模型实时部署通常采用几种方案:利用Java、Spark等创建微服务API接口输出,但这就需要建模同学有较强的工程开发能力。或者,通过开发同学协助上线,但又会产生额外的沟通成本。另一方面,风控系统常要求私密性,也就是越少的人知道所影响决策的因素。因此,这并不是一个很好的方案。

算法平台工作流部署:例如蚂蚁金服的PAI平台,可实现业务同学对workflow自助搭建,快速实现上线部署。这是相对更为友好的方案,对业务同学屏蔽很多技术细节,可实现搭积木般组建业务工作流。

其他方案,例如策略包SMG3自助部署,但同样存在配置复杂的问题。

笔者更倾向于推荐搭建算法平台,当然这不是一件容易的事情。因此,可根据自家公司规模和业务需求灵活选择合适的上线方案。

Part 2.统一数据源建设

线上数据 = 线下数据

数据治理是数据驱动业务的关键。统一数据源的含义是线上线下的数据源保持一致。建设统一数据源的必要性在于:变量一致性前提:建模阶段的样本特征是基于离线数据构造的,线上预测是根据实时数据。数据源一致是保证线上线下变量一致的基本前提。

数据源质量监控:线上数据可能会发生异常,需要一段时间的持续监控,对比检测异常值并报警。

因此,我们通常采取以下技术方案:实时数据快照T+1落库,生成离线数据。这包括额度、定价、支用等多个环节的数据源。

建立数据集市(Data Mart,DM)监控数据质量,包括数据分布(EDD)、记录条数等等。

离线特征开发完成后,我们将经过多次论证,确保符合变量命名规范、业务逻辑、可实时上线等要求,最后进入特征集市统一管理。

Part 3. 变量一致性比对

变量 = 数据 + 逻辑

影响变量不一致的主要因素可分为数据源和逻辑两部分。在前文中,我们首先保证数据源是一致的,那么剩下需要排查的因素就是计算逻辑。实时变量开发:按照离线变量构造逻辑,我们可以利用实时SQL引擎、Java、Spark等完成实时变量开发。线上逻辑应主动与线下逻辑保持一致,哪怕离线有误。

变量一致比对:自定义数值精度(例如小数点后3位),实时变量与离线变量之间的一致性比对,一般要求至少达到95%以上的一致性。

Part 4. 模型一致性比对

模型分数 = 入模变量 + 业务逻辑

在入模变量一致性保证的前提下,搭建业务workflow阶段仍然可能出现问题。尤其是当我们需要设计变量有效性判断、多个分支(降级、分群等)、集成学习架构等复杂逻辑时,细节bug往往引起预测结果错误。

因此,我们需要和离线部署预测的模型分数进行比对,检查在线部署逻辑是否正确。为了能在真实环境中批量比对,我们一般会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 Group​dmg.org漫漫成长:PMML实现模型上线​zhuanlan.zhihu.comAI-Predict:使用PMML部署机器学习模型​zhuanlan.zhihu.com阿里重磅发布机器学习平台PAI 3.0​blog.csdn.net

关于作者:

在某互联网金融公司从事风控建模、反欺诈、数据挖掘等方面工作,目前致力于将实践经验固化分享,量化成长轨迹。欢迎交流

你可能感兴趣的:(python模型如何部署上线)