2

我尝试了几次将 pmml 函数从包 pmml 应用到由包 randomForest 创建的随机森林模型('model.rf'):

> library(randomForest)
> dim(data)
[1]  32000 76
> model.rf <- randomForest(x=data[,2:76],y=data[,1],type='regression',ntree=150)
> library(pmml)
> model.rf.pmml<-pmml(model.rf)

每次在我的 Windows 8 系统(i7-4500U / 8gb RAM)上花费几个小时,直到 R 崩溃。

模型相当大。.RData 文件(仅包含模型)约为。10mb 磁盘和:

> model.rf$forest$nrnodes
[1] 5819

是内存不足导致的崩溃?我意识到 R 进程在崩溃之前几乎占用了所有可用内存。如果是这样,将我的模型转换为 pmml 需要什么系统?

同样从 iris 示例看来,磁盘上的大小增加了约 15 倍,因为与 R 数据文件相比,XML 不是压缩格式:

> library(randomForest)
> iris.rf <- randomForest(Species ~ ., data=iris, ntree=20)
> save(iris.rf,file='iris.rf.RData')
> iris.rf.pmml<-pmml(iris.rf)
> saveXML(iris.rf.pmml,file='iris.rf.xml')

iris.rf.RData --> 4kb iris.rf.xml --> 59kb

这个因素是恒定的吗?我的模型的 pmml 版本会在磁盘上约为 150mb 吗?

4

2 回答 2

2

不幸的是,R pmml 包确实有内存和速度限制。当我发布现在的版本时,我并没有意识到“大数据”可以有多大!我应该补充一点,Windows 在内存效率方面不是很好。有许多模型我无法在 Windows 机器上输出……但能够更快地生成完全相同的模型,并且在 linux 或 mac 计算机中更好地使用内存。我一直在为下一个版本进行改进,但现在,基于对具有 500 棵树的 RF 模型的实验,应用于具有 50 个变量和 50000 行 (~18Mb) 的数据集,创建一个pmml 模型是 5 小时(Linux 机器)。树中的平均节点数为 4000。一般的经验法则是,用于保存 pmml 对象的内存约为 R 对象的 2.5 倍……如您所见。仅用于将对象保存为 xml 文件的内存是一个主要因素。在包的当前状态下,(尚未发布),而不是 5 小时,它需要 1 小时 15 分钟。上面的数字是针对 linux 机器的……我希望它们对于 Windows 机器来说是两倍以上。请考虑使用非 Windows 机器来分析大型数据集;我确信这适用于大多数 R 包......不仅仅是 PMML!

于 2014-03-20T17:59:22.347 回答
2

您可以在使用大型随机森林模型时使用该r2pmml包。这个包依赖于 Java PMML 类模型和 XML 库。pmml因此,它比标准包快一千倍。无论您在 Windows 或 *NIX 上使用它,性能都是相同的。考虑到所有因素,您的模型应该可以在几秒钟内导出。

我使用该r2pmml库在笔记本电脑上大约一分钟内导出了一个 5 GB 随机森林 PMML 文件。诀窍是给 JVM 足够的堆大小,这样它就不需要做太多的垃圾收集:

options(java.parameters = c("-Xms8G", "-Xmx16G"))

library("r2pmml")

model.rf <-randomForest(x = data[,2:76], y = data[,1], type = 'regression', ntree = 150)

r2pmml(model.rf, "/tmp/rf.pmml")
于 2015-02-20T10:08:17.820 回答