【问题标题】:How is xgboost quality calculated?如何计算 xgboost 质量?
【发布时间】:2016-02-12 18:37:31
【问题描述】:

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

在文档中它说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

我了解Gain 由以下公式给出:

由于我们使用对数损失,G 是 p-y 的总和,H 是 p(1-p) 的总和 - 在本例中,gamma 和 lambda 均为零。

谁能指出我哪里出错了?

【问题讨论】:

    标签: r xgboost


    【解决方案1】:

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

    此外,在计算增益时似乎没有应用一半的因子,因此“质量”列是您预期的两倍。最后,我也不认为gamma(也称为min_split_loss)适用于这个计算(来自update_hitmaker-inl.hpp)

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

    如果您应用这些更改,您确实会得到 4000.53 作为树 0 的节点 0 的 Quality,就像在原始问题中一样。我会将这个问题作为 xgboost 人员的问题提出,因此可以相应地更改文档。

    【讨论】:

    • 伙计,这一直困扰着我。我会努力解决它,但我印象深刻。你应该看看这个问题,因为你似乎正在学习 xgboost 里面哎呀..困扰了我一段时间..stackoverflow.com/questions/32950607/…
    • 我可以看到没有应用 1/2 因子,但应该查看源代码中的默认值。干得好!
    猜你喜欢
    • 2012-04-06
    • 2022-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多