有人可以解释如何Quality在xgb.model.dt.tree函数中计算xgboost R包中的列吗?
在文档中,它说Quality"是与此特定节点中的拆分相关的增益".
当您运行以下代码时,在此函数的xgboost文档中给出,Quality对于树0的节点0是4000.53,但我计算Gain 为2002.848
data(agaricus.train, package='xgboost')
train <- agarics.train
X = train$data
y = train$label
bst <- xgboost(data = train$data, label = train$label, max.depth = 2,
eta = 1, nthread = 2, nround = 2,objective = "binary:logistic")
xgb.model.dt.tree(agaricus.train$data@Dimnames[[2]], model = bst)
p = rep(0.5,nrow(X))
L = which(X[,'odor=none']==0)
R = which(X[,'odor=none']==1)
pL = p[L]
pR = p[R]
yL = y[L]
yR = y[R]
GL = sum(pL-yL)
GR = sum(pR-yR)
G = sum(p-y)
HL = sum(pL*(1-pL))
HR = sum(pR*(1-pR))
H = sum(p*(1-p))
gain = 0.5 * (GL^2/HL+GR^2/HR-G^2/H)
gain
Run Code Online (Sandbox Code Playgroud)
我理解这Gain是由以下公式给出的:

由于我们使用对数丢失,因此G是和的总和,p-y而H是和的总和p(1-p)- 在这种情况下,λ和λ都是零.
任何人都可以确定我哪里错了吗?
谢谢
好的,我想我已经解决了.reg_lambda默认情况下,值不是0,如文档中所示,但实际上是1(来自param.h)
此外,在计算增益时,似乎没有应用半因子,因此质量列是您所期望的两倍.最后,我也认为gamma(也称为min_split_loss)也不适用于此计算(来自update_hitmaker-inl.hpp)
相反,gamma用于确定是否调用修剪,但不会在文档建议的增益计算本身中反映出来.
如果应用这些更改,确实会获得4000.53作为Quality树0的节点0,就像在原始问题中一样.我将此问题提交给xgboost人员,因此可以相应地更改文档.