Как рассчитывается качество xgboost?

Может ли кто-нибудь объяснить, как вычисляется столбец Quality в пакете xgboost R в функции xgb.model.dt.tree?

В документации говорится, что Quality "- это коэффициент усиления, связанный с разделом в этом конкретном node".

Когда вы запускаете следующий код, указанный в документации xgboost для этой функции, Quality для node 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([email protected][[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) - гамма и лямбда в этом случае равны нулю.

Может ли кто-нибудь определить, где я ошибаюсь?

Спасибо

Ответ 1

Хорошо, я думаю, что я это проработал. Значение reg_lambda по умолчанию не равно 0, как указано в документации, но на самом деле 1 (из param.h)

введите описание изображения здесь

Кроме того, похоже, что при вычислении коэффициента усиления коэффициент половины не применяется, поэтому столбец "Качество" удваивается, что вы ожидаете. Наконец, я также не думаю, что gamma (также называемый min_split_loss) применяется к этому вычислению либо (из update_hitmaker-inl.hpp)

введите описание изображения здесь

Вместо этого гамма используется для определения того, следует ли вызывать обрезку, но не отражается в самом вычислении коэффициента усиления, как предполагает документация.

введите описание изображения здесь

Если вы примените эти изменения, вы действительно получите 4000.53 в качестве Quality для node 0 дерева 0, как в исходном вопросе. Я объясню это как проблему для ребят xgboost, поэтому документация может быть соответствующим образом изменена.