当给予mfinal> 10时,adabag助推功能会抛出错误

时间:2013-04-21 20:12:20

标签: r adaboost

我有一个奇怪的问题,每当我尝试增加adabag包的功能超过10时的mfinal参数我得到一个错误,即使使用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

提前致谢。

6 个答案:

答案 0 :(得分:6)

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

试试这个:

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

并查看:

str(train$TARGET)

答案 1 :(得分:2)

这对我有用:

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

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

答案 2 :(得分:1)

我想我遇到了问题。

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

编辑:问题是rpart生成只有一个叶子(节点)的树,并且提升方法使用这个句子“k&lt; - varImp(arboles [[m]],代理= FALSE,竞争= FALSE)”作为arboles [[m]]只有一个节点的树,它会让你感到恐怖。

要解决此问题,您可以修改提升方法:

写:修复(增强)并添加*'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以避免无限循环。

答案 3 :(得分:1)

刚遇到同样的问题,并将复杂性参数设置为-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))

答案 4 :(得分:0)

我最近也遇到了同样的问题,this example R script完全解决了这个问题!

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

我不完全确定,但看起来你的“长度0的参数”可能是空树的结果,这可能发生,因为有一个“复杂性”参数的默认设置告诉函数不要如果同质性/缺乏适应性的降低低于某一阈值,则尝试分裂。

答案 5 :(得分:0)

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