使用pmml跨平台部署机器学习模型Demo——房价预测
基于房价数据,在python中训练得到一个线性回归的模型,在JavaWeb中加载模型完成房价预测的功能。
一、 训练、保存模型
工具:PyCharm-2017、Python-39、sklearn2pmml-0.76.1。
1.训练数据house_price.csv
| No | square_feet | price |
|---|---|---|
| 1 | 150 | 6450 |
| 2 | 200 | 7450 |
| 3 | 250 | 8450 |
| 4 | 300 | 9450 |
| 5 | 350 | 11450 |
| 6 | 400 | 15450 |
| 7 | 600 | 18450 |
2.训练、保存模型
import sklearn2pmml as pmml
from sklearn2pmml import PMMLPipeline
from sklearn import linear_model as lm
import os
import pandas as pd
def save_model(data, model_path):
pipeline = PMMLPipeline([("regression", lm.LinearRegression())])
pipeline.fit(data[["square_feet"]], data["price"])
pmml.sklearn2pmml(pipeline, model_path, with_repr=True)
if __name__ == "__main__":
data = pd.read_csv("house_price.csv")
model_path = model_path = os.path.dirname(os.path.abspath(__file__)) + "/my_liner_model.pmml"
save_model(data, model_path)
print("模型保存完成。")
二、JavaWeb应用开发
工具:IntelliJ IDEA-2018、jdk-14.0.2、Tomcat-9.0.37。
创建maven项目,加入依赖项
<dependencies>
<dependency>
<groupId>org.jpmml</groupId>
<artifactId>pmml-evaluator</artifactId>
<version>1.4.15</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-core</artifactId>
<version>2.2.11</version>
</dependency>
<dependency>
<groupId>javax.xml</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.1</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.2.11</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
</dependency>
</dependencies>
项目结构为

界面——index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>使用pmml跨平台部署机器学习模型Demo</title>
</head>
<body>
<h2>使用pmml跨平台部署机器学习模型Demo——房价预测</h2>
<form name="form" method="post" action="/PredictServlet">
<label>房子英尺数(整数):</label>
<input type="text" name="feet" required>
<button type="submit">预测房价</button>
</form>
<div>
<label>预测价格为:</label>
${price}
</div>
</body>
</html>
Servlet类——PredictServlet.java
package servlet;
import service.PredictService;
import service.imp.PredictServiceImp;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/PredictServlet")
public class PredictServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PredictService predictService = new PredictServiceImp();
String feet_str = request.getParameter("feet"); //获取前端传来的值
int feet = Integer.parseInt(feet_str);
double price = predictService.getPredictedPrice(feet); //预测
//请求转发,返回结果
request.setAttribute("price", price);
request.getRequestDispatcher("/index.jsp").forward(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
Service接口——PredictService.java
package service;
public interface PredictService {
public double getPredictedPrice(int feet);
}
Service实现类——PredictServiceImp.java
package service.imp;
import org.dmg.pmml.FieldName;
import org.dmg.pmml.PMML;
import org.jpmml.evaluator.*;
import service.PredictService;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
public class PredictServiceImp implements PredictService {
public double getPredictedPrice(int feet) {
String model_path = "D:\\my_liner_model.pmml"; //pmml模型文件存放路径
Evaluator model = loadModel(model_path); //加载模型
Object r = predict(model, feet); //预测
double result = Double.parseDouble(String.format("%.2f", r)); //格式化
return result;
}
private static Evaluator loadModel(String model_path){
PMML pmml = new PMML(); //定义PMML对象
InputStream inputStream; //定义输入流
try {
inputStream = new FileInputStream(model_path); //输入流接到磁盘上的模型文件
pmml = org.jpmml.model.PMMLUtil.unmarshal(inputStream); //将输入流解析为PMML对象
}catch (Exception e){
e.printStackTrace();
}
ModelEvaluatorFactory modelEvaluatorFactory = ModelEvaluatorFactory.newInstance(); //实例化一个模型构造工厂
Evaluator evaluator = modelEvaluatorFactory.newModelEvaluator(pmml); //将PMML对象构造为Evaluator模型对象
return evaluator;
}
private static Object predict(Evaluator evaluator, int feet){
Map<String, Integer> data = new HashMap<String, Integer>(); //定义测试数据Map,存入各元自变量
data.put("square_feet", feet); //键"square_feet"为自变量的名称,应与训练数据中的自变量名称一致
List<InputField> inputFieldList = evaluator.getInputFields(); //得到模型各元自变量的属性列表
Map<FieldName, FieldValue> arguments = new LinkedHashMap<FieldName, FieldValue>();
for (InputField inputField : inputFieldList) { //遍历各元自变量的属性列表
FieldName inputFieldName = inputField.getName();
Object rawValue = data.get(inputFieldName.getValue()); //取出该元变量的值
FieldValue inputFieldValue = inputField.prepare(rawValue); //将值加入该元自变量属性中
arguments.put(inputFieldName, inputFieldValue); //变量名和变量值的对加入LinkedHashMap
}
Map<FieldName, ?> result = evaluator.evaluate(arguments); //进行预测
List<TargetField> targetFieldList = evaluator.getTargetFields(); //得到模型各元因变量的属性列表
FieldName targetFieldName = targetFieldList.get(0).getName(); //第一元因变量名称
Object targetFieldValue = result.get(targetFieldName); //由因变量名称得到值
return targetFieldValue;
}
}
三、运行测试
将python中训练得到的pmml模型文件置于D盘根目录下,将文件中的xmlns=".../PMML-4_4"修改为xmlns=".../PMML-4_3"。
启动运行,浏览器访问http://localhost/,进入页面

输入房子英尺数,点击‘预测房价’按钮,展示出预测价格


打包下载:
https://download.csdn.net/download/Albert201605/45648664
End.
使用pmml跨平台部署机器学习模型Demo——房价预测的更多相关文章
- 使用pmml实现跨平台部署机器学习模型
一.概述 对于由Python训练的机器学习模型,通常有pickle和pmml两种部署方式,pickle方式用于在python环境中的部署,pmml方式用于跨平台(如Java环境)的部署,本文叙述的 ...
- 用PMML实现python机器学习模型的跨平台上线
python信用评分卡(附代码,博主录制) https://study.163.com/course/introduction.htm?courseId=1005214003&utm_camp ...
- 第十三次作业——回归模型与房价预测&第十一次作业——sklearn中朴素贝叶斯模型及其应用&第七次作业——numpy统计分布显示
第十三次作业——回归模型与房价预测 1. 导入boston房价数据集 2. 一元线性回归模型,建立一个变量与房价之间的预测模型,并图形化显示. 3. 多元线性回归模型,建立13个变量与房价之间的预测模 ...
- 使用Flask部署机器学习模型
Introduction A lot of Machine Learning (ML) projects, amateur and professional, start with an aplomb ...
- 用PMML实现机器学习模型的跨平台上线
在机器学习用于产品的时候,我们经常会遇到跨平台的问题.比如我们用Python基于一系列的机器学习库训练了一个模型,但是有时候其他的产品和项目想把这个模型集成进去,但是这些产品很多只支持某些特定的生产环 ...
- 使用ML.NET + ASP.NET Core + Docker + Azure Container Instances部署.NET机器学习模型
本文将使用ML.NET创建机器学习分类模型,通过ASP.NET Core Web API公开它,将其打包到Docker容器中,并通过Azure Container Instances将其部署到云中. ...
- tensorflow机器学习模型的跨平台上线
在用PMML实现机器学习模型的跨平台上线中,我们讨论了使用PMML文件来实现跨平台模型上线的方法,这个方法当然也适用于tensorflow生成的模型,但是由于tensorflow模型往往较大,使用无法 ...
- Kubernetes入门(四)——如何在Kubernetes中部署一个可对外服务的Tensorflow机器学习模型
机器学习模型常用Docker部署,而如何对Docker部署的模型进行管理呢?工业界的解决方案是使用Kubernetes来管理.编排容器.Kubernetes的理论知识不是本文讨论的重点,这里不再赘述, ...
- 基于FastAPI和Docker的机器学习模型部署快速上手
针对前文所述 机器学习模型部署摘要 中docker+fastapi部署机器学习的一个完整示例 outline fastapi简单示例 基于文件内容检测的机器学习&fastapi 在docker ...
随机推荐
- Python异常代码含义对照表
Python常见的异常提示及含义对照表如下: 异常名称 描述 BaseException 所有异常的基类 SystemExit 解释器请求退出 KeyboardInterrupt 用户中断执行(通常是 ...
- 高中最后一刻&大学第一课&为人师的责任
文章不是技术文,只是分享一些感想,作为一只程序猿,不说好好敲代码,跑出来思考人生,不是合格的程序猿,罪过罪过,自我反思3秒钟,我们继续,毕竟程序猿的人生不只是Coding,也希望自己这点感想被更多刚入 ...
- 题解 CF1119H Tripe题解
题目传送门 题目大意 给出\(n,t,x,y,z\),值域\(\le 2^t\),给出\(n\)个三元组\((a_i,b_i,c_i)\),表示有\(x\)个\(a_i\),\(y\)个\(b_i\) ...
- Dapr + .NET Core实战(十四)虚拟机集群部署 mDNS + Consul
前面我们说了在单机模式下和K8S集群下的Dapr实战,这次我们来看看如何在不使用K8S的情况下,在一个传统的虚拟机集群里来部署Dapr. 1.环境准备 我们准备两台centos7虚拟机 Dapr1:1 ...
- vue.$nextTick实现原理
源码: const callbacks = [] let pending = false function flushCallbacks () { pending = false const copi ...
- 代码混淆保安全「GitHub 热点速览 v.21.43」
作者:HelloGitHub-小鱼干 虽然让代码难以阅读看似是件难以理解的事情,但是混淆后的代码起到了类似加密的作用,而且经过混淆的代码依旧能实现原代码的功能.javascript-obfuscato ...
- HttpClient.PatchAsJsonAsync - dotnet/runtime 项目贡献小记
TL;DR 迫于 PatchAsJsonAsync 方法缺失,我给 dotnet/runtime 项目贡献了相关的 API,可惜要到 .NET7 才能用上. https://github.com/do ...
- TortoiseGit使用
TortoiseGit 前言: 其实作为一名学生,还未接触过企业级开发项目,基本都是一个人在本地敲代码,对于项目管理工具使用的并不多,最常用的命令也就是git clone了,hhh: 前些日子了解了一 ...
- Scrum Meeting 最终总结
[软工小白菜]Scrum Meeting 最终总结 2020/4/28 一.会议内容 1.工作及计划 组员代号 完成的工作 明日计划 炎龙 1.整合了整个程序,生成了apk并且上传审核 无 风鹰 1. ...
- BUAA 2020 软件工程 提问回顾与个人总结
BUAA 2020 软件工程 提问回顾与个人总结 Author: 17373051 郭骏 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 提问回顾 ...