【问题标题】:R gbm.more() function doesn't work for all distributions?R gbm.more() 函数不适用于所有发行版?
【发布时间】:2014-08-05 16:45:19
【问题描述】:

我正在尝试在 R 中使用 gbm.more 函数。为了清楚起见,我使用了规范的虹膜数据。当我指定分布=“多项式”时,下面的代码不起作用,但是当我指定分布=“高斯”时,代码起作用。这是有原因的还是只是功能的问题?

data(iris)
iris.mod=gbm(Species ~ ., distribution="multinomial", data=iris,
            n.trees=200, shrinkage=0.01, verbose=FALSE, n.cores=1)
iris.mod1=gbm.more(iris.mod,100,verbose=FALSE)

【问题讨论】:

  • 具体来说,输出以下错误: gbm.more(iris.mod, 100, verbose = FALSE) 中的错误:观察不按顺序。 gbm() 无法为设计矩阵建立索引。可能是 gbm 中的错误或 data 中的异常数据类型。
  • 我的问题是不是太具体了,还是我发错地方了?

标签: r gbm


【解决方案1】:

我想说gbm 中有一个错误。如果您查看gbm.fit 函数,他们会在将多项数据发送到底层“gbm”C 函数之前对多项数据进行一系列转换。这些转换在返回结果之前“撤消”,并且不会在 gbm.more 函数中再次完成。

这样一种转换是确保数据中的第一个n 值与y 变量的每个n 因子水平中的一个相关联。一种解决方法是在首先调用gbm 之前确保您的数据采用格式。以下是我们将如何转换虹膜数据。

first.row <- tapply(1:nrow(miris), iris$Species, head,1)
miris <- rbind(miris[first.row,], miris[-first.row,])

我们看到前三行对数据中的每个不同物种都有一个值

#head(miris)
    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
1            5.1         3.5          1.4         0.2     setosa
51           7.0         3.2          4.7         1.4 versicolor
101          6.3         3.3          6.0         2.5  virginica
2            4.9         3.0          1.4         0.2     setosa
3            4.7         3.2          1.3         0.2     setosa
4            4.6         3.1          1.5         0.2     setosa

然后您可以使用

拟合您的数据
iris.mod=gbm(Species ~ ., distribution="multinomial", data=miris,
    n.trees=200, shrinkage=0.01, verbose=FALSE, n.cores=1)

然后运行

iris.mod1=gbm.more(iris.mod,100,verbose=FALSE)

没有错误。

我建议您向软件包维护者提交错误报告。这个问题似乎特定于“多项式”分布。随意包含此问题的链接。

【讨论】:

  • 太好了,这似乎解决了我的问题!非常感谢!我已经通过电子邮件向软件包维护者发送了有关可能存在的错误的信息。
  • hmmm 实际上这似乎并没有完全解决问题。如果我运行 iris.mod=gbm() 并检查树的数量,我正确地得到了 iris.mod$n.trees=200。但是,在我使用 gbm.more() iris.mode$n.trees =900 而不是 300 之后。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多