在插入符号中使用成本敏感的C50

Fab*_*dez 6 r r-caret

我在火车包中使用火车训练一些c50型号.我设法用C5.0方法做得很好但是当我想使用成本敏感的C50方法时,我很难理解如何调整成本参数.我想要做的是在预测错误的课程时引入费用.我尝试在插入包网站(http://topepo.github.io/caret/index.html)中搜索并阅读这里和那里发现的几本手册/教程.我没有找到有关如何处理成本参数的任何信息.所以这就是我自己尝试的:

  1. 使用默认设置运行火车,看看我得到了什么.在输出中,列车功能尝试从0到2的成本,并给出成本= 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,我我需要做同样的事情或找到另一种方式来做到这一点......

我真的很感激这里的任何帮助.谢谢!

top*_*epo 5

有一个成本敏感的模型代码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)

马克斯

  • 谢谢马克斯.正如我上面所说,我试图使用你说的方法,但我很难理解那里的成本含义以及如何使用它.我现在可以看到它表示为整数.但是这是什么意思?当我使用R中的C50软件包使用成本敏感的C50时,我把成本作为一个矩阵,我发现很容易理解哪个类我设置了错误分类成本.但是只使用一个数字,我在哪个类中添加错误分类成本?或者它有不同的含义? (3认同)