Объект p не найден при запуске gbm () - PullRequest
1 голос
/ 19 февраля 2020

Мне известен вопрос GBM: объект 'p' не найден ; однако он не содержал достаточной информации, чтобы стек мог ответить. Я не верю, что это дубликат, поскольку я следовал тому, что было указано в этом вопросе, и связанному дубликату Ошибка в функции R gbm, когда cv.folds> 0 , которая не описывает ту же ошибку.

Я был уверен, что выполнил рекомендацию об исключении любых столбцов, которые не использовались в модели.

Эта ошибка появляется, когда cv.folds больше 0: object 'p' not found

Из того, что я вижу, установка cv.folds в 0 не дает значимых выходных данных. Я пробовал разные распределения, дроби, деревья и т. Д. c. Я уверен, что неправильно что-то параметризовал, но не могу на всю жизнь понять, что это такое.

Модель и выходные данные:

model_output <- gbm(formula = ign ~ . , 
                  distribution = "bernoulli",
                  var.monotone = rep(0,9),
                  data = model_sample,
                  train.fraction = 0.50,
                  n.cores = 1,
                  n.trees = 150,
                  cv.folds = 1,
                  keep.data = T,
                  verbose=T)
Iter   TrainDeviance   ValidDeviance   StepSize   Improve
     1           nan             nan     0.1000       nan
     2           nan             nan     0.1000       nan
     3           nan             nan     0.1000       nan
     4           nan             nan     0.1000       nan
     5           nan             nan     0.1000       nan
     6           nan             nan     0.1000       nan
     7           nan             nan     0.1000       nan
     8           nan             nan     0.1000       nan
     9           nan             nan     0.1000       nan
    10           nan             nan     0.1000       nan
    20           nan             nan     0.1000       nan
    40           nan             nan     0.1000       nan
    60           nan             nan     0.1000       nan
    80           nan             nan     0.1000       nan
   100           nan             nan     0.1000       nan
   120           nan             nan     0.1000       nan
   140           nan             nan     0.1000       nan
   150           nan             nan     0.1000       nan

Использовано минимальное количество данных для генерации ошибки чтобы быть здесь, однако, как только предложение @StupidWolf будет использовано, оно будет слишком маленьким, приведенное ниже предложение пропустит первоначальную ошибку. Последующие ошибки происходят, и решения будут опубликованы здесь после обнаружения.

1 Ответ

1 голос
/ 20 февраля 2020

Это не предназначено для решения ситуации, когда кто-то устанавливает 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)
...