Это не предназначено для решения ситуации, когда кто-то устанавливает cv.folds = 1. По определению, k fold означает разбиение данных на k частей, обучение на 1 части и тестирование на другой .. Так что я не совсем уверен, что 1-кратная перекрестная проверка, и если вы посмотрите на код для gbm , в строке 437
if(cv.folds > 1) {
cv.results <- gbmCrossVal(cv.folds = cv.folds, nTrain = nTrain,
....
p <- cv.results$predictions
}
Он делает прогнозы, а когда он собирает результаты в gbm, строка 471 :
if (cv.folds > 0) {
gbm.obj$cv.fitted <- p
}
Таким образом, если cv.folds == 1, p не рассчитывается, но> 0, следовательно вы получаете ошибку.
Ниже приведен воспроизводимый пример:
library(MASS)
test = Pima.tr
test$type = as.numeric(test$type)-1
model_output <- gbm(type~ . ,
distribution = "bernoulli",
var.monotone = rep(0,7),
data = test,
train.fraction = 0.5,
n.cores = 1,
n.trees = 30,
cv.folds = 1,
keep.data = TRUE,
verbose=TRUE)
выдает ошибку object 'p' not found
Установите значение cv.folds = 2, и оно будет работать гладко ....
model_output <- gbm(type~ . ,
distribution = "bernoulli",
var.monotone = rep(0,7),
data = test,
train.fraction = 0.5,
n.cores = 1,
n.trees = 30,
cv.folds = 2,
keep.data = TRUE,
verbose=TRUE)