预测模型标记语言(PMML) 是一种开放、标准化的语言,用于表示和存储机器学习模型。其主要目的是提供一种跨平台、跨工具的方式来分享和部署预测模型。PMML是由数据挖掘组织(DMG)开发和维护的标准,从最初的版本1.1发展到现在的4.4版本,涵盖了越来越多的模型类型和功能。
PMML 1.1(2001年发布):最初版本,支持基本的模型表示。 PMML 4.4(2019年发布):最新版本,支持17种模型类型,并提供组合多模型的挖掘模型(Mining Model)。
PMML得到了广泛的应用,超过30家厂商和开源项目在它们的数据挖掘分析产品中支持并应用PMML。这些厂商包括SAS、IBM SPSS、KNIME、RapidMiner等主流厂商。
PMML是一种基于XML的标准,通过XML Schema定义了使用的元素和属性,主要由以下核心部分组成:
PMML预测过程符合数据挖掘分析流程,确保模型在不同平台和环境中具有一致的表现。
模型转换库
模型评估库
构建模型要查看完整的Jupyter Notebook,请参考:xgb-iris-pmml.ipynb。
使用Iris数据集构建一个XGBoost模型,并在建模之前对浮点数据进行标准化,利用Scikit-learn中的Pipeline:
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
# 设置随机种子
seed = 123456
# 加载Iris数据集
iris = datasets.load_iris()
target = 'Species'
features = iris.feature_names
iris_df = pd.DataFrame(iris.data, columns=features)
iris_df[target] = iris.target
# 划分训练集和测试集
X, 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 = 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)
导出PMML使用Nyoka库将Pipeline导出为PMML格式:
from nyoka import xgboost_to_pmml
# 导出为PMML
xgboost_to_pmml(pipeline, features, target, "xgb-iris.pmml")
验证PMML使用PyPMML库验证PMML预测值是否与原生Python模型一致:
from pypmml import Model
# 加载PMML模型
model = Model.load("xgb-iris.pmml")
# 进行预测
model.predict(X_test)
使用PMML4S进行预测读取PMML并进行预测。以下代码使用PMML4S的Scala接口,您也可以使用它的Java接口。完整程序请参考:pmml4s-demo.json。
由于GitHub不支持浏览Zeppelin Notebook,可以访问以下链接进行浏览:Zeppelin Notebook。
import org.pmml4s.model.Model
// 加载PMML模型
val model = Model.fromFile("xgb-iris.pmml")
// 进行预测
val result = model.predict(Map("sepal length (cm)" -> 5.7, "sepal width (cm)" -> 4.4, "petal length (cm)" -> 1.5, "petal width (cm)" -> 0.4))
尽管PMML有很多优点,但也存在一些不足之处:
本文介绍了PMML这一跨平台的机器学习模型表示标准,包括其优缺点、常用的PMML开源库,以及如何生成和使用PMML的示例。
尽管PMML存在一些缺点,但其优点远远超过这些不足。如果您训练的模型可以导出为PMML,建议使用PMML来进行部署。如果导出的PMML不能包含整个Pipeline,可以参考文章《自动部署PMML模型生成REST API》中介绍的部署自定义实时预测Web服务的方法。