在 R 中:is.data.frame(data) 中的错误:找不到对象'',C5.0 绘图
Posted
技术标签:
【中文标题】在 R 中:is.data.frame(data) 中的错误:找不到对象\'\',C5.0 绘图【英文标题】:in R: Error in is.data.frame(data) : object '' not found, C5.0 plot在 R 中:is.data.frame(data) 中的错误:找不到对象'',C5.0 绘图 【发布时间】:2015-10-22 15:40:37 【问题描述】:这个问题与 *** 上的其他一些问题(here、here 和 here)类似,但差异很大,因此我无法将这些答案外推到我的案例中。
我有一个适合 C5.0 模型的函数,然后尝试绘制模型。
train_d <- globald[train_ind,c(features,21)]
model <- C5.0(binclass ~ .,data=train_d,trials=10)
binclass
是我的训练/测试数据中的列名(globald 是一个数据框,我从中使用_ind
索引和列c(3:12,21)
子集行,其中第21 列命名为binclass
)。拟合效果很好。但是,当我也添加该行时
plot(model,trial=0)
然后我收到以下错误:Error in is.data.frame(data) : object 'train_d' not found
。
怎么可能在拟合模型时找到并正确使用train_d
,但在绘图时却找不到train_d
?并且,关于如何解决这个问题的任何建议。 [r] 中的命名空间对我来说仍然是个谜。
一个最小的运行示例如下:
f <- function()
library(C50)
set.seed(1)
class = c(1,2)
d <- data.frame(feature1 = sample(1:10,10,replace=TRUE), feature2 = 1:10, binclass = class)
d$binclass <- as.factor(d$binclass)
model <- C5.0(binclass ~ ., data=d)
plot(model)
调用f()
会导致以下错误:Error in is.data.frame(data) : object 'd' not found
编辑: 根据 MrFlick 的回答,这个问题的原因似乎是 C5.0 代码中的错误。 Pascal 和 MrFlick 指出了一些解决方法。
【问题讨论】:
还有哪些“其他问题”?如果没有可重复的例子,得到答案会很复杂。 这听起来不像是名称空间问题,而是可能的范围问题。但是从您提供的信息中不是很清楚。你应该包括一个reproducible example,明确你在做什么。 @Pascal:提供了一个最小的工作示例。我不知道这是否是范围问题的命名空间。这是一个我希望看到解决的问题... 不确定这是不是最好的做法,但是当您在d$binclass <- as.factor(d$binclass)
之后添加assign("d", d, .GlobalEnv)
时它可以工作。
@Pascal。这似乎是一个相当严厉的措施。但是,嘿,它有效!
【参考方案1】:
您可以使用特殊赋值运算符
【讨论】:
爱你@user10854911【参考方案2】:@MrFlick 几乎拥有它,但并不完全。当试图将任意数据和目标特征传递给 C50 方法时,这个绘图问题特别烦人。正如 MrFlick 所指出的,这与重命名术语有关。通过在方法调用中重命名 x 和 y 项,绘图函数不会混淆。
tree_model$call$x <- data_train[, -target_index]
tree_model$call$y <- data_train[[target_feature]]
例如,这是一种传入任意数据和目标特征并且仍然能够绘制结果的方法:
boosted_trees <- function(data_train, target_feature, iter_choice)
target_index <- grep(target_feature, colnames(data_train))
model_boosted <- C5.0(x = data_train[, -target_index], y = data_train[[target_feature]], trial=iter_choice)
model_boosted$call$x <- data_train[, -target_index]
model_boosted$call$y <- data_train[[target_feature]]
return(model_boosted)
上述方法返回的模型对象可以正常绘制。
model <- boosted_trees(data_train, 'my_target', 10)
plot(model)
【讨论】:
【参考方案3】:在适当的环境中评估命令时,代码中似乎确实存在错误。问题似乎出在C50::model.frame.C5.0
函数中。我能找到的“最干净”的工作是在你的模型中添加一个terms
属性。这将有助于封装函数环境。
f <- function()
library(C50)
set.seed(1)
class = c(1,2)
d <- data.frame(feature1 = sample(1:10,10,replace=TRUE), feature2 = 1:10, binclass = class)
d$binclass <- as.factor(d$binclass)
model <- C5.0(binclass ~ ., data=d)
model$terms <- eval(model$call$formula) #<---- Added line
plot(model)
【讨论】:
好的。所以这似乎是C5.0中的一个错误?解决方法确实有效,至少可以缓解问题。以上是关于在 R 中:is.data.frame(data) 中的错误:找不到对象'',C5.0 绘图的主要内容,如果未能解决你的问题,请参考以下文章