分类伯努利分布中的GBM错误

时间:2020-04-25 13:25:33

标签: r gbm

在运行gbm函数以解决分类问题时。我收到以下错误:

res [flag,]中的错误<-预测:替换的长度为零

我想知道为什么会出现此错误以及如何解决。

我的数据是大约77个用于分类的数字变量(整数)和1个分组因子。数据中没有其他变量。数据中没有丢失的数据。根据需要将分组因子编码为因子(0,1)。

我的数据结构看起来像这样:

$Group : Factor w/ 2 levels "0", "1"
$it1 : int
...
$it70 : int

我的模型如下:

mod_gbm <- gbm(Group~. distribution = "bernoulli", data=df,
               n.trees=1000,shrinkage=.01, n.minobsinnode=5, 
               interaction.depth = 6, cv.folds=5) 

我意识到这个问题与这里的问题非常相似: Problems in using GBM function to do classification in R 但是那个人想知道使用数字变量,唯一的反应就是删除cv.folds。我想将cv.folds保留在我的模型中并使其运行。

1 个答案:

答案 0 :(得分:0)

如果您查看gbm的小插曲:

distribution: Either a character string specifying the name of the
          distribution to use or a list with a component ‘name’
          specifying the distribution and any additional parameters
          needed. If not specified, ‘gbm’ will try to guess: if the
          response has only 2 unique values, bernoulli is assumed;
          otherwise, if the response is a factor, multinomial is
          assumed

如果只有两个类,则无需将其转换为因子。我们可以用鸢尾花示例来探索它,在这里我创建一个组标签0/1:

library(gbm)
df = iris
df$Group = factor(as.numeric(df$Species=="versicolor"))
df$Species = NULL
 
mod_gbm <- gbm(Group~.,distribution ="bernoulli", data=df,cv.folds=5)
Error in res[flag, ] <- predictions : replacement has length zero

我得到同样的错误。因此我们将其转换为数字0/1,您可以看到它正常工作。

当变量是一个因子时,执行as.numeric()会将其转换为1,2,其中1对应于第一级。因此,在这种情况下,由于Group为0/1开头:

df$Group = as.numeric(df$Group)-1
mod_gbm <- gbm(Group~.,distribution ="bernoulli", data=df,cv.folds=5)

我们得到了预测:

pred = ifelse(predict(mod_gbm,type="response")>0.5,1,0)
table(pred,df$Group)

    
pred  0  1
   0 98  3
   1  2 47