下面是一段代码,它生成了一个简单的xgboost模型来显示我所看到的问题。一旦建立了模型,我们就使用该模型进行预测,并获取数据中的第二行。如果我们取第10和第9模型预测之间的相对差异的对数,它应该给出第10棵树的预测:在本例中为0.00873184。
现在,如果我们使用树的输入(矩阵"a“,第2行的值为0.1234561702 )并运行模型,我们预计预测结果为0.0121501638。然而,看起来在第二次拆分(<0.123456173)之后,它走错了方向,最终到达了节点0.00873187464 -非常接近我们的预期!
有人知道这是怎么回事吗?
版本:
R: 4.1.0
xgboost: 1.4.1.1
dplyr: 1.0.7
data.table: 1.14.0
library(xgboost)
library(dplyr)
library(data.table)
set.seed(2)
a <- matrix(runif(1000,0.1234561,0.1234562),
ncol=1,nrow=1000)
colnames(a) <- c("b")
d <- abs(rnorm(1000,3*a[,1]))
d2 <- xgb.DMatrix(data = a,label = d)
e <- xgboost::xgboost(data=d2,nrounds=10,method="hist",objective="reg:gamma")
xgb.plot.tree(e$feature_names,e,trees=9)
x <- 2
log((predict(e,a,ntreelimit = 10)/predict(e,a,ntreelimit = 9)))[x]
format(a[x,],nsmall=10)发布于 2021-10-13 12:00:37
对于任何对答案感兴趣的人,xgboost团队在这里提供了它:
https://github.com/dmlc/xgboost/issues/7294
简而言之,xgboost在训练前将输入数据转换为float32,而R默认使用double。因此,应该做的是在运行模型之前将0.1234561702转换为float32。这样做会得到值0.123456173,它现在选择了正确的路径。
https://stackoverflow.com/questions/69408395
复制相似问题