【发布时间】:2011-11-01 06:28:23
【问题描述】:
我创建了几个我想要经常评估的 ctree 模型(大约 40 到 80 个)。
一个问题是模型对象非常大(40 个模型需要超过 2.8G 的内存),而且在我看来,它们存储了训练数据,可能是 modelname@data 和 modelname@responses,而不仅仅是与预测新数据相关的信息。
大多数其他 R 学习包都有可配置的选项,是否将数据包含在模型对象中,但我在文档中找不到任何提示。我还尝试通过
分配空的 ModelEnv 对象modelname@data <- new("ModelEnv")
但对相应 RData 文件的大小没有影响。
任何人都知道 ctree 是否真的存储了训练数据,以及如何从 ctree 模型中删除与新预测无关的所有数据,以便我可以将其中的许多数据放入内存中?
非常感谢,
斯蒂芬
感谢您的反馈,这已经很有帮助了。
我用dput和str深入观察了对象,发现模型中没有包含训练数据,但是有一个responses槽,里面好像有训练标签和行名.无论如何,我注意到每个节点对于每个训练样本都有一个权重向量。在检查了一段时间代码后,我在谷歌上搜索了一下,在party NEWS 日志中找到了以下评论:
CHANGES IN party VERSION 0.9-13 (2007-07-23)
o update `mvt.f'
o improve the memory footprint of RandomForest objects
substancially (by removing the weights slots from each node).
事实证明,party包中有一个C函数可以删除这些权重,称为R_remove_weights,定义如下:
SEXP R_remove_weights(SEXP subtree, SEXP removestats) {
C_remove_weights(subtree, LOGICAL(removestats)[0]);
return(R_NilValue);
}
它也可以正常工作:
# cc is my model object
sum(unlist(lapply(slotNames(cc), function (x) object.size(slot(cc, x)))))
# returns: [1] 2521256
save(cc, file="cc_before.RData")
.Call("R_remove_weights", cc@tree, TRUE, PACKAGE="party")
# returns NULL and removes weights and node statistics
sum(unlist(lapply(slotNames(cc), function (x) object.size(slot(cc, x)))))
# returns: [1] 1521392
save(cc, file="cc_after.RData")
如您所见,它大大减小了对象大小,从大约 2.5MB 减少到 1.5MB。
不过,奇怪的是,相应的 RData 文件异常庞大,而且对它们没有任何影响:
$ ls -lh cc*
-rw-r--r-- 1 user user 9.6M Aug 24 15:44 cc_after.RData
-rw-r--r-- 1 user user 9.6M Aug 24 15:43 cc_before.RData
解压文件显示 2.5MB 的对象占用了将近 100MB 的空间:
$ cp cc_before.RData cc_before.gz
$ gunzip cc_before.gz
$ ls -lh cc_before*
-rw-r--r-- 1 user user 98M Aug 24 15:45 cc_before
任何想法,可能是什么原因造成的?
【问题讨论】:
-
如果您可以将
dput的结果发布在一个小样本对象上会有所帮助。如果您使用str,您可以查看对象中是否存储了训练数据。 -
注意:我重新标记了问题并删除了“派对”标签,因为它在 SO 上没有明确定义,当然不限于 R 包。我添加了内存管理,因为这似乎是主要动机。
标签: r memory-management classification decision-tree