Author: 写长城的诗

基于opencpu构建R语言的RESTful API

一个R语言模型的落地应用有几种方式:可能是一个简单的分析报告,可能是将预测结果输出到数据库,即离线模型,也可能需要实时读入数据进行实时预测输出。第三种情况是最有用,也最难处理的情况。因为要把R和其它通用型语言进行整合并不容易。例如使用Rserve在java中整合R代码就需要开发人员即懂java也懂R,开发量会比较高。一种比较好的思路是将R计算部分作为一个API,其它语言时通过API来调用R的部分。

下面的例子就是一个很简单的预测iris种类。在mac系统中,基于opencpu框架完成,opencpu能将R语言的对象转为http的资源,极大的方便了R语言模型的部署。一共只需要四个步骤。

步骤1:建立模型
步骤2:模型写入R包
步骤3:将R包安装到opencpu服务器上
步骤4:通过API远程调用模型

第一步是R语言建模。
library(rpart)
m = rpart(Species~., data = iris)
save(m, file=’model.rda’)
模型保存为一个rda文件在硬盘上。

第二步是写一个R包,如今用rstudio写一个R包是非常简单的事了,建立好一个新项目test之后,在R代码中写入预测函数如下。
library(rpart)
predfunc = function(input){
  input = as.data.frame(input)
  result = predict.rpart(m,newdata = input,type=’class’)
  as.character(result)
}
可以在R里面验证一下函数是否正常。
newx = data.frame(Sepal.Length=5.1,
                  Sepal.Width=3.5,
                  Petal.Length=1.4,
                  Petal.Width=0.2)
predfunc(newx)
然后新建一个data目录,将rda文件放入目录中,build&reload去建立这个名为test的R包。

第三步是安装R包到opencpu服务器上,我事先在本机上安装了opencpu,只需要像安装普通R包一样安装即可。
install.packages(opencpu)
这样在第二步reload时就直接安装好了test的R包。

第四步是实验API调用是否成功。在终端里进R,调用opencpu,即library(opencpu)会自动启动服务,并显示
[httpuv] http://localhost:4678/ocpu
OpenCPU single-user server ready.

调用模型时,用curl实验即可。另开一个终端,输入
curl http://localhost:4678/ocpu/library/test/R/predfunc/json -H “Content-Type: application/json” -d ‘{“input” :[ {“Sepal.Length”:1.1, “Sepal.Width” : 2.5, “Petal.Length”:0.4, “Petal.Width”:0.9}]}’

成功返回
[
    “setosa”
]

如果需要把这个模型提供给远程调用,需要安装服务器版本的opencpu。具体参见https://www.opencpu.org/posts/scoring-engine/

基于opencpu构建R语言的RESTful API

一个R语言模型的落地应用有几种方式:可能是一个简单的分析报告,可能是将预测结果输出到数据库,即离线模型,也可能需要实时读入数据进行实时预测输出。第三种情况是最有用,也最难处理的情况。因为要把R和其它通用型语言进行整合并不容易。例如使用Rserve在java中整合R代码就需要开发人员即懂java也懂R,开发量会比较高。一种比较好的思路是将R计算部分作为一个API,其它语言时通过API来调用R的部分。

下面的例子就是一个很简单的预测iris种类。在mac系统中,基于opencpu框架完成,opencpu能将R语言的对象转为http的资源,极大的方便了R语言模型的部署。一共只需要四个步骤。

步骤1:建立模型
步骤2:模型写入R包
步骤3:将R包安装到opencpu服务器上
步骤4:通过API远程调用模型

第一步是R语言建模。
library(rpart)
m = rpart(Species~., data = iris)
save(m, file=’model.rda’)
模型保存为一个rda文件在硬盘上。

第二步是写一个R包,如今用rstudio写一个R包是非常简单的事了,建立好一个新项目test之后,在R代码中写入预测函数如下。
library(rpart)
predfunc = function(input){
  input = as.data.frame(input)
  result = predict.rpart(m,newdata = input,type=’class’)
  as.character(result)
}
可以在R里面验证一下函数是否正常。
newx = data.frame(Sepal.Length=5.1,
                  Sepal.Width=3.5,
                  Petal.Length=1.4,
                  Petal.Width=0.2)
predfunc(newx)
然后新建一个data目录,将rda文件放入目录中,build&reload去建立这个名为test的R包。

第三步是安装R包到opencpu服务器上,我事先在本机上安装了opencpu,只需要像安装普通R包一样安装即可。
install.packages(opencpu)
这样在第二步reload时就直接安装好了test的R包。

第四步是实验API调用是否成功。在终端里进R,调用opencpu,即library(opencpu)会自动启动服务,并显示
[httpuv] http://localhost:4678/ocpu
OpenCPU single-user server ready.

调用模型时,用curl实验即可。另开一个终端,输入
curl http://localhost:4678/ocpu/library/test/R/predfunc/json -H “Content-Type: application/json” -d ‘{“input” :[ {“Sepal.Length”:1.1, “Sepal.Width” : 2.5, “Petal.Length”:0.4, “Petal.Width”:0.9}]}’

成功返回
[
    “setosa”
]

如果需要把这个模型提供给远程调用,需要安装服务器版本的opencpu。具体参见https://www.opencpu.org/posts/scoring-engine/

2014年的回顾

前几天在twitter上感言:新的一年,继续hard模式的人生。这个hard模式有两个意思。

一个意思是说在墙内的生活很hard。这年月在大局域网内搞什么事都不容易。写博客,发电邮,看电影,搜资料,这些大小事情都被GFW拦住。未来之中国,真是猪栏之中国!

另一个意思是说学习的状态很hard。不断的把自己往非舒适区推,不断的学一些新的东西。很有意思。有人说,把兴趣和工作合二为一,才能真正的做到极致,我深以为然。工作内的八小时和工作外的八小时,都在做同一类的事情,类似武侠小说中,那些对武道的终极追求者。(当然本人还是近女色的)

感言完毕,下面是2014年的流水账了。

年初的时候换工作到了一家电商公司1号店,接触到互联网数据。做了些枯燥的取数需求,也做了一些看似高端的模型,了解数据仓库和BI的东西,实战经验丰富了不少。感谢数据海洋的推荐。

后来春节期间为supstat编写R语言的中级培训材料,主要是以机器学习为纲,顺势又把这些算法捣实了一下。supstat的vivian人很好,祝她在纽约平安。

5月份和李舰到台湾参加东吴大学主办的一个会,顺便把台北玩了一下。认识了谢邦昌这位数据挖掘界的大佬,还有台北商业大学的邹老师。台北的饭还是很好吃的,有机会再去台北逛一逛。感谢主办方赞助的机票。

下半年时候开始花时间学python,对于它的数据模块已经运用自如。非常喜欢它的notebook,我甚至写了一个R和python的对比slide,准备在R会上讲的。不过李舰还是给了个命题作文,只讲了下数据科学。

2014年完成的一件大事就是把书稿写完了,李舰和我合著的《数据科学中的R语言》,历经三个寒暑,多轮修改,总算可以在各位的有生之年读到了。快哉快哉。感谢李颖编辑的耐心。

至于其它都不值多说了,或者先做了再说吧。我的博客仍然在更新,它是我的一个线上笔记(其实是不会用github)。敏锐的读者可以观察到,博客的主题已经改为《数据科学中的R和python》。工具增加了,研究的方向没有变。主题下面是对数据科学最好的一句提炼:Data Science is the art of turning data into actions。诸位有兴趣往数据科学坑里跳的,可以关注两个方面的修炼。一方面是有形的技能:理论、工具、实战。另一方面是无形的气质:好奇、创造、求败。在有涯的人生时间里,成为数据相关所有领域的专业余者(Pro-Ams,这个词要感谢志平)。

2015年的目标是:有knowledge、有money、有happy。成为超一流的数据科学家。

就这样子吧,借用一句话当尾巴:真正的英雄主义,是认清生活的本来面目,仍然热爱它。

2014年的回顾

前几天在twitter上感言:新的一年,继续hard模式的人生。这个hard模式有两个意思。一个意思是说在墙内的生活很hard。这年月在大局域网内搞什么事都不容易。写博客,发电邮,看电影,搜资?…