运行决策树时,我使用:
mod1 <- C5.0(Species ~ ., data = iris)
如果我想传入数据框并在公式中设置目标要素名称(不同于“物种”),我该怎么做?
例如,
mod1 <- C5.0(other_data[,target_column] ~ ., data = other_data)
这显然不起作用。
答案 0 :(得分:3)
1)将公式粘贴在一起:
fun <- function(resp, data) C5.0(as.formula(paste(resp, "~ .")), data = data)
# test
library(C50)
fun("Species", iris)
,并提供:
Call:
C5.0.formula(formula = as.formula(paste(resp, "~ .")), data = data)
Classification Tree
Number of samples: 150
Number of predictors: 4
Tree size: 4
Non-standard options: attempt to group attributes
2)或者这种变化可以在Call:输出后在线上更好地再现调用:
fun <- function(resp, data)
do.call(C5.0, list(as.formula(paste(resp, "~ .")), data = substitute(data)))
fun("Species", iris)
,并提供:
Call:
C5.0.formula(formula = Species ~ ., data = iris)
Classification Tree
Number of samples: 150
Number of predictors: 4
Tree size: 4
以下是使用内置数据框fun
对此CO2
版本进行的第二次测试:
fun("Plant", CO2)
,并提供:
Call:
C5.0.formula(formula = Plant ~ ., data = CO2)
Classification Tree
Number of samples: 84
Number of predictors: 4
Tree size: 7
Non-standard options: attempt to group attributes
答案 1 :(得分:0)
可能更可取的替代方法是在创建公式后覆盖解析树中的符号:
x <- Species~.;
x;
## Species ~ .
x[[2L]] <- as.symbol('Blah');
x;
## Blah ~ .
以上是有效的,因为公式被编码为普通的解析树,顶级节点由'language'
函数的调用('call'
,模式`~`()
)组成,并归类为'formula'
:
(function(x) c(typeof(x),mode(x),class(x)))(.~.);
## [1] "language" "call" "formula"
所有解析树都可以作为递归列表结构进行读写。在这里,我将演示使用我最初为this answer编写的一个很好的小递归函数:
unwrap <- function(x) if (typeof(x) == 'language') lapply(as.list(x),unwrap) else x;
unwrap(Species~.);
## [[1]]
## `~`
##
## [[2]]
## Species
##
## [[3]]
## .
##
换句话说,解析树表示函数调用,函数符号作为第一个列表组件,然后所有函数参数作为后续列表组件。普通公式的特殊情况将LHS捕获为第一个函数参数,将RHS捕获为第二个。因此x[[2L]]
代表公式的LHS符号,我们可以直接用您首选符号的正常分配覆盖。
答案 2 :(得分:0)
以下内容允许将任意数据和目标特征传递给C50方法:
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)
}
诀窍是在构建模型后重命名方法调用中的术语,以便可以绘制它。