机器学习是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模型进行鸢尾花的预测相关推荐

  1. Java 调用Poi 生成费用报销单Excel

    整个代码有点多,并没有做优化.目前只是为了功能实现.可以直接复制,创建main方法运行 默认一张A4纸,可以存放2个报销单模板. 如果只想一张A4纸,存放一个报销单.可以从分割线以下代码删除掉.其对应 ...

  2. java调用wkhtmltopdf生成pdf文件,美观,省事

    最近项目需要导出企业风险报告,文件格式为pdf,于是搜了一大批文章都是什么Jasper Report,iText ,flying sauser ,都尝试了一遍,感觉不是我想要的效果, 需要自己调整好多 ...

  3. windows文本转语音 通过java 调用python 生成exe可执行文件一条龙

    我已记不清 我失败过多少次 ,找过多少资料 ,但是功夫不负有心人 ,还是成功了. 所有资料和需要的语音模块的资料以放置在文章末尾, 有些是引用别人的博客的部分内容, 原文是在有道云笔记,所以没有图 . ...

  4. java调用c 生成so,Java在linux下调用C/C++生成的so文件

    Java在linux下调用C/C++生成的so文件 1. CplusUtil.java是java web工程中的一个工具类 内容如下: CplusUtil.java package cn.undone ...

  5. java调用PageOffice生成word

    一.在开发OA办公或与文档相关的Web系统中,难免会遇到动态生成word文档的需求,为了解决工作中遇到导出word文档的需求,前一段时间上网找了一些资料,在word导出这方面有很多工具可以使用,jac ...

  6. java调用qt生成的dll_在Qt中调用vs2008生成的dll以及lib的方法

    [实例简介] 详细讲解了制作lib,dll的过程,以及如何在同平台进行对两种链接库的使用,并且详细说明了在跨平台的时候,如何进行操作 新建一个工程添加.cpp文件,在文件里面进行如下的代码: #pra ...

  7. Java 调用Poi 生成费用报销单Excel_02

    基于之前的版本,现在给excel中添加条形二维码 excel 数据填充通过对象传递过来. 效果: 后续开发:将条形码的时间戳数据关联到报销单数据中. 提出的需求: 1:需要对报销单进行修改 2:前端项 ...

  8. java调用阿里云NLP自然语言处理模型

    由于SDK调用需要收费,所以采用API调用,每天有50万次免费额度,直接复制就能用 一.开通账号服务 1.百度搜索阿里巴巴自然语言处理开放平台 2.登录后页面 3.获取AccessKey和Secret ...

  9. 花了一天,解决java调用matlab

    鉴于labview做不了web(labview强项在于硬件仪器控制,可能也可以做web,还不会),虽然有web发布工具,但是基于远程前面板,最后效果都呈现在前面板上(涉及了跳转页面.matlab绘图等 ...

最新文章

  1. 插入排序,希尔排序,堆排序
  2. struts2的文件上传和文件下载
  3. rhel配置磁盘分区_rhel配置磁盘分区_centos系统三套硬盘分区方案[图文设置版]
  4. 互联网公司败局汇总,这些公司都是怎么死的?(上篇)
  5. tg2015 信息传递 (洛谷p2661)
  6. 少年开始学习c#编程,过路的大神请担待!
  7. Yershop商城系统
  8. React虚拟DOM的理解
  9. 靠模仿就能建立第二个“Google”?
  10. bzoj 2761 平衡树
  11. mysql可以授予的权限包括多选题_mysql中的权限有( )。 (5.0分)_学小易找答案
  12. MFC 单文档、多文档和对话框
  13. Java 编码规范3(编程规约-代码格式)
  14. python键盘上下左右控制_【322】python控制键盘鼠标:pynput
  15. linux 终端打开chrome,我应该输入什么命令来从终端运行Chrome?
  16. PS文字调整为复印字效果
  17. 蓝桥杯---历届真题 题解
  18. 猿创征文丨深度学习基于双向LSTM模型完成文本分类任务
  19. OCTA数据集的交叉验证划分为训练集和测试机
  20. kafka的Rebalance问题分析(续)

热门文章

  1. Asp.net 序列化应用实例(转载)
  2. python有趣小程序 表白-抖音最火的整蛊表白小程序如何做出来的?教你用python做出...
  3. python爬虫原理-爬虫原理解析
  4. python中return的理解-python中的return的返回与执行
  5. 用python绘制漂亮的图形-python如何画出漂亮的地图?
  6. python官网下载速度慢-python 官网慢
  7. python画曲线图例-Python数据可视化之Matplotlib(折线图)
  8. python画图代码turtle-介绍下Python里自带的一个有趣画图模块库:Turtle库
  9. python3.7.2下载-Python编程神器 v3.7.2 最新免费版
  10. python个人项目-软工作业个人项目wc.exe(python实现)