我有一个奇怪的问题,每当我尝试增加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
提前致谢。
答案 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变量转换为因子,然后一切都运行。