请问有人可以解释一下xgboost R包中xgb.model.dt.tree
函数中的Quality
列是如何计算的吗?根据文档,Quality
是“与此特定节点拆分相关的增益”。
当你运行以下代码时(该代码在xgboost文档中提供),树0的节点0的Quality
为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
我了解到增益
是由以下公式给出的:
由于我们使用对数损失,因此G是p-y
的总和,H是p(1-p)
的总和 - 在这种情况下,gamma和lambda都为零。
有人能找出我哪里错了吗?
p
是一个由0.5组成的向量,并且为什么要将其与 Y 进行比较吗?这是对 Y 的初始、不知情的猜测吗? - Lil' Pete