所以我非常清楚发生了什么,但我想知道如何处理错误,我已经看过其他类似的帖子,但它们并不是专门针对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
所以我的因子变量在我的训练集中有很多级别,但是从错误中我猜测不是所有级别都在我的训练集中表示。当我进入我的测试集时,我的训练集中没有新级别,因此我收到此错误?
这是一个有监督的学习问题,我无法更改测试集并将数据移动到训练集。所以这不是抽样问题。
无论如何,有没有人知道任何设置或快速修复,以免这会导致我的程序崩溃?
答案 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")
可能有其他方法可以做到这一点,但它确实有效。