R xgboost质量是如何计算的?

R xgboost质量是如何计算的?,r,xgboost,R,Xgboost,有人能解释一下在xgb.model.dt.tree函数中如何计算xgboost R包中的Quality列吗 在文档中指出,质量“是与此特定节点中的拆分相关的增益” 当您运行以下代码时(在xgboost文档中为该函数提供),树0的节点0的质量为4000.53,但我将增益计算为2002.848 data(agaricus.train, package='xgboost') train <- agarics.train X = train$data y = train$label bst

有人能解释一下在
xgb.model.dt.tree
函数中如何计算xgboost R包中的
Quality
列吗

在文档中指出,
质量
“是与此特定节点中的拆分相关的增益”

当您运行以下代码时(在xgboost文档中为该函数提供),树0的节点0的
质量
为4000.53,但我将
增益
计算为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
数据(agaricus.train,package='xgboost')

好的,我想我已经解决了。
reg_lambda
的值在默认情况下不是文档中给出的0,而是实际为1(来自param.h)

此外,在计算增益时,似乎没有应用半因子,因此质量列是预期的两倍。最后,我也不认为
gamma
(也称为
min\u split\u loss
)也适用于此计算(来自更新的hitmaker-inl.hpp)

相反,gamma用于确定是否调用修剪,但正如文档所示,它不会反映在增益计算本身中


如果应用这些更改,确实会得到4000.53作为树0的节点0的
质量
,如原始问题所示。我会将此作为一个问题向xgboost人员提出,以便文档可以相应地更改。

伙计,这一直困扰着我。。我会努力完成的,但我印象深刻。。您应该看看这个问题,因为您似乎正在从oout中学习xgboost。。这让我烦恼了一段时间。我可以看出1/2因子没有被应用,但应该看看源代码中的默认值。干得好!