java使⽤python模型_PMML,JAVA调⽤Python算法模型公司⼤部分应⽤的使⽤的是JAVA开发,要想使⽤Python模型⾮常困难,⽹上搜索了下,可以先将⽣成的模型转换为PMML⽂件后即可在JAVA中直接调⽤。
PMML简介
模型预测标记语⾔(Predictive Model Markup Language)是由Dr. Robert Lee Grossman 提出的⼀种基于XML的存储模型的格式标准。这⾥的模型是指那些由数据挖掘和机器学习算法⽣成的预测模型。PMML为不同的数据分析软件或者编程语⾔,提供了⼀种轻松共享预测分析模型的⽅式。它⽀持常见的模型,⽐如逻辑回归和前馈神经⽹络等。
PMML是⼀套与平台和环境⽆关的模型表⽰语⾔,是⽬前表⽰机器学习模型的实际标准。从2001年发布的PMML1.1,到2019年最新4.4,PMML标准已经由最初的6个模型扩展到了17个模型,并且提供了挖掘模型(Mining Model)来组合多模型。作为⼀个开放的成熟标准,PMML由数据挖掘组织DMG(Data Mining Group)开发和维护,经过⼗⼏年的发展,得到了⼴泛的应⽤,有超过30家⼚商和开源项⽬(包括SAS,IBM SPSS,KNIME,RapidMiner等主流⼚商)在它们的数据挖掘分析产品中⽀持并应⽤PMML。
PMML的作⽤
⼀个机器学习的上线过程,主要包括:分析、特征⼯程、模型训练、调优、上线。其中,PMML的便捷性,主要体现在模型上线的过程中。模型上线是将训练好的模型有效地应⽤于⽣产环境的过程。⼀般⽽⾔,⽣产环境和数据分析⼈员所使⽤的环境差距巨⼤。
例如,线上DMP是基于Hadoop的,计算框架⽤的Spark + MR。线下⼈员建模主要使⽤的是R、Python 中的sklearn库 以及部分使⽤keras。如果没有PMML,因为不同的系统采⽤不同的⽅式呈现其计算,模型上线时就必须经历⼀个漫长的、容易出现错误和误呈现的翻译过程。此外,还需要对模型结构了解⾮常深⼊的⼯程⼈员。⽐如,将R中的LR迁移⾄Java中,就需要⼯程⼈员根据训练好模型的参数,裸写⼀个JAVA类。
以最简单的LR为例,就是⼀个数据表⽰权重向量,权重向量和参数向量相乘之后求⼀次激活函数。但复杂⼀点的模型,就要求对模型结构了解⾮常深⼊的⼯程⼈员,严格按照模型的计算逻辑,来编写该类。
有了PMML,就可以从应⽤程序A到B再到C轻松共享模型,并且在训练完成之后,迅速将模型上线(只需替换模型⽂件即可)。现在的实践就是,线下分析⼈员,使⽤R等训练好⼀版的模型之后,导出为PMML,在线上只需替换该PMML⽂件即可。
PMML 包含数据预处理和数据后处理(即模型预测结果的处理)和预测模型本⾝,见下图:
PMML⽂件的结构遵从了⽤于构建预测模型的常⽤步骤。
⽂头件:包含了PMML⽂档的基本信息,例如模型的版权信息,模型的描述,以及⽣成该⽂件所⽤软件的信息(⽐如软件的名字和版本)。头⽂件中也会包含该PMML⽂件的⽣成时间。
数据字典:包含了模型可能⽤到的所有字段名。并定义了字段的类型,可以是连续型(continuous)、类别型(categorical)、定序型(ordinal)。和字段值的类型,如String、Double。
数据挖掘模式:数据挖掘模式,可以看做是模型的⼀个看门⼈。所有进⼊模型的数据,必须经过数据挖掘模式。每个模型都包含且只包含⼀个数据挖掘模式,⽤于列出该模型使⽤的数据。数据挖掘模式包含针对特定模型不同的信息,相对的,数据字典中定义则是稳定的,不会随模型变化⽽变化。数据挖掘模式的主要⽬的是列出使⽤模型需要的数据。数据挖掘模式也定义了每个字段的使⽤⽤途(激活、追加、⽬标)以及针对空值、⾮法数据的策略。
数据转化:数据转化操作可以⽤于对进⼊模型之前的数据进⾏预处理。类⽐python sklearn中的DataFrameMapper,以及Spark中特征预处理相关算⼦。PMML定义了如下简单的数据转化操作:标准化、离散化、值映射、⾃定义函数、聚合
模型:包含了模型的定义和结构信息。
输出:定义了模型输出。对于⼀个分类任务来说,输出可以包括预测类及与所有可能类相关的概率。
⽬标:定义了应⽤于模型输出的后处理步骤。对于⼀个回归任务来说,此步骤⽀持将输出转变为⼈们很容易就可以理解的分数(预测结果)。
模型解释:定义了将测试数据传递⾄模型时获得的性能度量标准(与训练数据相对)。这些度量标准包括字段相关性、混淆矩阵、增益图及接收者操作特征(ROC)曲线图。
模型验证:定义了⼀个包含输⼊数据记录和预期模型输出的⽰例集。这是⾮常重要的⼀个步骤,因为在应⽤程序之间移动模型时,该模型需要通过匹配测试。这样就可以确保,在呈现相同的输⼊时,新系统可以⽣成与旧系统同样的输出。如果实际情况是这样的话,⼀个模型将被认为经过了验证,且随时可⽤于实践。
PMML的优点
平台⽆关性。PMML可以让模型部署环境脱离开发环境,实现跨平台部署,是PMML区别于其他模型部署⽅法最⼤的优点。⽐如使⽤Python建⽴的模型,导出PMML后可以部署在Java⽣产环境中。
互操作性。这就是标准协议的最⼤优势,实现了兼容PMML的预测程序可以读取其他应⽤导出的标准PMML模型。
⼴泛⽀持性。已取得30余家⼚商和开源项⽬的⽀持,通过已有的多个开源库,很多重量级流⾏的开源数据挖掘模型都可以转换成PMML。
可读性。PMML模型是⼀个基于XML的⽂本⽂件,使⽤任意的⽂本编辑器就可以打开并查看⽂件内容,⽐⼆进制序列化⽂件更安全可靠。
PMML的缺点
⽀持不了所有的数据预处理和后处理操作。虽然PMML已经⽀持了⼏乎所有的标准数据处理⽅式,但是对⽤户⼀些⾃定义操作,还缺乏有效的⽀持,很难放到PMML中。
模型类型⽀持有限。特别是缺乏对深度学习模型的⽀持,PMML下⼀版0会添加对深度模型的⽀持,⽬前Nyoka可以⽀持Keras等深度模型,但⽣成的是扩展的PMML模型。
PMML是⼀个松散的规范标准,有的⼚商⽣成的PMML有可能不太符合标准定义的Schema,并且PMML规范允许⼚商添加⾃⼰的扩展,这些都对使⽤这些模型造成了⼀定障碍。
PMML的使⽤
以LightGBM为例:
将⽣成的模型导出为txt格式
import pandas as pd
from lightgbm import LGBMClassifier
iris_df = pd.read_csv("xml/iris.csv")
d_x = iris_df.iloc[:, 0:4].values
d_y = iris_df.iloc[:, 4].values
model = LGBMClassifier(
boosting_type='gbdt', objective="multiclass", nthread=8, seed=42)
model.n_classes =3
百度站内搜索代码model.fit(d_x,d_y,feature_name=list()[0:-1])
model.booster_.save_model("")
使⽤⼯具将txt模型转化为pmml格式
java -jar converter-executable-1.2-SNAPSHOT.jar -- --pmml-output lightgbm.pmml
在JAVA代码中直接调⽤
package st;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.dmg.pmml.FieldName;
import org.dmg.pmml.PMML;
import org.jpmml.evaluator.Evaluator;
import org.jpmml.evaluator.FieldValue;
import org.jpmml.evaluator.InputField;
import org.jpmml.evaluator.ModelEvaluator;
import org.jpmml.evaluator.ModelEvaluatorFactory;
import org.jpmml.evaluator.TargetField;
public class PMMLPrediction {
public static void main(String[] args) throws Exception {
String pathxml="lightgbm.pmml";
Map map=new HashMap();
//拼装模型参数
map.put("sepal_length", 5.1);
map.put("sepal_width", 3.5);
combobox事件map.put("petal_length", 1.4);
map.put("petal_width", 0.2);
predictLrHeart(map, pathxml);
}
public static void predictLrHeart(Map irismap,String pathxml)throws Exception { PMML pmml;
// 模型导⼊
File file = new File(pathxml);
InputStream inputStream = new FileInputStream(file);
try (InputStream is = inputStream) {
pmml = del.PMMLUtil.unmarshal(is);
ModelEvaluatorFactory modelEvaluatorFactory = ModelEvaluatorFactory
.newInstance();
ModelEvaluator> modelEvaluator = modelEvaluatorFactory
.newModelEvaluator(pmml);
dialog的同义词Evaluator evaluator = (Evaluator) modelEvaluator;
List inputFields = InputFields();
// 过模型的原始特征,从画像中获取数据,作为模型输⼊
Map arguments = new LinkedHashMap<>();
for (InputField inputField : inputFields) {
FieldName inputFieldName = Name();
Object rawValue = irismap
.Value());
FieldValue inputFieldValue = inputField.prepare(rawValue);
网页设计接单网站arguments.put(inputFieldName, inputFieldValue);
}
Map results = evaluator.evaluate(arguments);
List targetFields = TargetFields();
//对于分类问题等有多个输出。
for (TargetField targetField : targetFields) {
FieldName targetFieldName = Name();
Object targetFieldValue = (targetFieldName);
python在线编辑器python3
+ " value: " + targetFieldValue);
}
}
}
}
PMML⼯具集
模型转换库,⽣成PMML⽂件
Python模型:
Nyoka,⽀持Scikit-Learn,LightGBM,XGBoost,Statsmodels和Keras。
R模型:
Spark:
模型评估库,读取PMML
Java:local可数吗
JPMML-Evaluator,纯Java的PMML预测库,开源协议是AGPL V3。
PMML4S,使⽤Scala开发,⽅便在Scala和Java中使⽤,接⼝简单好⽤,开源协议是常⽤的宽松协议Apache 2。Python:
PyPMML,Python库调⽤PMML,PyPMML是PMML4S包装的Python接⼝。Spark:
PySpark:
REST API:
AI-Serving,同时为PMML模型提供REST API和gRPC API,开源协议Apache 2。Openscoring,提供REST API,开源协议AGPL V3。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。