我正在使用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)调用,其中obj是C5.0对象,这就是问题所在。在model.frame()函数中,我发现了下面这一行:
rsp <- strsplit(paste(formula$call[2]), " ")[[1]][1]想起来了吗?该错误引用了该rsp变量。问题是formula$call有两个不同的值。如果我像这样第一次调用call:
model <- C5.0(ID ~ ., data=data, trials=10)一切正常,因为formula$call包含C5.0.formula(formula = ID ~ ., data = data, trials = 10),而rap为ID,因此下一次调用:
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了?
我需要以这种方式调用,以便使用许多不同的公式测试算法。
任何帮助都将不胜感激。提前感谢大家。
发布于 2018-01-24 23:20:30
不幸的是,这是一个bug。请参见github上的issue 8。看起来Max Kuhn (C50的开发者)没有时间去研究它,因为bug报告是在8月份发布的。你可能也想把你的问题附加到那里。这可能会重新引起开发人员的注意。
https://stackoverflow.com/questions/48425423
复制相似问题