R 插入符号模型将随机森林转化为PMML误差

R 插入符号模型将随机森林转化为PMML误差,r,random-forest,r-caret,pmml,R,Random Forest,R Caret,Pmml,我想使用pmml库导出一个插入符号随机林模型,以便在Java中使用它进行预测。 这是我得到的错误的复制品 data(iris) require(caret) require(pmml) rfGrid2 <- expand.grid(.mtry = c(1,2)) fitControl2 <- trainControl( method = "repeatedcv", number = NUMBER_OF_CV, repeats = REPEATES) model.Tes

我想使用pmml库导出一个插入符号随机林模型,以便在Java中使用它进行预测。 这是我得到的错误的复制品

data(iris)
require(caret)
require(pmml)
rfGrid2 <- expand.grid(.mtry = c(1,2))
fitControl2 <- trainControl(
  method = "repeatedcv",
  number = NUMBER_OF_CV, 
  repeats = REPEATES)

model.Test <- train(Species ~ .,
  data = iris,
  method ="rf",
  trControl = fitControl2,
  ntree = NUMBER_OF_TREES,
  importance = TRUE,  
  tuneGrid = rfGrid2)

print(model.Test)
pmml(model.Test)

Error in UseMethod("pmml") : 
  no applicable method for 'pmml' applied to an object of class "c('train', 'train.formula')"
它使用直接随机森林模型工作,但不使用经过插入符号训练的模型

library(randomForest)
iris.rf <- randomForest(Species ~ ., data=iris, ntree=20)
# Convert to pmml
pmml(iris.rf)
# this works!!!
str(iris.rf)

List of 19
 $ call           : language randomForest(formula = Species ~ ., data = iris, ntree = 20)
 $ type           : chr "classification"
 $ predicted      : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
...

str(model.Test)
List of 22
 $ method      : chr "rf"
 $ modelInfo   :List of 14
  ..$ label     : chr "Random Forest"
  ..$ library   : chr "randomForest"
  ..$ loop      : NULL
  ..$ type      : chr [1:2] "Classification" "Regression"
...
库(随机林)

iris.rf您不能使用
train
train.formula
类型调用
pmml
方法(即,这是您的
model.Test
对象的类型)

train
方法的插入符号说明,您可以通过
finalModel
字段访问最佳模型。然后可以在该对象上调用
pmml
方法

rf = model.Test$finalModel
pmml(rf)
不幸的是,插入符号使用“矩阵接口”(即通过设置
x
y
字段)指定RF模型,而不是使用更常见的“公式接口”(即通过设置
公式
字段)。AFAIK,“pmml”软件包不支持此类射频型号的出口

所以,看起来最好的选择是使用两级方法。首先,使用插入符号包为数据集找到最合适的RF参数化。其次,使用此参数化的“公式界面”手动训练最终RF模型

您可以使用来完成此工作:

library("caret")
library("r2pmml")

data(iris)

train.rf = train(Species ~ ., data = iris, method = "rf")
print(train.rf)
r2pmml(train.rf, "/tmp/train-rf.pmml")

感谢您的回复,该行还返回一个错误,rf=model.Test$finalModel pmml(rf)您对公式界面的意思是什么?仅来自randomforest软件包?公式界面的randomforest:
rf=randomforest(物种~,数据=iris)
。矩阵接口:
rf=randomForest(y=iris[,c(“物种”)],x=iris[,c(“萼片长度”,“萼片宽度”,“花瓣长度”,“花瓣宽度”)],data=iris)
也就是说,
pmml
方法只接受使用公式接口训练过的rf模型。对于使用矩阵接口训练过的RF模型,这会产生错误。不幸的是,插入符号包使用了矩阵接口。GitHub的帮助页面上说,在加载r2pmml之前需要这个接口:
选项(“java.parameters”=c(“-Xms4G”,“-Xmx8G”)
。但是,这并没有解决我在Mac上遇到的java错误:
java.lang.UnsupportedClassVersionError:org/jpmml/rexp/Main:Unsupported major.minor version 51.0
这些java选项为JVM进程分配更多内存,这将加快大型RF模型的转换。但是,您的问题-
java.lang.UnsupportedClassVersionError
-表明您使用的是过时的java版本。请参阅相关的SO线程,除了
java-version
的shell执行报告:“java版本”1.7.0_79“java(TM)SE运行时环境(build 1.7.0_79-b15)”系统和R的“rJava”包可能使用不同的java版本。我不知道Mac,但在GNU/Linux上可以分别安装
R-core
R-java
软件包。如果安装了
R-java
软件包,则其优先级高于系统的java。您是否运行了中给出的R代码段?我相信它的打印输出指向与系统的Java不同的Java安装(即“Java版本1.7.079”)。
library("caret")
library("r2pmml")

data(iris)

train.rf = train(Species ~ ., data = iris, method = "rf")
print(train.rf)
r2pmml(train.rf, "/tmp/train-rf.pmml")