首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R中的xgboost提供意外的预测

R中的xgboost提供意外的预测
EN

Stack Overflow用户
提问于 2021-10-01 15:26:53
回答 1查看 67关注 0票数 0

下面是一段代码,它生成了一个简单的xgboost模型来显示我所看到的问题。一旦建立了模型,我们就使用该模型进行预测,并获取数据中的第二行。如果我们取第10和第9模型预测之间的相对差异的对数,它应该给出第10棵树的预测:在本例中为0.00873184。

现在,如果我们使用树的输入(矩阵"a“,第2行的值为0.1234561702 )并运行模型,我们预计预测结果为0.0121501638。然而,看起来在第二次拆分(<0.123456173)之后,它走错了方向,最终到达了节点0.00873187464 -非常接近我们的预期!

有人知道这是怎么回事吗?

10th Tree

版本:

R: 4.1.0

xgboost: 1.4.1.1

dplyr: 1.0.7

data.table: 1.14.0

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

发布于 2021-10-13 12:00:37

对于任何对答案感兴趣的人,xgboost团队在这里提供了它:

https://github.com/dmlc/xgboost/issues/7294

简而言之,xgboost在训练前将输入数据转换为float32,而R默认使用double。因此,应该做的是在运行模型之前将0.1234561702转换为float32。这样做会得到值0.123456173,它现在选择了正确的路径。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69408395

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档