java使用python模型_PMML,JAVA调用Python算法模型

java使用python模型_PMML,JAVA调用Python算法模型

2023年7月10日发(作者:)

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 pdfrom lightgbm import LGBMClassifieriris_df = _csv("xml/")d_x = iris_[:, 0:4].valuesd_y = iris_[:, 4].valuesmodel = LGBMClassifier(boosting_type='gbdt', objective="multiclass", nthread=8, seed=42)model.n_classes =(d_x,d_y,feature_name=iris_()[0:-1])r_.save_model("xml/")使⽤⼯具将txt模型转化为pmml格式java -jar --lgbm-input --pmml-output 在JAVA代码中直接调⽤package ;import ;import putStream;import tream;import p;import HashMap;import ;import ;import ame;import ;import tor;import alue;import ield;import valuator;import valuatorFactory;import Field;public class PMMLPrediction {public static void main(String[] args) throws Exception {String pathxml="";Map map=new HashMap();//拼装模型参数("sepal_length", 5.1);("sepal_width", 3.5);("petal_length", 1.4);("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 = hal(is);ModelEvaluatorFactory modelEvaluatorFactory = tance();ModelEvaluator> modelEvaluator = elEvaluator(pmml);Evaluator evaluator = (Evaluator) modelEvaluator;List inputFields = utFields();// 过模型的原始特征,从画像中获取数据,作为模型输⼊Map arguments = new LinkedHashMap<>();for (InputField inputField : inputFields) {FieldName inputFieldName = e();Object rawValue = (ue());FieldValue inputFieldValue = e(rawValue);(inputFieldName, inputFieldValue);}Map results = te(arguments);List targetFields = getFields();//对于分类问题等有多个输出。for (TargetField targetField : targetFields) {FieldName targetFieldName = e();Object targetFieldValue = (targetFieldName);n("target: " + ue()+ " value: " + targetFieldValue);}}}}PMML⼯具集模型转换库,⽣成PMML⽂件Python模型:Nyoka,⽀持Scikit-Learn,LightGBM,XGBoost,Statsmodels和Keras。R模型:Spark:模型评估库,读取PMMLJava: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。

发布者:admin,转转请注明出处:http://www.yc00.com/news/1688931987a184888.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信