我在火车包中使用火车训练一些c50型号.我设法用C5.0方法做得很好但是当我想使用成本敏感的C50方法时,我很难理解如何调整成本参数.我想要做的是在预测错误的课程时引入费用.我尝试在插入包网站(http://topepo.github.io/caret/index.html)中搜索并阅读这里和那里发现的几本手册/教程.我没有找到有关如何处理成本参数的任何信息.所以这就是我自己尝试的:
使用默认设置运行火车,看看我得到了什么.在输出中,列车功能尝试从0到2的成本,并给出成本= 2的最佳模型.
尝试在expand.grid函数中添加成本作为矩阵,就像使用C5.0包一样.代码如下(试验被推到1,因为我只想在输出中输入一棵树/一套规则)
c50Grid < - expand.grid(.trials = 1,.model = c("tree","rules"),. winnow = c("TRUE","FALSE"),. cost = matrix(c(0,1) ,2,0),ncol = 2))
然而,当我执行列车功能时,虽然我没有得到任何错误(但我得到50个警告),火车再次尝试从0到2的成本.我做错了什么?哪种格式有成本参数?这是什么意思?我如何解释结果?获得成本的那一类是"预测0级错误成本是否超过1级"?此外,我尝试使用一个矩阵,但虽然它不适用于这种格式,我如何添加我想测试的不同成本?
谢谢!任何帮助都会非常受欢迎!
编辑:
所以,试着自己找一个关于C5.0Cost成本参数意义的答案,我去了C5.0Cost.R(https://r-forge.r-project.org/scm/viewvc .php/models/files/C5.0Cost.R?view = markup&root = caret&pathrev = 761)并查找代码.这一行:
cmat <-matrix(c(0, param$cost, 1, 0), ncol = 2)
Run Code Online (Sandbox Code Playgroud)
我猜,它将成本参数传递给成本矩阵.所以,我想现在我能理解它是如何运作的.如果我有class = {0,1}并且我的正类是0,那么这个矩阵表示"预测0级错误成本比1级高两倍",对吧?我现在的问题是,我怎么能这样做呢?我怎么能设置"预测1级错误成本比0级加倍",这将是:
cmat <- matrix(c(0, 1, param$cost, 0), ncol=2)
Run Code Online (Sandbox Code Playgroud)
我可以将成本设置为0.5吗?如果想要使用不同的值进行训练,只需使用小于1 {0.5,0.6,0.7等}的值.注意:我的数据的方式,当我之前使用C50或其他树时,它采用"正类= 0",所以当我使用C50时我不得不反转成本矩阵,所以如果我使用插入方法C5.0Cost,我我需要做同样的事情或找到另一种方式来做到这一点......
我真的很感激这里的任何帮助.谢谢!
有一个成本敏感的模型代码train和C5.0(使用method = "C5.0Cost").例如:
library(caret)
set.seed(1)
dat1 <- twoClassSim(1000, intercept = -12)
dat2 <- twoClassSim(1000, intercept = -12)
stats <- function (data, lev = NULL, model = NULL) {
c(postResample(data[, "pred"], data[, "obs"]),
Sens = sensitivity(data[, "pred"], data[, "obs"]),
Spec = specificity(data[, "pred"], data[, "obs"]))
}
ctrl <- trainControl(method = "repeatedcv", repeats = 5,
summaryFunction = stats)
set.seed(2)
mod1 <- train(Class ~ ., data = dat1,
method = "C5.0",
tuneGrid = expand.grid(model = "tree", winnow = FALSE,
trials = c(1:10, (1:5)*10)),
trControl = ctrl)
xyplot(Sens + Spec ~ trials, data = mod1$results,
type = "l",
auto.key = list(columns = 2,
lines = TRUE,
points = FALSE))
set.seed(2)
mod2 <- train(Class ~ ., data = dat1,
method = "C5.0Cost",
tuneGrid = expand.grid(model = "tree", winnow = FALSE,
trials = c(1:10, (1:5)*10),
cost = 1:10),
trControl = ctrl)
xyplot(Sens + Spec ~ trials|format(cost), data = mod2$results,
type = "l",
auto.key = list(columns = 2,
lines = TRUE,
points = FALSE))
Run Code Online (Sandbox Code Playgroud)
马克斯