R C5.0 使用存储在变量中的公式时选择未定义的列

R C5.0 Undefined columns selected when using a formula stored in a variable

我正在使用 C50 R Package 进行决策树预测。

我有以下代码:

library("partykit")
library("C50")

//Creates a sample data frame
data <- data.frame(ID = c(1, 2, 3, 4, 5),
               var1 = c('a', 'b', 'c', 'd', 'e'),
               var2 = c(1, 1, 0, 0, 1))

//This is the variable I want to predict
variable <- "ID"

//First I convert the column to factor
data[, variable] <- factor(data[, variable])

//Then I create the formula
formula <- as.formula(paste(variable, " ~ ."))

//And finally I fit the model with the formula
model <- C5.0(formula, data=data, trials=10)

到目前为止一切正常,问题来了,当我尝试绘制树时:

png(filename = paste("test.png"), width = 800, height = 60)
plot(model) //This line throws the error: Error in `[.data.frame`(mf, rsp) : undefined columns selected
dev.off()

但是如果我换行:

model <- C5.0(formula, data=data, trials=10)

收件人:

model <- C5.0(ID ~ ., data=data, trials=10)

一切正常

经过一些调试后,我得到了以下附加信息:

C5.0函数里面有这段代码:

call <- match.call()

如果我往里看 call 这就是我得到的:

C5.0.formula(formula = formula, data = data, trials = 10)

但是如果对C5.0的调用是:

model <- C5.0(ID ~ ., data=data, trials=10)

那么call对象是这样的:

C5.0.formula(formula = ID ~ ., data = data, trials = 10)

这可能看起来很正常,但调试 plot() 函数时我发现在某些时候调用了函数 as.party(x, trial = trial),其中 x 是 C5.0 对象。在 as.party() 函数内部还有另一个调用,即 model.frame(obj) 调用,其中 objC5.0 对象,这就是问题所在。在 model.frame() 函数中我发现了这一行:

rsp <- strsplit(paste(formula$call[2]), " ")[[1]][1]

还记得吗?该错误引用了 rsp 变量。问题是 formula$call 有两个不同的值。如果我像这样第一次调用 C.5:

model <- C5.0(ID ~ ., data=data, trials=10)

一切正常,因为 formula$call 包含 C5.0.formula(formula = ID ~ ., data = data, trials = 10)rapID 所以下一次调用:

tmp <- mf[rsp]

执行没有问题(mf 是初始数据帧)。

但是随着调用:

C5.0.formula(formula = formula, data = data, trials = 10)

formula$call 对象包含:

C5.0.formula(formula = formula, data = data, trials = 10)

rsp"formula" 所以行:

tmp <- mf[rsp]

失败,因为数据框中没有 "formula" 列。

这是预期的行为吗?如果是,我无法使用存储在变量中的公式来调用 C5.0?

我需要那样调用,以便使用许多不同的公式测试算法。

如有任何帮助,我们将不胜感激。提前谢谢大家。

不幸的是这是一个错误。请参阅 github 上的 issue 8。看起来 Max Kuhn(C50 的开发者)没有时间研究它,因为错误报告是从八月份开始的。您可能还想在那里附加您的问题。这可能会重新引起开发人员的注意。