【问题标题】:Object p not found when running gbm()运行 gbm() 时找不到对象 p
【发布时间】:2020-06-03 21:25:15
【问题描述】:

我知道GBM: Object 'p' not found的问题;但是它没有包含足够的信息来让堆栈回答。我不相信这是重复的,因为我遵循了这个问题中指出的内容和链接的重复Error in R gbm function when cv.folds > 0,它没有描述相同的错误。

我已确保遵循删除模型中未使用的任何列的建议。

cv.folds 大于 0 时出现此错误: object 'p' not found

据我所见,将cv.folds 设置为 0 不会产生有意义的输出。我尝试了不同的分布、分数、树等。我确信我已经错误地参数化了某些东西,但我不能一辈子我看看它是什么。

模型和输出:

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 的建议,它太小了,下面的建议将通过初始错误。后续错误正在发生,解决方案将在发现后在此处发布。

【问题讨论】:

  • 您的数据中没有零个数。 ign 列中只有 1....请看,100 条记录 ign 列的所有值都为 1
  • 嗯,我从没见过 gbm 出现这种错误。你介意以某种方式共享数据吗?我尝试使用您的示例,并将 ign 列随机化为 0,1s 并且运行正常。
  • PKumar 和 StupidWolf,感谢您的输入,我已经更新了数据以包含一些真正的 0,它现在是一个平衡的数据集,在此道歉。 StupidWolf,我很好奇你最终是如何让它运行的。我已经确保我现在有 0,但我仍然遇到错误。
  • 我想知道您是否需要缩放预测变量。你有一个非常小的。
  • @Badger,你需要设置 cv.folds > 1 。解释见下文

标签: r gbm


【解决方案1】:

这并不是要处理有人设置 cv.folds = 1 的情况。根据定义,k fold 意味着将数据分成 k 部分,在一部分上进行训练,在另一部分上进行测试。所以我不太确定是什么是 1 折交叉验证,如果您查看 code for 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)

【讨论】:

  • 我自己也在进行同样的调查,查看子程序,看看我在哪里遇到了问题。谢谢你的澄清。我有一个新问题,我的系统似乎不喜欢集群的设置方式,它正在使 R 崩溃,但这是一个不同的问题。再次感谢您!
  • 酷,不客气 :) 应该早点弄清楚。您正在使用 gbm,并行,有不少内核?许多线程可能会非常不稳定..
  • 奇怪的是,不,只声明了一个内核。有趣的是,您的示例没有问题。我要冒昧地说我的数据集中有一些问题,当我梳理出来时,我会回到这里来帮助后续用户!
  • 我自己的愚蠢已经占了上风。我在系统中有一个阶乘响应,GBM 显然不太喜欢它,所以它只是让整个事情崩溃而不是警告问题。
  • cool :) 很高兴它最终对你有用。当我第一次使用它时,我有时会犯这个错误。也许使用 xgboost 也有帮助,这需要这种伯努利响应,因此我已经习惯了..
猜你喜欢
  • 2019-04-14
  • 2016-05-06
  • 1970-01-01
  • 2021-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-20
相关资源
最近更新 更多