-3

所以我对正在发生的事情有一个很好的了解,但我想知道如何处理这个错误,我看过其他类似的帖子,但它们并不特定于 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(Terms, newdata, na.action = na.action, xlev = object$xlevels) 中的错误:因子 47V 具有新级别 E、H、J

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

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

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

4

1 回答 1

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

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

于 2016-03-05T09:26:49.193 回答