专栏首页阿黎逸阳的代码机器学习模型部署—PMML

机器学习模型部署—PMML

之前阐述了逻辑回归孤立森林等建模方法,本文介绍如何把建好的模型保存为标准格式(PMML文件)。

那么,什么情况下需要把模型保存为PMML文件?

当模型需要跨平台部署反复调用时,可以把模型保存为PMML文件。

比如最近要上线一个反欺诈模型(用的GBDT)。

训练模型用的Python(里面有很多现成的库,构建机器学习模型较方便),生产调用用的Java(写机器学习模型非常麻烦)。

这时需要在Python中把训练好的模型保存为PMML文件,到Java中直接调用预测。

一、什么是PMML

PMML(Predictive Model Markup Language):预测模型标记语言,它用XML格式来描述生成的机器学习模型,是目前表示机器学习模型的实际标准。

若要将在Python中训练好的模型部署到生产上时,可以使用目标环境解析PMML文件的库来加载模型,并做预测。

二、Python中模型保存为PMML的标准格式

Python中把模型导出为PMML文件的一般流程如下:

  • step1:特征处理(DataFrameMapper函数)。
  • step2:训练模型(pipeline函数)。
  • step3:导出模型(sklearn2pmml函数)。

其中step1不是必须步骤。

接下来看两个具体实例。

三、实例一:把GBDT模型保存为PMML文件

1 导入数据

首先导入建模所需数据。

# coding: utf-8
import os
import pandas as pd  #导入数据处理的库
import numpy as np   #导入数据处理的

os.chdir(r'F:\微信公众号\Python\40_机器学习模型导出为PMML文件')
data = pd.read_csv('testtdmodel.csv',sep=',',encoding='gb18030')

2 取出建模所需的变量

本文选取了8个自变量,1个因变量进行建模。

columns_model = [
'1个月内借款人身份证申请借款平台数',
'3个月内关联P2P网贷平台数',
'3个月内申请人关联融资租赁平台数',
'3个月手机号关联身份证数',
'7天内关联P2P网贷平台数',
'二度风险名单个数',
'是否命中身份证风险关注名单',
'一度风险名单个数'
]
X_model = data[columns_model]
y = data['y']

X_model具体格式如下:

3 训练模型并保存为PMML文件

在实例一中没有进行特征处理(step1),直接训练模型并导出PMML文件。

from sklearn import tree
from sklearn.model_selection import train_test_split
from sklearn2pmml import PMMLPipeline, sklearn2pmml
from sklearn.ensemble import GradientBoostingClassifier

train, test, train_labels, test_labels = train_test_split(X_model, y, test_size=0.2, random_state=0)
GBDT = GradientBoostingClassifier(random_state=9,max_depth=5,min_samples_split=10)
pipeline = PMMLPipeline([
    ("classifier", GBDT)
])
pipeline.fit(train, train_labels)
sklearn2pmml(pipeline, 'GBDT1.pmml', with_repr=True, debug=True)

参数详解:

train_test_split:把模型数据按test_size的比例生成训练集和测试集。

GBDT:建模所用方法,里面的参数可自行调整。

random_state:随机种子。

max_depth:树的最大深度。

min_samples_split:限制子树继续划分的条件,如果某节点的样本数目小于此值,则不会再继续划分。

pipeline.fit:训练模型,train代表自变量,train_labels代表因变量。

sklearn2pmml:把模型保存为PMML文件。

得到部分结果如下:

四、实例二:把随机森林模型保存为PMML

本例数据和实例一相同,就不赘述了。

本例按Python中把模型导出为PMML文件的一般流程进行。

1 加载包

首先导入数据预处理和建模所需的包。

import numpy as np
import pandas as pd
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris
from sklearn.ensemble import GradientBoostingClassifier
from sklearn2pmml import sklearn2pmml, PMMLPipeline
from sklearn2pmml.decoration import ContinuousDomain
from sklearn.feature_selection import SelectKBest

# frameworks for ML
from sklearn_pandas import DataFrameMapper
from sklearn.pipeline import make_pipeline

# transformers for category variables
from sklearn.preprocessing import LabelBinarizer
from sklearn.preprocessing import MultiLabelBinarizer
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import OneHotEncoder
#from sklearn.preprocessing import Imputer
from sklearn.impute import SimpleImputer

# transformers for numerical variables
from sklearn.preprocessing import MinMaxScaler
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import Normalizer

# transformers for combined variables
from sklearn.decomposition import PCA
from sklearn.preprocessing import PolynomialFeatures

# user-defined transformers
from sklearn.preprocessing import FunctionTransformer

2 按标准流程建模并导出PMML文件

本文选取了8个自变量和一个因变量进行建模,并对其中4个变量进行数据处理。

#step1:特征工程
mapper = DataFrameMapper([
          (['1个月内借款人身份证申请借款平台数'],FunctionTransformer(np.abs)),
          (['3个月内关联P2P网贷平台数'],OneHotEncoder()),
        (['7天内关联P2P网贷平台数', '二度风险名单个数'], [MinMaxScaler(),StandardScaler()])
])

iris_pipeline = PMMLPipeline([
    ("mapper", mapper),
    ("pca", PCA(n_components=3)),
    ("selector", SelectKBest(k=2)), #返回k个最佳特征
    ("classifier", RandomForestClassifier())])
 
#step2:训练模型
iris_pipeline.fit(X_model,y)
 
#step3:导出模型到 RandomForestClassifier_Iris.pmml 文件
sklearn2pmml(iris_pipeline, "RandomForestClassifier_Iris.pmml")

参数详解:

DataFrameMapper:进行数据预处理。

np.abs:对该列进行绝对值处理。

OneHotEncoder:对该列进行one-hot编码。

MinMaxScaler:对该列进行标准化处理(min max 归一化)。

PCA:主成分分析。

RandomForestClassifier:随机森林建模。

iris_pipeline.fit:用通道中设定的方法训练模型。

sklearn2pmml:把通道中训练好的模型保存为PMML文件。

生成的PMML文件内容如下:

如果模型训练和预测用同一种语言,我认为没必要使用PMML。因为R、Python等语言都有标准的输出格式可以直接加载。

比如在Python中训练了GBDT模型,模型还没有上线,需每天手工打样验证。可以用pickle函数把模型打包,之后要使用直接加载就可以了。

如果训练环境和预测环境不一样,在生产上安装(R、Python、Spark等)不方便,可以使用PMML文件的方式,在生成环境直接读取PMML获得训练后的模型。

五、PMML的优缺点

1 优点

  • 1. 平台无关性。PMML采用标准的XML格式保存模型,可以实现跨平台部署。
  • 2. 广泛的支持性。很多常用的开源模型都可以转换成PMML文件。
  • 3. 易读性。PMML模型文件是一个基于XML的文本文件,任意文本编辑器都可以打开查阅。

2 缺点

  • 1.对数据预处理的支持有限。虽然已经支持了几乎所有的标准数据处理方式,但是对于自拓展的方法,还缺乏有效支持。
  • 2. 模型类型支持有限。缺乏对深度学习模型的支持。
  • 3. 预测会有一点偏差。因为PMML格式的通用性,会损失特殊模型的特殊优化。 比如一个样本,用sklearn的决策树模型预测为类别2,但是我们把这个决策树保存为PMML文件,并用JAVA加载后,继续预测刚才这个样本,有较小的概率出现预测的结果不为类别2。

参考文献:

https://www.jianshu.com/p/386fa2eb218a
https://blog.csdn.net/wshzd/article/details/96165636
https://blog.csdn.net/hshuihui/article/details/53260922
https://blog.csdn.net/yueguanghaidao/article/details/91892549
https://www.cnblogs.com/pinard/p/9220199.html

本文分享自微信公众号 - 阿黎逸阳的代码(gh_f3910c467dfe),作者:阿黎逸阳

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-07-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 风控建模整体流程

    在信贷领域中建立风控模型是为了找出可能会逾期的客户,根据逾期的可能性和资金的松紧程度选择是否放贷。

    阿黎逸阳
  • 逻辑回归(logistics regression)原理-让你彻底读懂逻辑回归

    记得刚工作的时候,用的第一个模型就是逻辑回归。虽然从大二(大一暑假参加系里建模培训,感谢老师!)就参加了全国大学生数学建模比赛,直到研究生一直在参加数学建模,也...

    阿黎逸阳
  • 【Python】【爬虫】最近想买电脑,用Python爬取京东评论做个参考

    最近想换电脑,又有点不确定买哪一款。所以决定爬取京东上电脑评论,做个参考,并把最终结果绘制成词云图。

    阿黎逸阳
  • 解决了一个 Python Type Hints 的问题,分享一下

    说实话 Python 循环 import 一直是个不是问题的问题,我们可以通过提取出两个模块共同的部分来规避这个问题。我也感觉代码里最好不要出现循环,如果出现,...

    砸漏
  • 当我们说数据挖掘的时候我们在说什么

    现在市面上谈论到的数据挖掘基本上都是基于统计学习的监督学习或非监督学习问题。尤其以监督学习应用面更广。

    华章科技
  • @import 属性——加载外部层叠样式表

    @import 加载外部层叠样式表。@import 规则必须放在其他除了@charset规则以外的CSS规则的前面;@import 规则不可嵌套于条件规则组...

    Html5知典
  • 基于 Serverless 的 VuePress 极简静态网站

    之前用过 Docsify + Serverless Framework 快速创建个人博客系统,虽然 docsify 也是基于 Vue,然而它是完全的运行时驱动,...

    腾讯云serverless团队
  • 你们也在用osgi吗?

    模块化的规范 在Java中现在是没有一个模块化的概念的,或者说没有一个事实上的标准。就是如何组成一个模块,然后哪些模块是给内部使用,哪些模块是给外部使用的...

    cloudskyme
  • openresty源码剖析——lua代码的执行

    上一篇文章中(https://cloud.tencent.com/developer/article/1037840)我们讨论了openresty是如何加载lu...

    magicsoar
  • 微服务中的设计模式

    说到设计模式,大家一般会想到,工厂、单例等24种基本设计模式,当然也会想到并发型模式,生产-消费者模式,线程池模式等,但是微服务中用到什么设计模式...

    只喝牛奶的杀手

扫码关注云+社区

领取腾讯云代金券