0%
925 字 3 分钟

R训练的模型导出为PMML

综述

R是用于统计分析、绘图的语言和操作环境。R是属于GNU系统的一个自由、免费、源代码开放的软件,它是一个用于统计计算和统计制图的优秀工具。
许多数据工程师或者数据分析师都习惯使用R进行数据挖掘和建模分析。
本文介绍了如何将R中的模型导出为PMML文件,方便后续的工程上线操作,内容包括涉及环境的搭建和中间遇到的坑。
本文介绍的三种方式,各自支持的机器学习模型种类不完全一致,文中附有官方文档链接,模型支持程度请查阅官方文档。

前置知识

  • R 基本操作
  • Maven 基本操作
  • Java 命令基本操作

R2PMML

这是一个R的包,用于将R中训练好的模型导出为PMML。github链接

软件版本

  • Java 1.7 或者更新
  • R 3.5.0

安装

使用devtools 从github的分支安装。代码如下:

1
2
3
install.packages("devtools")
library("devtools")
install_git("git://github.com/jpmml/r2pmml.git")


因为某些不可描述的原因,可能出现网站访问的问题,请灵活使用科学上网手段。
博主自己测试的时候,耗时在3min 左右。

基本用法(只有模型部分)

载入该包,然后调用保存模型即可,代码如下:

1
2
3
4
5
6
7
8
9
10
11
library("randomForest")
library("r2pmml")

data(iris)

# 训练模型
iris.rf = randomForest(Species ~ ., data = iris, ntree = 7)
print(iris.rf)

# 导出为 PMML
r2pmml(iris.rf, "iris_rf.pmml")

添加预处理过程

数据在进入模型前,可以先进行预处理,一线简单的预处理操作也可以定义在PMML中,R代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
library("caret")
library("randomForest")
library("r2pmml")

data(iris)

# 创建预处理过程,0-1 标准化
iris.preProcess = preProcess(iris, method = c("range"))

# 对原始数据进行预处理
iris.transformed = predict(iris.preProcess, newdata = iris)

# 使用预处理之后的数据训练模型
iris.rf = randomForest(Species ~., data = iris.transformed, ntree = 7)
print(iris.rf)

# 导出PMML 文件
r2pmml(iris.rf, "iris_rf.pmml", preProcess = iris.preProcess)

PMML包

R 中也支持了自带的PMML包,在最近的一次更新(2018.07.06)中,增加了支持模型的数量。

软件版本

  • R 3.5.0

安装过程

需要用到的包有:XML PMML 需要提前安装,命令如下:

1
2
install.packages(“XML”) 
install.packages('pmml')

选择镜像之后,等几分钟就行了。

使用

训练模型,和上面一致

1
2
3
4
library("randomForest")
data(iris)
iris.rf = randomForest(Species ~ ., data = iris, ntree = 7)
print(iris.rf)

将模型转为pmml之后,导出为pmml格式

1
2
3
library("pmml")
iris.rf.pmml <- pmml(iris.rf,name="Iris Random Forest",data=iris.rf)
savePMML(iris.rf.pmml,"iris.rf.pmml",version=4.3)

JPMML-R

上面两种方式,都是在R中,直接将模型导出为PMML。还可以将R的模型存为rds文件之后,调用Java 的方式安装。

软件版本

  • Java 1.8 或者更新
  • R 3.5.0

安装

在github 下载相关源码之后,编译

1
2
git clone git@github.com:jpmml/jpmml-r.git
mvn clean install

在 target 目录下会生成converter-executable-1.3-SNAPSHOT.jar 文件。

R中生成rds文件

将训练好的模型保存为rds,代码如下:

1
2
3
library("randomForest")
rf = randomForest(Species ~ ., data = iris)
saveRDS(rf, "rf.rds")

将rds文件转为pmml文件

1
java -jar target/converter-executable-1.3-SNAPSHOT.jar --rds-input rf.rds --pmml-output rf.pmml

总结

本文介绍了三种不同的方式,将R中训练好的模型导出为pmml文件。3种方式支持的模型不完全一致,比如 R2PMML 不支持glmnet,需要存glmnet的模型时,可以使用另外的方式。

REF

R2PMML
pmml: Generate PMML for Various Models
JPMML-R