【问题标题】:adabag boosting function throws error when giving mfinal>10给 mfinal>10 时,adabag 增强功能会引发错误
【发布时间】:2013-04-14 16:21:59
【问题描述】:

我有一个奇怪的问题,每当我尝试将 adabag 包的增强功能中的 mfinal 参数增加到 10 以上时,我都会收到错误,即使 mfinal=9 我也会收到警告。

我的火车数据有 7 个类因变量和 100 个自变量以及大约 22000 个数据样本(使用 DMwR 检测了一个类)。我的因变量按顺序位于训练数据集的末尾。

library(adabag)
gc()
exp_recog_boo <- boosting(V1 ~ .,data=train_dataS,boos=TRUE,mfinal=9)

Error in 1:nrow(object$splits) : argument of length 0
In addition: Warning messages:
1: In acum + acum1 :
longer object length is not a multiple of shorter object length

提前致谢。

【问题讨论】:

    标签: r adaboost


    【解决方案1】:

    我的错误是我之前没有将 TARGET 设置为因素。

    试试这个:

    train$target <- as.factor(train$target)
    

    并通过以下方式检查:

    str(train$TARGET)
    

    【讨论】:

    • 即使作为布尔向量也会出现这个问题。这也解决了我的问题。
    • 执行str(train$TARGET) 来检查train$target 的因子状态的建议是错误的。 R 区分大小写,因此两个向量不会相同。
    【解决方案2】:

    这对我有用:

    modelADA <- boosting(lettr ~ ., data = trainAll, boos = TRUE, mfinal = 10, control = (minsplit = 0))
    

    基本上我只是告诉 rpart 要求最小分割长度为零来生成树,它消除了错误。我没有对此进行广泛的测试,所以我不能保证它是一个有效的解决方案(零长度叶子的树实际上是什么意思?),但它确实可以防止错误被抛出。

    【讨论】:

      【解决方案3】:

      我认为我遇到了问题。

      忽略这一点 - 如果您将控件配置为 cp = 0,则不会发生这种情况。我认为如果树的第一个节点没有改进(或至少不比 cp 更好),那么树会保持 0 个节点,所以你有一个空树,这会使算法失败。

      编辑:问题是 rpart 生成的树只有一个叶子(节点),而 boosting 方法使用这句话“k

      为了解决你可以修改提升方法:

      编写:修复(增强)并添加 *'S 行。

      if (boos == TRUE) { 
      **   k <- 1
      **   while (k == 1){
           boostrap <- sample(1:n, replace = TRUE, prob = pesos)
           fit <- rpart(formula, data = data[boostrap, -1],
               control = control)
      **   k <- length(fit$frame$var)
      **   }
           flearn <- predict(fit, newdata = data[, -1], type = "class")
           ind <- as.numeric(vardep != flearn)
           err <- sum(pesos * ind)
       }
      

      这将阻止算法接受一棵叶子树,但您必须将控制参数中的 CP 设置为 0 以避免无限循环..

      【讨论】:

      • 我不太确定我是否理解。在我的 boosting() 版本中,这些行已经存在。
      【解决方案4】:

      刚刚遇到同样的问题,将复杂性参数设置为 -1 或最小拆分为 0 都适用于 rpart.control,例如

      library(adabag)
      
      r1 <- boosting(Y ~ ., data = data, boos = TRUE, 
                     mfinal = 10,  control = rpart.control(cp = -1))
      
      r2 <- boosting(Y ~ ., data = data, boos = TRUE, 
                     mfinal = 10,  control = rpart.control(minsplit = 0))
      

      【讨论】:

        【解决方案5】:

        我最近也遇到了同样的问题,this example R script 彻底解决了!

        主要思想是您需要适当地设置 rpart 的控件(adabag 用于创建树,请参阅 rpart.control),以便在每棵树中至少尝试拆分。

        我不完全确定,但似乎您的“长度为 0 的参数”可能是空树的结果,这可能是因为“复杂性”参数的默认设置告诉函数不要如果同质性/不适合性的降低低于某个阈值,请尝试拆分。

        【讨论】:

        • 自我发布该链接以来已经一年多。感谢您引起我的注意。主要的一点是警告是因为一些树是空的,所以使 cp= -1(在 rpart.control 中)将强制 rpart 分裂直到最大深度,避免空树。
        【解决方案6】:

        使用 str() 查看数据框的属性。对我来说,我只是将 myclass 变量转换为因子,然后一切运行。

        【讨论】:

        • 应该在评论中
        猜你喜欢
        • 2019-09-07
        • 1970-01-01
        • 2018-11-28
        • 2010-11-19
        • 1970-01-01
        • 2023-03-31
        • 2015-08-28
        • 1970-01-01
        • 2015-07-21
        相关资源
        最近更新 更多