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)
调用,其中 obj
是 C5.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)
而 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?
我需要那样调用,以便使用许多不同的公式测试算法。
如有任何帮助,我们将不胜感激。提前谢谢大家。
不幸的是这是一个错误。请参阅 github 上的 issue 8。看起来 Max Kuhn(C50 的开发者)没有时间研究它,因为错误报告是从八月份开始的。您可能还想在那里附加您的问题。这可能会重新引起开发人员的注意。
我正在使用 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
有两个不同的值。如果我像这样第一次调用 C.5:
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?
我需要那样调用,以便使用许多不同的公式测试算法。
如有任何帮助,我们将不胜感激。提前谢谢大家。
不幸的是这是一个错误。请参阅 github 上的 issue 8。看起来 Max Kuhn(C50 的开发者)没有时间研究它,因为错误报告是从八月份开始的。您可能还想在那里附加您的问题。这可能会重新引起开发人员的注意。