R语言机器学习的模型部署及在线预测
Posted 临床预测模型
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了R语言机器学习的模型部署及在线预测相关的知识,希望对你有一定的参考价值。
内容来源:
CSDN gaoyan0335和统计之都 周震宇
https://blog.csdn.net/gaoyan0335/article/details/85685105
https://www.sohu.com/a/283965121_500658?sec=wd
1 写在前面
到目前为止,我们训练的传统机器学习模型都只能进行本地预测(本地调用test方法),那么怎么样把我们的模型部署到线上,然后做在线实时预测呢?
我们的模型实际上就是一个y = f(x)函数,x是特征数据,y是预测结果。
我们训练模型的目的就是为了得到f(x)函数的参数;
训练完成后需要对参数进行序列化存储,生成模型文件,这一步叫做模型的导出;
模型的部署即加载模型文件并在内存组装f(x)函数提供在线服务;
在线预测即转换线上数据为模型所需要的特征数据格式,然后调用在线服务,生成预测结果。
所有的机器学习包括深度学习框架训练的模型都是按照以上四个步骤进行部署和在线预测的,只是模型文件的不同。
模型部署是商业统计建模中极其重要的一部分,然而却往往被人忽视。读完本文,你将了解模型部署的基本概念与用途,学会如何在 R 语言环境中使用网络服务来部署上线一个模型,更多地,你的方法武器库中将会增添几柄利器: opencpu、fiery 及 plumber,即借助R中的网络服务这种形式来搭建一个线上的模型。
得益于 RStudio 开发的工具包 httpuv,在 R 语言中处理 http 以及 Websocket 请求变成了现实,基于此工具包二次开发的框架 opencpu, fiery 和 plumber 提供了在线模型部署的解决方案,下面我们一一介绍。
2 实战部分
我们演示的场景为垃圾邮件拦截,数据来源自 ElemStatLearn 包 spam 数据集。把问题拆解为以下四个步骤来模拟实际生产环境。
根据线下数据训练模型
从线上 mysql 数据库中获取新数据
将数据传递至部署在 web 服务器上的模型并返回预测值
使用预测值来决策
安装所需要的程序包:
使用线下数据训练模型并保存,留待正式部署模型时使用。
2.1 opencpu
opencpu包在这三者中是发布最早的,包作者在2013年9月CRAN上发布了第一版。这个包的特点是文档示例详尽(https://www.opencpu.org/api.html),并且提供了方便测试的图形化界面工具。
使用 opencpu 做模型部署遵循以下一般的开发流程:
把要上线的功能写个 R 包
编译安装 R 包
开启 opencpu 的服务器部署模型
连接该端口
STEP1
定义函数逻辑,即从数据库中提取数据并用 xgboost 或者 logistic 模型预测,编写函数getdata ,xgbpred ,linearpred 并把函数保存为PredData.r 。
此处模拟的情景是从 MySQL 数据库中提取数据,需要在本机上配置 MySQL 或者连接一个远程的 MySQL 数据库,具体的配置过程从略。
STEP 2
创建 R 包 SpamModelOpencpu 并编辑文档,下图是编译好的R包的介绍。
如果你对R包开发不熟悉,可以参考这个教程
https://blog.csdn.net/iccsu/article/details/24237885
或是谢益辉大大在统计之都上的旧文
https://cosx.org/2011/05/write-r-packages-like-a-ninja
STEP 3
在 R console里运行单机版的 opencpu 服务器。
输出:
控制台的输出告诉我们服务已经在http://localhost:5656/ocpu 启动了,接下来你可以用浏览器访问这个 url,或者在控制台中 curl 一下(我使用 windows 平台下的git bash ,CMD 中输入的命令可能会有些差异)
返回:
至此就大功告成了,恭喜你得到了一个可用的搭建在本机 web 服务器上的机器学习模型。
2.2 fiery
当我们在搭建线上服务时通常会希望请求响应的时间会尽可能快,尽管 opencpu 提供了在 R 环境中做模型部署的一个不错方案,然而与接下来要登场的这两位主角相比,它在响应时间上相形见绌。接下来我所要介绍的是 fiery。
fiery“热情似火”的使用者得以用复杂度换取服务的灵活性,可以在R代码中嵌编辑HTML代码来定制服务,因此相比于用法优雅“bling bling”发光的shiny,高度自由的fiery就像是摇曳的炽烈火苗(纯属个人解读)。闲言说罢,让我们来用fiery实现任务。
编写一个新的R脚本文件,命名为SpamM.r 。
STEP 1
STEP 2
启动服务并同时开启监听,同时加载训练好的储存在model.rds 文件中的 xgboost 模型。
STEP 3
响应 http 请求,编辑函数定义对访问路径为 hello 或 predict 的请求的操作逻辑。
1. /hello 页面:介绍页面。
2. /predict 页面:输入 id,返回预测值的页面。
STEP 4
一切就绪,启动服务。
接下来保存上面的所有编辑,并在控制台中运行该脚本。在 Windows 的 CMD 或者 Mac OS/Linux 的 Shell 中,这并没什么不妥,然而如果你是在 Windows 下使用的git bash ,就要输入winpty R SpamM.r
如果出现以下信息,说明目前一切顺利。
那么下面就试试访问先前定义的 hello 页面,并按照 hello 页面的提示编写一条按照 id 查询的 url。
2.3 plumber
plumber是要介绍的最后一个包。在我看来该包的优势有以下几点:
1. 响应速度很快。
2. 学习曲线平缓,即便你是个缺乏 http 请求与 html 语言的知识的小白,这并不妨碍你入门使用这个包,当然如果是深度使用用户,还是要对该包的运行机制有所了解的。
3. 最后一点,该包提供的用 bookdown 编辑的学习文档(https://www.rplumber.io/docs/)方便上手学习,相信很多人对一份简明的开源工具使用文档的必要性深有体会!
下面讲一下plumber的实现步骤,并不涉及过多原理。简要来说,plumber 借助 endpoint 与 filter 这两个控件搭建一个可用的 http 服务。
在使用 plumber 实现我们识别垃圾邮件的案例中,我们需要使用 endpoint 来指明路由,后面跟随这个路由对应的R环境中的函数操作。endpoint 的声明借由在脚本里函数的前面嵌入@ 来实现,比如下面这段代码我们定义了一个 get 方法,它的路由是./predict ,当你访问并向该路由发送请求时,请求中的参数 id 将会被提取出来并被传递至下面的函数。函数同样是定义了从 MySQL 中按照 id 提取数据并加载入模型。
而 filter 控件则可以用来监听请求并返回请求的信息。比如下面定义的 logger,将会在开启服务后打印出每条请求的发送时间、方法、路径、HTTP代理等信息。
至此我们便完成了一个轻便服务的代码部分,将上面这些内容保存为脚本文件service_plumber.r 。接下来在 R console 里运行。
至此,服务已在设定的端口2018启动,接下来我们便可以用浏览器访问:http://localhost:2018/predict?id=1,或者在命令行中运行curl http://localhost:2018/predict?id=1,返回编号为1的邮件的预测概率。
这是在我的电脑上开启服务后打印的两条访问记录。
2.4 响应测试
天下武功唯快不破,评价一个服务性能的重要标准就是响应时间,下面我们用microbenchmark 包来测试下三个部署好的服务的响应速度。
测试结果可能会因机器而异,下面的结果显示 opencpu 搭建的服务响应时间最久,中位时长为1.809s,而另外两个R搭建的服务的响应时长都在200毫秒左右,差异不大。
3 小结
至此你已经完成了模型部署的入门训练,恭喜!最后考虑到响应测试与上手难度,我个人向你推荐 plumber 这个包。与此同时,一个悲喜交加的消息是 R 社区中今年又发布了一个用并行化来实现的网络服务包 RestReserve:
https://github.com/dselivanov/RestReserve,其响应速度堪称秒杀 plumber,据说是后者的20倍,留待后话。
特别说明:以上内容非原创,仅作学习用
内容来源:CSDN gaoyan0335和统计之都 周震宇
https://blog.csdn.net/gaoyan0335/article/details/85685105
https://www.sohu.com/a/283965121_500658?sec=wd
以上是关于R语言机器学习的模型部署及在线预测的主要内容,如果未能解决你的问题,请参考以下文章
R语言︱机器学习模型评价指标+(转)模型出错的四大原因及如何纠错
R语言使用DALEX包的explain函数生成指定分类预测机器学习模型的解释器
R语言使用DALEX包的explain函数生成指定分类预测机器学习模型的解释器model_diagnostics函数执行模型残差诊断并可视化模型预测值与残差的关系
R语言使用caretEnsemble包的caretStack函数把多个机器学习模型融合成一个模型构建融合(集成)预测模型自定义融合模型的trainControl参数method参数评估指标参数