2013-04-21 31 views
4

我有一个奇怪的问题,每当我尝试增加adabag包超过10的功能的最终参数我得到一个错误,甚至与mfinal = 9我得到警告。adabag助推功能抛出错误,当给予mfinal> 10

我的列车数据有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 

在此先感谢。

回答

0

我最近也碰到过这个相同的问题,并且this example R script完全解决了!

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

我不能完全肯定,但它似乎是你的“长度为0的说法”可能是一个空的树,可能发生的结果,因为有一个“复杂性”参数告诉函数不是默认设置如果同质性/缺乏拟合的降低低于某个阈值,则尝试分裂。

+0

该链接不适合我。 – user1965813 2015-02-27 13:10:29

+0

自发布该链接至今已有一年多的时间。感谢您的关注。主要点是生成警告,因为有些树是空的,所以使cp = -1(在rpart.control中)会强制rpart分裂直到maxdepth,从而避免空树。 – David 2015-03-22 07:50:53

2

这为我工作:

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

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

1

我想我碰到了这个问题。

忽略这个 - 如果你用cp = 0配置你的控件,这不会发生。我认为,如果树的第一个节点没有改进(或者至少不比cp好),那么该树将保持0个节点,因此您有一棵空树并且使算法失败。

编辑:问题是rpart生成树只有一个叶子(节点)和助推metod使用这个句子“k <-varImp(arboles [[m]],代理= FALSE,竞争= FALSE)”作为arboles [[m]]只有一个节点的树,它会给你一个错误。

为了解决这个可以修改提高梅托德:

写:修复(增强),并添加*的行。

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

这将防止algorith从acepting一个叶子的树,但你必须从控制PARAM为0的CP,以避免死循环..

+0

我不太清楚我的理解。在我的boostting()版本中,这些行已经存在。 – user1965813 2015-02-27 13:12:00

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

我的错误是,我没有设定目标因素之前。

试试这个:

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

,并做检查:

str(train$TARGET) 
+0

即使作为布尔向量,这个问题也会发生。这也解决了我的结局。 – 2017-10-18 02:48:51

+0

通过执行'str(train $ TARGET)'来检查train $ target的因子状态的建议是错误的。 R区分大小写,所以这两个向量不会相同。 – 2018-01-01 22:11:40

0

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

+0

它应该在评论 – manetsus 2016-09-25 00:10:04