PMML 简介

预测模型标记语言PMML(Predictive Model Markup Language)是一套与平台和环境无关的模型表示语言,是目前表示机器学习模型的实际标准。从2001年发布的PMML1.1,到2019年最新4.4,PMML标准已经由最初的6个模型扩展到了17个模型,并且提供了挖掘模型(Mining Model)来组合多模型。

PMML 标准介绍

PMML是一套基于XML的标准,通过 XML Schema 定义了使用的元素和属性,主要由以下核心部分组成:

  • 数据字典(Data Dictionary),描述输入数据。
  • 数据转换(Transformation Dictionary和Local Transformations),应用在输入数据字段上生成新的派生字段。
  • 模型定义 (Model),每种模型类型有自己的定义。
  • 输出(Output),指定模型输出结果。

PMML预测过程符合数据挖掘分析流程:

PMML 优点

  • 平台无关性。PMML可以让模型部署环境脱离开发环境,实现跨平台部署,是PMML区别于其他模型部署方法最大的优点。比如使用Python建立的模型,导出PMML后可以部署在Java生产环境中。
  • 互操作性。这就是标准协议的最大优势,实现了兼容PMML的预测程序可以读取其他应用导出的标准PMML模型。
  • 广泛支持性。已取得30余家厂商和开源项目的支持,通过已有的多个开源库,很多重量级流行的开源数据挖掘模型都可以转换成PMML。
  • 可读性。PMML模型是一个基于XML的文本文件,使用任意的文本编辑器就可以打开并查看文件内容,比二进制序列化文件更安全可靠。

PMML开源类库

模型转换库,生成PMML:

*Python模型:*

  • Nyoka,支持Scikit-Learn,LightGBM,XGBoost,Statsmodels和Keras。nyoka-pmml/nyoka
  • JPMML系列,比如JPMML-SkLearn、JPMML-XGBoost、JPMML-LightGBM等,提供命令行程序导出模型到PMML。Java PMML API
  • sklearn2pmml ,用于将Scikit学习管道转换为PMML的Python库。这个库是JPMML-SkLearn命令行应用程序的一个瘦包装。有关支持的评估器和转换器类型的列表

*R模型:*

  • R pmml包:CRAN - Package pmml
  • r2pmml:jpmml/r2pmml
  • JPMML-R:提供命令行程序导出R模型到PMML。jpmml/jpmml-r

*Spark:*

  • Spark mllib,但是只是模型本身,不支持Pipelines,不推荐使用。
  • JPMML-SparkML,支持Spark ML pipleines。jpmml/jpmml-sparkml

使用案例

把机器学习模型转换成PMML格式进行存储和部署
方式一使用Nyoka,把Pipeline导出PMML:

from nyoka import xgboost_to_pmml
xgboost_to_pmml(pipeline, features, target, "xgb-iris.pmml")
  • Nyoka 库没有装成功,该方法没有尝试

方法二: 使用sklearn2pmml

from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
import pandas as pd
from xgboost import XGBClassifier
import sklearn2pmml
seed = 123456iris = datasets.load_iris()
target = 'Species'
features = iris.feature_names
iris_df = pd.DataFrame(iris.data, columns=features)
iris_df[target] = iris.targetX, y = iris_df[features], iris_df[target]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=seed)pipeline = Pipeline([('scaling', StandardScaler()),('xgb', XGBClassifier(n_estimators=5, seed=seed))
])pipeline.fit(X_train, y_train)
y_pred = pipeline.predict(X_test)
y_pred_proba = pipeline.predict_proba(X_test)# 2. 使用sklearn2pmml,把Pipeline导出PMML:
sklearn2pmml(pipeline,"xgb-iris.pmml")#xgboost_to_pmml(pipeline, features, target, "xgb-iris.pmml")# 3. 使用PyPMML来验证PMML预测值是否和原生Python模型一致:
from pypmml import Model
model = Model.load("xgb-iris.pmml")
model.predict(X_test)

报错:

调整:
将pipeline 环节中sklearn中的pipeline 使用sklearn2pmml 的PMMLPipeline
https://cloud.tencent.com/developer/article/1693633

from sklearn import datasets
from sklearn.model_selection import train_test_split
#from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
import pandas as pd
from xgboost import XGBClassifier
from sklearn2pmml import sklearn2pmml, PMMLPipeline
import warningsseed = 123456iris = datasets.load_iris()
target = 'Species'
features = iris.feature_names
iris_df = pd.DataFrame(iris.data, columns=features)
iris_df[target] = iris.targetX, y = iris_df[features], iris_df[target]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=seed)pipeline = PMMLPipeline([('scaling', StandardScaler()),('xgb', XGBClassifier(n_estimators=5, seed=seed))
])pipeline.fit(X_train, y_train)
y_pred = pipeline.predict(X_test)
y_pred_proba = pipeline.predict_proba(X_test)# 2. 使用sklearn2pmml,把Pipeline导出PMML:
sklearn2pmml(pipeline,"xgb-iris.pmml")#xgboost_to_pmml(pipeline, features, target, "xgb-iris.pmml")# 3. 使用PyPMML来验证PMML预测值是否和原生Python模型一致:
from pypmml import Model
model = Model.load("xgb-iris.pmml")
model.predict(X_test)

PMML 深度解析

pmml是XML 格式,PMML 文件的结构遵从了用于构建预测解决方案的常用步骤,包括:

数据词典,这是一种数据分析阶段的产品,可以识别和定义哪些输入数据字段对于解决眼前的问题是最有用的。这可以包括数值、顺序和分类字段。
挖掘架构,定义了处理缺少值和离群值的策略。这非常有用,因为通常情况,当将模型应用于实践时,所需的输入数据字段可能为空或者被误呈现。
数据转换,定义了将原始输入数据预处理至派生字段所需的计算。派生字段(有时也称为特征检测器)对输入字段进行合并或修改,以获取更多相关信息。例如,为了预测停车所需的制动压力,一个预测模型可能将室外温度和水的存在(是否在下雨?)作为原始数据。派生字段可能会将这两个字段结合起来,以探测路上是否结冰。然后结冰字段被作为模型的直接输入来预测停车所需的制动压力。
**模型定义,**定义了用于构建模型的结构和参数。PMML 涵盖了多种统计技术。例如,为了呈现一个神经网络,它定义了所有的神经层和神经元之间的连接权重。对于一个决策树来说,它定义了所有树节点及简单和复合谓语。
输出定义了预期模型输出。对于一个分类任务来说,输出可以包括预测类及与所有可能类相关的概率。
目标,定义了应用于模型输出的后处理步骤。对于一个回归任务来说,此步骤支持将输出转变为人们很容易就可以理解的分数(预测结果)。
模型解释,定义了将测试数据传递至模型时获得的性能度量标准(与训练数据相对)。这些度量标准包括字段相关性、混淆矩阵、增益图及接收者操作特征(ROC)曲线图。
**模型验证,**定义了一个包含输入数据记录和预期模型输出的示例集。这是非常重要的一个步骤,因为在应用程序之间移动模型时,该模型需要通过匹配测试。这样就可以确保,在呈现相同的输入时,新系统可以生成与旧系统同样的输出。如果实际情况是这样的话,一个模型将被认为经过了验证,且随时可用于实践。

参考

  1. 来源: 知乎 https://zhuanlan.zhihu.com/p/82451594
  2. [Python之sklearn2pmml:sklearn2pmml库函数的简介、安装、使用方法之详细攻略daiding-云社区-华为云 (huaweicloud.com)]
  3. [机器学习模型部署—PMML - 云+社区 - 腾讯云 (tencent.com)]
  4. https://blog.csdn.net/taoy86/article/details/89955901 PMML讲解及使用

将将,一只努力进步的程序媛!
日积跬步,不远千里!

机器学习模型部署PMML相关推荐

  1. 机器学习模型部署文章存档

    非常全面(基于整个机器学习生命周期的说明以及相关部署框架):https://www.jianshu.com/p/ad2bfc08b9e2 关于PMML和R模型:https://blog.csdn.ne ...

  2. 机器学习模型部署都有哪些坑?

    机器之心报道 参与:小舟 在生产环境中部署机器学习模型是一个复杂的过程,需要考虑诸多因素,也存在很多挑战.近日,来自剑桥的研究者梳理了该流程常见的问题. 近年来,机器学习在学术研究领域和实际应用领域得 ...

  3. 机器学习模型部署_9月版部署机器学习模型

    机器学习模型部署 每月版 (MONTHLY EDITION) Often, the last step of a Data Science task is deployment. Let's say ...

  4. 机器学习模型部署的三种方法

    "企业机器学习需要从数据工程和数据平台的角度看待大局[...],"贾斯汀·诺曼(Justin Norman)在今年巴塞罗那的DataWorks峰会上关于机器学习模型的部署的演讲中说 ...

  5. 剑桥大学:机器学习模型部署都有哪些坑?

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 来源:机器之心本文约2500字,建议阅读6分钟在生产环境中部署机器学 ...

  6. 移动端video隐藏进度条_机器学习模型部署--打通前后端任督二脉

    前言 没有 GPU,没有服务器?滴滴云 GPU 服务器,8GB内存/8GB显卡,优惠期内2200元包年.别急,输入AI 大师码:8754,折扣价基础上,再加9折优惠.快速链接:滴滴云 AI 特权 学历 ...

  7. 机器学习模型部署都有哪些坑?剑桥研究者梳理了99篇相关研究

    来源:机器之心本文约2500字,建议阅读6分钟在生产环境中部署机器学习模型是一个复杂的过程,需要考虑诸多因素,也存在很多挑战.近日,来自剑桥的研究者梳理了该流程常见的问题. 近年来,机器学习在学术研究 ...

  8. sam服务器是什么_使用SAM CLI将机器学习模型部署到无服务器后端

    sam服务器是什么 介绍 (Introduction) Over the last year at CMRA, we have been incorporating more machine lear ...

  9. 将机器学习模型部署为服务

    简单了解了mlflow和seldon两种方式,相关学习内容记录如下: mlflow https://github.com/mlflow/mlflow 1.训练模型: $ python examples ...

最新文章

  1. shell中$后加引号有什么用($string和$'string')
  2. vForum 2011 Beijing现场图文播报一
  3. 从今天开始用上了液晶显示器,总算对得起自己的眼睛了。感谢!
  4. HTML5学习笔记(五):CSS基础
  5. [js] 举例说明面向对象编程有什么缺点?
  6. 分享21个丰富多彩的 HTML5 小游戏
  7. Vue全家桶仿网易优选商城APP源码
  8. javscript插件汇总
  9. (转) Twisted 第四部分: 由Twisted支持的诗歌客户端
  10. 《jQuery Cookbook中文版》——1.9 根据当前上下文遍历DOM获得新的DOM元素集
  11. java版微信调小i机器人接口说明书_小i机器人微信公众平台调用api
  12. linux配置MYSQL慢查询的一些错误解决方案
  13. Atitit. null错误的设计 使用Optional来处理null
  14. 【MATLAB】(一)基本使用入门
  15. 数据库系统概念第六版课后习题答案-第一章
  16. Rwordseg包如何加载本地词典
  17. 掌上军营服务器信息,智慧军营之视频监控系统
  18. 搞死SAP系统系列 让系统无法连接数据库
  19. PyInstaller 的安装和使用(python生成exe文件)_联网安装
  20. 百度DNS/阿里DNS/114DNS/谷歌DNS/OpenDNS 对比评测

热门文章

  1. 剑指 Offer II 049. 从根节点到叶节点的路径数字之和
  2. Kubernetes 的 CI/CD 管道概述
  3. 把握云计算+引领云时代
  4. Linux 命令ps aux命令解析
  5. 邮箱的容量怎么算怎么看?免费邮箱容量多大?能办公用吗?
  6. 英文连写字体怎么练_一篇文章教孩子学会衡水英文字体,建议收藏!
  7. Android api23中删除HttpClient的相关类的解决方法
  8. 数理统计_正态分布经典例题
  9. 怎么用python编写记事本_利用Python开发实现简单的记事本
  10. 作为一名计算机学院普通的大学生如何提高兴趣敲代码?谈谈我的感受,欢迎交流