首页 文章

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

提问于
浏览
6

我在火车包中使用火车训练一些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)

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

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

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

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

2 回答

  • 1

    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))
    

    马克斯

  • 5

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

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

相关问题