【问题标题】:xgboost in R providing unexpected predictionR 中的 xgboost 提供了意想不到的预测
【发布时间】:2021-10-01 15:26:53
【问题描述】:

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

现在,如果我们使用树的输入(矩阵“a”,第 2 行的值为 0.1234561702)并运行模型,我们预计预测值为 0.0121501638。但是,看起来在第二次拆分 (

有人知道发生了什么吗?

10th Tree

版本:
R:4.1.0
xgboost:1.4.1.1
dplyr:1.0.7
数据表: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)

【问题讨论】:

    标签: r tree prediction xgboost


    【解决方案1】:

    对于任何对答案感兴趣的人,xgboost 团队在此处提供:

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

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

    【讨论】:

    • 欢迎提供解决方案的链接,但请确保您的答案在没有它的情况下有用:add context around the link 这样您的其他用户就会知道它是什么以及为什么存在,然后引用最多如果目标页面不可用,您链接到的页面的相关部分。
    • 道歉 - 我添加了一个简短的描述,总结了链接中的重要细节(并回答了问题)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-21
    • 1970-01-01
    • 1970-01-01
    • 2018-11-05
    • 2013-02-16
    相关资源
    最近更新 更多