2016-03-04 57 views
-3

所以我對發生的事情有一個很好的想法,但我想知道如何處理這個錯誤,我看過其他類似的帖子,但他們並不特定於Gradient Boosting Machine模型。它們似乎都與GLM有關,並且錯誤不是由我不認爲的同一件事引起的。R,插入符號,列車(),預測(),GBM,錯誤:model.frame.default(..)中的錯誤:因素有新的水平

這裏是我的代碼:

myTuneGrid <- expand.grid(n.trees=c(100,200), interaction.depth=c(9,10,11,12), shrinkage=0.1, n.minobsinnode=10) 

fitControl <- trainControl(method = "cv", number =5,verboseIter = FALSE,returnResamp = "all") 

myModel <- train(as.factor(target) ~ .,data = trainingDataC.GB, method = "gbm",trControl = fitControl,tuneGrid = myTuneGrid) 

myPrediction <- predict(myModel,newdata=testDataC) 

這裏是我的錯誤:

Error in model.frame.default(Terms, newdata, na.action = na.action, xlev = object$xlevels) : factor 47V has new levels E, H, J

所以我的因子變量有一堆在我的訓練集的水平,但是從錯誤我猜不是全部水平代表我的訓練集。當我進入測試集時,有新的關卡不在我的訓練集中,所以我得到這個錯誤?

這是一個監督學習問題,我不能更改測試集並將數據移動到訓練集。所以這不是一個抽樣問題。

無論如何,有沒有人知道任何設置或快速修復,以便這不會導致我的程序崩潰?

+1

如果您不提供數據,很難提供幫助 – HubertL

+0

沒有「快速修復」。您必須決定如何從樣本預測中完成。而大多數代碼庫默認情況下不允許這樣做,所以您可能必須編寫自定義預測函數......我不確定gbm。 –

+0

所以你只是想錯誤恢復?看看'tryCatch'函數。如果您需要可能更適合您的數據的方法建議,則可以在[stats.se]處詢問。 – MrFlick

回答

0

在kaggle的比賽中,這種情況發生了很多。您可以組合這些變量來創建一個關卡參數,以確保該因子包含列車和測試中的所有關卡。你在kaggle腳本中看到了很多。

看到這個基於mtcars的非常簡單的例子。您只需在引號中填入變量名稱(例如「cyl」),並將變量設置爲火車和測試集中的一個因子,並使用兩個集合中的所有可用等級。這隻會阻止你的模型發出錯誤。這並不意味着它將從訓練集中沒有的因素水平中學到任何東西。

train <- subset(mtcars, cyl < 8) 
test <- subset(mtcars, cyl >= 8) 


fact_train_test <- function(x) { 
    levels <- unique(c(train[[x]], test[[x]])) 
    train[[x]] <<- factor(train[[x]], levels=levels) 
    test[[x]] <<- factor(test[[x]], levels=levels) 
} 

fact_train_test("cyl") 

這樣做可能有其他方法,但它的工作原理。