Ответ 1
просто догадка, так как я не могу видеть ваши данные, но я считаю, что ошибка возникает, когда у вас есть уровни переменных, которые существуют в наборе тестов, которых нет в учебном наборе.
это может легко произойти, если у вас есть фактор-переменная с большим количеством уровней, или один уровень имеет небольшое количество экземпляров.
так как вы используете сгибы CV, возможно, что удержание, установленное на одном из циклов, имеет данные о тренировках на иностранных уровнях.
Я бы предложил либо:
A) используйте model.matrix() для однострочного кодирования ваших факторных переменных
B) продолжайте устанавливать разные семена, пока не получите разделение CV, которое не имеет этой ошибки.
РЕДАКТИРОВАТЬ: yep, с этой трассировкой, ваш 3-й аутсорсинг CV имеет уровень фактора в его тестовом наборе, который не существует в обучении. поэтому функция прогнозирования видит чужое значение и не знает, что делать.
РЕДАКТИРОВАТЬ 2: Вот краткий пример, чтобы показать, что я подразумеваю под "уровнями факторов не в тестовом наборе"
#Example data with low occurrences of a factor level:
set.seed(222)
data = data.frame(cbind( y = sample(0:1, 10, replace = TRUE), x1 = rnorm(10), x2 = as.factor(sample(0:10, 10, replace = TRUE))))
data$x2 = as.factor(data$x2)
data
y x1 x2
[1,] 1 -0.2468959 2
[2,] 0 -1.2155609 6
[3,] 0 1.5614051 1
[4,] 0 0.4273102 5
[5,] 1 -1.2010235 5
[6,] 1 1.0524585 8
[7,] 0 -1.3050636 6
[8,] 0 -0.6926076 4
[9,] 1 0.6026489 3
[10,] 0 -0.1977531 7
#CV fold. This splits a model to be trained on 80% of the data, then tests against the remaining 20%. This is a simpler version of what happens when you call gbm CV fold.
CV_train_rows = sample(1:10, 8, replace = FALSE) ; CV_test_rows = setdiff(1:10, CV_train_rows)
CV_train = data[CV_train_rows,] ; CV_test = data[CV_test_rows,]
#build a model on the training...
CV_model = lm(y ~ ., data = CV_train)
summary(CV_model)
#note here: as the model has been built, it was only fed factor levels (3, 4, 5, 6, 7, 8) for variable x2
CV_test$x2
#in the test set, there are only levels 1 and 2.
#attempt to predict on the test set
predict(CV_model, CV_test)
Error in model.frame.default(Terms, newdata, na.action = na.action, xlev = object$xlevels) :
factor x2 has new levels 1, 2