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

时间:2014-10-01 11:22:40

标签: 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","规则"),. winnow = c(" TRUE& #34;," FALSE"),. cost = matrix(c(0,1,2,0),ncol = 2))

  3. 然而,当我执行列车功能时,虽然我没有收到任何错误(但我得到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)
    

    我猜,它将成本参数传递给成本矩阵。所以,我想现在我能理解它是如何运作的。如果我有class = {0,1}并且我的正类为0,那么这个矩阵表示&#34;预测0级错误的成本比1级和#34更高,对吧? 我现在的问题是,我怎么能这样做呢?我怎么能设置&#34;预测1级错误的成本比0级和#34;加倍,这将是:

    cmat <- matrix(c(0, 1, param$cost, 0), ncol=2)
    

    我可以将成本设置为0.5吗?如果想要使用不同的值进行训练,只需使用小于1 {0.5,0.6,0.7等}的值。 注意:我的数据的方式,当我之前使用C50或其他树时,它需要&#34;正类= 0&#34;,所以当我使用C50时我不得不反转成本矩阵所以如果我使用插入方法C5.0Cost,我需要做同样的事情或者找另一种方法去做...

    我非常感谢这里的任何帮助。 谢谢!

2 个答案:

答案 0 :(得分: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))

最高

答案 1 :(得分:1)

  

如果我有class = {0,1}并且我的正类为0,则此矩阵表示“预测0级错误成本比1级高两倍”,对吧?我现在的问题是,我怎么能这样做呢?我怎么能设置“预测1级错误成本比0级加倍”[...]?

不幸的是,您目前无法改变插入符号中误报的成本。这似乎是一个错误!有关此问题的详细信息,请参阅此post