Caret模型随机森林转换为PMML出错。

3

我想使用pmml库导出一个Caret随机森林模型,以便在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')"

我搜索了一段时间,发现关于导出到PMML的信息很少。总的来说,pmml库中包含随机森林。

methods(pmml)
 [1] pmml.ada          pmml.coxph        pmml.cv.glmnet    pmml.glm          pmml.hclust       pmml.itemsets     pmml.kmeans      
 [8] pmml.ksvm         pmml.lm           pmml.multinom     pmml.naiveBayes   pmml.nnet         pmml.randomForest pmml.rfsrc       
[15] pmml.rpart        pmml.rules        pmml.svm 

这个功能使用一个直接的随机森林模型,但不是caret训练出来的。

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"
...
2个回答

5

当你的 model.Test 对象是 train 或者 train.formula 类型时,无法调用 pmml 方法。

train 方法的 Caret 文档说明了可以通过 finalModel 字段访问最佳模型,然后可以在该对象上调用 pmml 方法。

rf = model.Test$finalModel
pmml(rf)

遗憾的是,结果显示Caret使用“矩阵接口”(即通过设置和字段)来指定RF模型,而不是使用更常见的“公式接口”(即通过设置字段)。据我所知,“pmml”包不支持导出此类RF模型。

因此,看起来您最好的选择是使用两级方法。首先,使用Caret软件包找到数据集的最适合的RF参数化。其次,使用该参数化手动训练最终的RF模型,并使用“公式接口”。


谢谢您的回复,那行代码也报错了,rf = model.Test$finalModel pmml(rf) 您所说的公式接口是什么意思?只是从randomforest包中获取的随机森林吗? - Dr VComas
1
公式接口:rf = randomForest(Species ~ ., data = iris)。矩阵接口:rf = randomForest(y = iris[, c("Species")], x = iris[, c("Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width")], data = iris) - user1808924
也就是说,pmml 方法仅接受使用公式接口训练的 RF 模型。对于使用矩阵接口训练的 RF 模型,它会引发错误。不幸的是,Caret 包使用了矩阵接口。 - user1808924

2
您可以使用r2pmml软件包来完成此工作:
library("caret")
library("r2pmml")

data(iris)

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

GitHub上的帮助页面说,在加载r2pmml之前,您需要这个:options("java.parameters" = c("-Xms4G", "-Xmx8G"))。然而,在Mac上,这并没有解决我遇到的Java错误:java.lang.UnsupportedClassVersionError: org/jpmml/rexp/Main : Unsupported major.minor version 51.0 - IRTFM
这些Java选项为JVM进程分配更多的内存,可以加快大型RF模型的转换速度。然而,你遇到的问题 - java.lang.UnsupportedClassVersionError - 表明你正在使用过时的Java版本。请参考相关的SO线程https://stackoverflow.com/questions/33882019/problems-with-r2pmml - user1808924
除了一个java -version的shell执行报告:"java version "1.7.0_79" Java(TM) SE Runtime Environment (build 1.7.0_79-b15)" - IRTFM
系统和R的“rJava”包可能使用不同的Java版本。我不知道Mac,但在GNU / Linux上,可以单独安装“R-core”和“R-java”软件包。如果安装了“R-java”包,则它优先于系统的Java。您是否运行了http://stackoverflow.com/a/33882664/1808924中提供的R代码片段?我相信它的输出指向与系统Java不同的Java安装(即“java version 1.7.0_79”)。 - user1808924

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接