在 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 &lt;- 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 绘图的主要内容,如果未能解决你的问题,请参考以下文章

r语言createdatapartition在哪个函数中

R:在用户定义的函数中使用 get 和 data.table

R在for循环中从data.table中提取元素[重复]

在data.table R中滚动连接

R之data.table速查手册

在R中的data.frame中聚合一个轴[重复]