2013-04-21 38 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