为什么 gbm() 在这个最小示例中给出的结果与 h2o.gbm() 不同?
Why does gbm() give different results than h2o.gbm() in this minimal example?
修补梯度提升,我注意到 R 的 gbm
包在最小示例中产生的结果与 h2o
不同。为什么?
数据
library(gbm)
library(h2o)
h2o.init()
train <- data.frame(
X1 = factor(c("A", "A", "A", "B", "B")),
X2 = factor(c("A", "A", "B", "B", "B")),
Y = c(0, 1, 3, 4, 7)
)
X1 X2 Y
1 A A 0
2 A A 1
3 A B 3
4 B B 4
5 B B 7
gbm
# (gbm, 1 round, mae)
model.gbm <- gbm(
Y ~ X1 + X2, data = train, distribution="laplace", n.tree = 1, shrinkage = 1, n.minobsinnode=1, bag.fraction=1,
interaction.depth = 1, verbose=TRUE
)
train$Pred.mae.gbm1 <- predict(model.gbm, newdata=train, n.trees=model.gbm$n.trees)
h2o
# (h2o, 1 round, mae)
model.h2o <- h2o.gbm(
x=c("X1", "X2"), y="Y", training_frame=as.h2o(train), distribution="laplace", ntrees=1, max_depth=1,
learn_rate = 1, min_rows=1
)
train$Pred.mae.h2o1 <- as.data.frame(h2o.predict(model.h2o, as.h2o(train)))$predict
结果
train
X1 X2 Y Pred.mae.gbm1 Pred.mae.h2o1
1 A A 0 1.0 0.5
2 A A 1 1.0 0.5
3 A B 3 1.0 4.0
4 B B 4 5.5 4.0
5 B B 7 5.5 4.0
它们是完全独立的实现,我怀疑是否已经根据您使用它的方式进行了调整或设计(即单个树,min_rows
设置为 1)。在这种情况下,看起来 R 的 gbm 已经使用它的单一树来正确学习 "B" 输入,而 h2o.gbm
专注于 "A" 输入。
当您开始使用真实数据和真实设置时,可能仍然存在差异。有很多参数您没有触及(至少 h2o.gbm()
,这是我熟悉的参数)。还有一个随机因素:尝试从 seed
到 h2o.gbm() 的一百个值,以及 R 的 gbm
之前的常数 set.seed()
,你很可能会命中相同的值至少其中之一的结果。
修补梯度提升,我注意到 R 的 gbm
包在最小示例中产生的结果与 h2o
不同。为什么?
数据
library(gbm)
library(h2o)
h2o.init()
train <- data.frame(
X1 = factor(c("A", "A", "A", "B", "B")),
X2 = factor(c("A", "A", "B", "B", "B")),
Y = c(0, 1, 3, 4, 7)
)
X1 X2 Y
1 A A 0
2 A A 1
3 A B 3
4 B B 4
5 B B 7
gbm
# (gbm, 1 round, mae)
model.gbm <- gbm(
Y ~ X1 + X2, data = train, distribution="laplace", n.tree = 1, shrinkage = 1, n.minobsinnode=1, bag.fraction=1,
interaction.depth = 1, verbose=TRUE
)
train$Pred.mae.gbm1 <- predict(model.gbm, newdata=train, n.trees=model.gbm$n.trees)
h2o
# (h2o, 1 round, mae)
model.h2o <- h2o.gbm(
x=c("X1", "X2"), y="Y", training_frame=as.h2o(train), distribution="laplace", ntrees=1, max_depth=1,
learn_rate = 1, min_rows=1
)
train$Pred.mae.h2o1 <- as.data.frame(h2o.predict(model.h2o, as.h2o(train)))$predict
结果
train
X1 X2 Y Pred.mae.gbm1 Pred.mae.h2o1
1 A A 0 1.0 0.5
2 A A 1 1.0 0.5
3 A B 3 1.0 4.0
4 B B 4 5.5 4.0
5 B B 7 5.5 4.0
它们是完全独立的实现,我怀疑是否已经根据您使用它的方式进行了调整或设计(即单个树,min_rows
设置为 1)。在这种情况下,看起来 R 的 gbm 已经使用它的单一树来正确学习 "B" 输入,而 h2o.gbm
专注于 "A" 输入。
当您开始使用真实数据和真实设置时,可能仍然存在差异。有很多参数您没有触及(至少 h2o.gbm()
,这是我熟悉的参数)。还有一个随机因素:尝试从 seed
到 h2o.gbm() 的一百个值,以及 R 的 gbm
之前的常数 set.seed()
,你很可能会命中相同的值至少其中之一的结果。