4

我有一个奇怪的问题,每当我尝试将 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

提前致谢。

4

6 回答 6

7

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

尝试这个:

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

并通过以下方式检查:

str(train$TARGET)
于 2016-06-29T20:14:04.023 回答
2

这对我有用:

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

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

于 2014-03-19T16:51:22.373 回答
1

我想我遇到了问题。

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

编辑:问题是 rpart 生成的树只有一个叶子(节点),而提升方法使用这句话“k <- varImp(arboles [[m]],surrogates = FALSE,competites = 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 以避免无限循环。

于 2014-09-10T14:37:01.277 回答
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))
于 2015-06-29T14:40:35.640 回答
0

我最近也遇到了同样的问题,这个示例 R 脚本完全解决了它!

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

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

于 2013-10-25T04:46:01.310 回答
0

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

于 2016-09-24T23:45:24.563 回答