机器学习——Java调用sklearn生成好的Logistic模型进行鸢尾花的预测
机器学习是python语言的长处,而Java在web开发方面更具有优势,如何通过java来调用python中训练好的模型进行在线的预测呢?在java语言中去调用python构建好的模型主要有三种方法:
1.在Java语言中,通过python的解释器执行python代码,简单来说就是在java中通过python解释器对象,传入写好的python代码,进行执行,这样的方式运行的效率非常低,而且存在很多python包无法使用的情况,只适合做简单的python代码的运行,并不推荐使用。
2.通过PMML工具,将在sklearn中训练好的模型生成一个pmml格式的文件,在该文件中,主要包含了模型的一些训练好的参数,以及输入数据的格式和名称等信息。生成了pmml文件之后,在java中导入pmml相关的包,我们就能通过pmml相关的类读取生成的pmml文件,使用其中的方法传入指定的参数就能实现模型的预测,速度快,效果不错。
3.第二种方法因为模型已经训练好了,无法改变,不能实现在线调参的功能,我们可以通过socket服务来进行python和java之间的网络通信,python提供socket服务,java端将模型的参数通过网络传给python端,python端接受到参数之后,进行模型的训练,训练完成之后,将得到的结果返回给Java端。
下面给是使用pmml方式调用的步骤:
1.在python端生成pmml模型文件,下面以logistic回归为例
x_train, x_test, y_train, y_test = train_test_split(x, y, train_size=0.85, random_state=1)model = PMMLPipeline([('LogisticModer', LogisticRegression())])model.fit(x_train, y_train)y_hat = model.predict(x_test)loss = y_hat == y_testaccuracy = np.mean(loss)print(accuracy)sklearn2pmml(model, '.\LogisticRegression.pmml', with_repr=True)
需要加载的包
from sklearn2pmml import sklearn2pmml from sklearn2pmml.pipeline import PMMLPipeline
我们使用PMMLPipeline()的管道函数,还可以在管道中加入其它的一些预处理的操作,比如归一化。sklearn2pmml()函数能够将训练好的模型生成pmml文件,下面来看生成的pmml文件是怎样的吧:
下面,我们建一个JavaWeb工程:
1 <dependency> 2 <groupId>org.jpmml</groupId> 3 <artifactId>pmml-evaluator</artifactId> 4 <version>1.4.1</version> 5 </dependency> 6 7 8 <dependency> 9 <groupId>org.jpmml</groupId> 10 <artifactId>pmml-evaluator-extension</artifactId> 11 <version>1.4.1</version> 12 </dependency> 13 <dependency>
在maven中引入相关的依赖,我们将要用到的方法进行封装,制作成一个工具类:
public static PMML getPMMLModel(InputStream inputStream) {PMML pmml = new PMML();try {pmml = org.jpmml.model.PMMLUtil.unmarshal(inputStream);} catch (SAXException e1) {e1.printStackTrace();} catch (JAXBException e2) {e2.printStackTrace();} finally {try {inputStream.close();} catch (IOException e) {e.printStackTrace();}return pmml;}}public static Evaluator loadPmmlAndgetEvaluator(MachineLearnType machineLearnType) {String modefile = getJpmmlModelPath(machineLearnType); //获取模型的pmml文件路径 InputStream inputStream = readPmmlFile(modefile); //根据文件路径返回输入流 PMML pmml = getPMMLModel(inputStream); //根据输入流返回PMML ModelEvaluatorFactory modelEvaluatorFactory = ModelEvaluatorFactory.newInstance(); //获取 ModelEvaluatorFactory Evaluator evaluator = modelEvaluatorFactory.newModelEvaluator(pmml); // 根据 PMML 模型返回 Evaluator 对象 pmml = null;return evaluator;}public static Map<String, Object> modelPrediction(Evaluator evaluator, Map<String, Object> paramData) {if (evaluator == null || paramData == null) {System.out.println("--------------传入对象 evaluator 或 dataMap 为空, 无法进行预测----------------");return null;}List<InputField> inputFields = evaluator.getInputFields(); //获取模型的输入域Map<FieldName, FieldValue> arguments = new LinkedHashMap<>();for (InputField inputField : inputFields) { //将参数通过模型对应的名称进行添加FieldName inputFieldName = inputField.getName(); //获取模型中的参数名Object paramValue = paramData.get(inputFieldName.getValue()); //获取模型参数名对应的参数值FieldValue fieldValue = inputField.prepare(paramValue); //将参数值填入模型中的参数中arguments.put(inputFieldName, fieldValue); //存放在map列表中 }Map<FieldName, ?> results = evaluator.evaluate(arguments);List<TargetField> targetFields = evaluator.getTargetFields();Map<String, Object> resultMap = new HashMap<>();for(TargetField targetField : targetFields) {FieldName targetFieldName = targetField.getName();Object targetFieldValue = results.get(targetFieldName);if (targetFieldValue instanceof Computable) {Computable computable = (Computable) targetFieldValue;resultMap.put(targetFieldName.getValue(), computable.getResult());}else {resultMap.put(targetFieldName.getValue(), targetFieldValue);}}return resultMap;}
上述的方法中,我们将生成的pmml文件读取,得到InputStream对象,调用上述的方法就行了。上面的代码中,MachineLearnType的作用就是获取pmml的路径,我们将要输入的参数放入Map中,进行预测,最后返回预测结果的Map,下面来看Service层的代码,其中MachineLearnType.LOGISTIC_REGRESSION就是根据名称获取pmml文件:
Evaluator evaluator = JPmmlModelUtil.loadPmmlAndgetEvaluator(MachineLearnType.LOGISTIC_REGRESSION); Map<String , Object> results = JPmmlModelUtil.modelPrediction(evaluator, paramMap); int result =(int)((double)results.get("y"));
下面是Controller层的代码:
/*** 使用pmml方式对输入的参数进行线性回归预测*/@PostMapping("/logispmml")public ServerResponse<String> IrisLogosPmmlPredict(@RequestParam @Valid double x1,@RequestParam @Valid double x2,@RequestParam @Valid double x3,@RequestParam @Valid double x4) {logger.info("x1: " + x1 + " x2: " + x2 + " x3:" + x3 + "x4:" + x4);Map<String, Object> paramMap = new HashMap<>();paramMap.put("x1", x1);paramMap.put("x2", x2);paramMap.put("x3", x3);paramMap.put("x4", x4);String result = logisticRegressionService.pridictlogisticpmml(paramMap);return createBySuccess(result);}
我们生成的模型是logistic回归进行鸢尾花数据集的分类,输入的是样本的四个特征,输出是类别0,1,2
int result =(int)((double)results.get("y")); String irisName = new String(); if(result == 0){irisName = "Iris-setosa"; } if(result == 1){irisName = "Iris-versicolor"; } if(result == 2){irisName = "Iris-virginica"; }return irisName; }
我们在service中将预测结果转换为对应的类别,下面使用测试工具进行测试:
我们就可以在python中将模型构建好,来进行调用啦!
转载于:https://www.cnblogs.com/baby-lily/p/10822048.html
机器学习——Java调用sklearn生成好的Logistic模型进行鸢尾花的预测相关推荐
- Java 调用Poi 生成费用报销单Excel
整个代码有点多,并没有做优化.目前只是为了功能实现.可以直接复制,创建main方法运行 默认一张A4纸,可以存放2个报销单模板. 如果只想一张A4纸,存放一个报销单.可以从分割线以下代码删除掉.其对应 ...
- java调用wkhtmltopdf生成pdf文件,美观,省事
最近项目需要导出企业风险报告,文件格式为pdf,于是搜了一大批文章都是什么Jasper Report,iText ,flying sauser ,都尝试了一遍,感觉不是我想要的效果, 需要自己调整好多 ...
- windows文本转语音 通过java 调用python 生成exe可执行文件一条龙
我已记不清 我失败过多少次 ,找过多少资料 ,但是功夫不负有心人 ,还是成功了. 所有资料和需要的语音模块的资料以放置在文章末尾, 有些是引用别人的博客的部分内容, 原文是在有道云笔记,所以没有图 . ...
- java调用c 生成so,Java在linux下调用C/C++生成的so文件
Java在linux下调用C/C++生成的so文件 1. CplusUtil.java是java web工程中的一个工具类 内容如下: CplusUtil.java package cn.undone ...
- java调用PageOffice生成word
一.在开发OA办公或与文档相关的Web系统中,难免会遇到动态生成word文档的需求,为了解决工作中遇到导出word文档的需求,前一段时间上网找了一些资料,在word导出这方面有很多工具可以使用,jac ...
- java调用qt生成的dll_在Qt中调用vs2008生成的dll以及lib的方法
[实例简介] 详细讲解了制作lib,dll的过程,以及如何在同平台进行对两种链接库的使用,并且详细说明了在跨平台的时候,如何进行操作 新建一个工程添加.cpp文件,在文件里面进行如下的代码: #pra ...
- Java 调用Poi 生成费用报销单Excel_02
基于之前的版本,现在给excel中添加条形二维码 excel 数据填充通过对象传递过来. 效果: 后续开发:将条形码的时间戳数据关联到报销单数据中. 提出的需求: 1:需要对报销单进行修改 2:前端项 ...
- java调用阿里云NLP自然语言处理模型
由于SDK调用需要收费,所以采用API调用,每天有50万次免费额度,直接复制就能用 一.开通账号服务 1.百度搜索阿里巴巴自然语言处理开放平台 2.登录后页面 3.获取AccessKey和Secret ...
- 花了一天,解决java调用matlab
鉴于labview做不了web(labview强项在于硬件仪器控制,可能也可以做web,还不会),虽然有web发布工具,但是基于远程前面板,最后效果都呈现在前面板上(涉及了跳转页面.matlab绘图等 ...
最新文章
- 插入排序,希尔排序,堆排序
- struts2的文件上传和文件下载
- rhel配置磁盘分区_rhel配置磁盘分区_centos系统三套硬盘分区方案[图文设置版]
- 互联网公司败局汇总,这些公司都是怎么死的?(上篇)
- tg2015 信息传递 (洛谷p2661)
- 少年开始学习c#编程,过路的大神请担待!
- Yershop商城系统
- React虚拟DOM的理解
- 靠模仿就能建立第二个“Google”?
- bzoj 2761 平衡树
- mysql可以授予的权限包括多选题_mysql中的权限有( )。 (5.0分)_学小易找答案
- MFC 单文档、多文档和对话框
- Java 编码规范3(编程规约-代码格式)
- python键盘上下左右控制_【322】python控制键盘鼠标:pynput
- linux 终端打开chrome,我应该输入什么命令来从终端运行Chrome?
- PS文字调整为复印字效果
- 蓝桥杯---历届真题 题解
- 猿创征文丨深度学习基于双向LSTM模型完成文本分类任务
- OCTA数据集的交叉验证划分为训练集和测试机
- kafka的Rebalance问题分析(续)
热门文章
- Asp.net 序列化应用实例(转载)
- python有趣小程序 表白-抖音最火的整蛊表白小程序如何做出来的?教你用python做出...
- python爬虫原理-爬虫原理解析
- python中return的理解-python中的return的返回与执行
- 用python绘制漂亮的图形-python如何画出漂亮的地图?
- python官网下载速度慢-python 官网慢
- python画曲线图例-Python数据可视化之Matplotlib(折线图)
- python画图代码turtle-介绍下Python里自带的一个有趣画图模块库:Turtle库
- python3.7.2下载-Python编程神器 v3.7.2 最新免费版
- python个人项目-软工作业个人项目wc.exe(python实现)