如何计算xgboost质量?

时间:2015-11-11 15:54:34

标签: r xgboost

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

在文档中,它说Quality“是与此特定节点中的分割相关的增益”。

当您运行以下代码时,在此函数的xgboost文档中给出,{0}树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由以下公式给出:

gain formula

由于我们使用的是对数丢失,G是p-y之和,H是p(1-p)的总和 - 在这种情况下,gamma和lambda都是零。

任何人都可以确定我哪里出错吗?

由于

1 个答案:

答案 0 :(得分:8)

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

enter image description here

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

enter image description here

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

enter image description here

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