这个问题与Stackoverflow上的其他一些问题(here、here和here)相似,但有很大的不同,以至于我无法根据我的情况推断这些答案。
我有一个函数,我拟合一个C5.0模型,然后尝试绘制该模型。
train_d <- globald[train_ind,c(features,21)]
model <- C5.0(binclass ~ .,data=train_d,trials=10)globald是我的训练/测试数据中的一个列名( binclass是一个数据帧,我从该数据帧中将具有_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指出了一些解决方法。
发布于 2015-08-01 05:54:16
当涉及到在适当的环境中评估命令时,代码中似乎确实存在错误。问题似乎出在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)
}发布于 2016-05-13 05:01:41
@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)发布于 2019-01-02 01:07:10
您可以使用特殊赋值运算符<<-而不是标准赋值运算符(<-)。它会将对象保存到全局环境中,这样就可以解决您的问题。
https://stackoverflow.com/questions/31738045
复制相似问题