R,Caret,train(),predict(),GBM,错误:model.frame.default(..)中的错误:因子具有新级别

时间:2016-03-04 23:32:41

标签: r r-caret gbm

所以我非常清楚发生了什么,但我想知道如何处理错误,我已经看过其他类似的帖子,但它们并不是专门针对Gradient Boosting Machine模型的。它们似乎都与GLM有关,并且错误不是由我不相信的事情引起的。

这是我的代码:

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)

这是我的错误:

  

model.frame.default中的错误(条款,newdata,na.action = na.action,   xlev = object $ xlevels):因子47V具有新的级别E,H,J

所以我的因子变量在我的训练集中有很多级别,但是从错误中我猜测不是所有级别都在我的训练集中表示。当我进入我的测试集时,我的训练集中没有新级别,因此我收到此错误?

这是一个有监督的学习问题,我无法更改测试集并将数据移动到训练集。所以这不是抽样问题。

无论如何,有没有人知道任何设置或快速修复,以免这会导致我的程序崩溃?

1 个答案:

答案 0 :(得分:0)

这种情况在kaggle比赛中发生了很多。您可以组合变量以创建级别参数,以确保因子包含train和test中的所有级别。你可以在kaggle脚本中看到这一切。

请参阅基于mtcars的这个非常简单的示例。您只需要在引号中填写变量名称(例如&#34; cyl&#34;),变量将设置为列车和测试集中的一个因子,两个集合中的所有级别都可用。这样可以防止您的模型出错。这并不意味着它将从训练集中没有的因子水平中学到任何东西。

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

可能有其他方法可以做到这一点,但它确实有效。