【发布时间】:2016-09-27 16:20:23
【问题描述】:
我试图在并行处理时从 C50 模型中提取规则。 This 回答帮助我从模型对象中提取规则。但是,由于我需要并行处理模型,所以我使用的是 foreach。这似乎与未导出函数有问题,因为它看不到数据对象。这是一些可重现的代码:
library(foreach)
library(doMC)
registerDoMC(2)
j = c(1,2)
result = foreach(i = j) %dopar% {
library(C50)
d = iris
model <- C5.0(Species ~ ., data = d)
modParty <- C50:::as.party.C5.0(model)
return(modParty)
}
在这种情况下,它只计算模型两次。在我的真实代码中,d 是一个不断变化的样本,它也在 foreach 函数中生成。
我的调试显示杂项行是modParty <- C50:::as.party.C5.0(model)。它抛出错误
{ 中的错误:任务 1 失败 - “找不到对象”
即使d 肯定可用于集群中的每个工作人员。我通过logging 包的loginfo(ls()) 登录到文件中检查了这一点。
为什么函数看不到对象d?非常感谢任何帮助。
这里的附加信息是traceback()
> traceback()
3: stop(simpleError(msg, call = expr))
2: e$fun(obj, substitute(ex), parent.frame(), e$data)
1: foreach(i = j) %dopar% {
library(C50)
d = iris
model <- C5.0(Species ~ ., data = d)
modParty <- C50:::as.party.C5.0(model)
return(modParty)
}
编辑
只是为了澄清:它不必与foreach 做任何事情。使用正常功能也是同样的错误:
library(C50)
d = iris
getC50Party = function(dat){
model <- C5.0(Species ~ ., data = dat)
modParty <- C50:::as.party.C5.0(model)
return(modParty)
}
c50Party = getC50Party(d)
{ 中的错误:任务 1 失败 - “找不到对象 'dat'”
问题在于as.party.C5.0 试图从整个工作区访问数据对象。
【问题讨论】:
-
我不确定这里到底发生了什么,因为
partykit(我合着)根本没有参与其中。这一切都归结为C50包对其模型的作用。我的初步评估是C5.0对象应该更好地保留它们的terms,而不是在as.party方法中重新构建它们。但我真的还没有深入研究这个。由于C50维护者目前似乎没有遵循 SO,我建议直接与他联系。但也许as.party方法没有导出是有原因的...... -
是的,它是如此接缝。因为
as.party.C5.0方法尝试访问d不是从model对象,而是从一般工作区(甚至不是从工作人员的工作区)。我已经给 Max 发送了电子邮件,并将 SO 问题的链接发送给他。不幸的是我没有得到回复......我想现在我不能使用这个包来并行运行。我什至查看了函数的来源,但为此我想我太新手了:/ -
@AchimZeileis 我想我现在发现了这个错误。函数
as.party.C5.0调用另一个未导出的函数model.frame.C5.0。在这个方法中,基函数eval()被调用,它使用了错误的环境(在这种情况下,d对象不再存在)。解决方案是插入env = parent.frame(2),因为环境需要是第二个父框架。我是否有可能编辑源代码,以便在维护者看不到的情况下使用错误修复?我已经尝试过this -
是的,这是一个“显而易见的”问题(如果您以前使用过公式/术语/模型框架),但
parent.frame(2)解决方案可能不是最好或最强大的解决方案。我认为最好保留terms(正如我上面写的),它确实保留了环境信息。如果我是维护者,至少这是我会尝试实现的。如果 Max 没有回复您的查询,最简单的解决方案是从 CRAN 下载包的 .tar.gz,修改源代码,然后在您的计算机上重新构建和安装包。 -
哦,我明白了,现在您的第一条评论对我来说也更有意义 ;-) 抱歉,这是我第一次深入研究一个包。现在我已经按照你的建议做了。我下载了更改它的源(但仅限于
parent.frame(2)解决方案)并再次安装了更改后的包。它似乎适用于as.party()函数和fitted函数。但是维护者修复错误仍然会很棒!
标签: r foreach machine-learning decision-tree party