R 插入符号模型将随机森林转化为PMML误差
我想使用pmml库导出一个插入符号随机林模型,以便在Java中使用它进行预测。 这是我得到的错误的复制品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
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")