Как интерпретировать вывод значения XGBoost?

37

Я запустил модель xgboost. Я точно не знаю, как интерпретировать вывод xgb.importance.

В чем смысл усиления, покрытия и частоты и как мы их интерпретируем?

Кроме того, что означает Split, RealCover и RealCover%? У меня есть некоторые дополнительные параметры здесь

Есть ли другие параметры, которые могут рассказать мне больше о важности функций?

Из документации R я понимаю, что усиление - это что-то похожее на получение информации, а частота - это количество раз, когда функция используется во всех деревьях. Понятия не имею, что такое Cover.

Я запустил приведенный в ссылке пример кода (а также попытался сделать то же самое для проблемы, над которой я работаю), но приведенное там определение разделения не совпадало с вычисленными мною числами.

importance_matrix

Выход:

           Feature         Gain        Cover    Frequence
  1:            xxx 2.276101e-01 0.0618490331 1.913283e-02
  2:           xxxx 2.047495e-01 0.1337406946 1.373710e-01
  3:           xxxx 1.239551e-01 0.1032614896 1.319798e-01
  4:           xxxx 6.269780e-02 0.0431682707 1.098646e-01
  5:          xxxxx 6.004842e-02 0.0305611830 1.709108e-02

214:     xxxxxxxxxx 4.599139e-06 0.0001551098 1.147052e-05
215:     xxxxxxxxxx 4.500927e-06 0.0001665320 1.147052e-05
216:   xxxxxxxxxxxx 3.899363e-06 0.0001536857 1.147052e-05
217: xxxxxxxxxxxxxx 3.619348e-06 0.0001808504 1.147052e-05
218:  xxxxxxxxxxxxx 3.429679e-06 0.0001792233 1.147052e-05
Итан
источник

Ответы:

40

Исходя из вашего вопроса, я предполагаю, что вы используете xgboost для подгонки расширенных деревьев для двоичной классификации. Матрица важности на самом деле представляет собой объект data.table с первым столбцом, в котором перечислены имена всех функций, фактически используемых в повышенных деревьях.

Значение таблицы данных важности следующее:

  1. Gain предполагает относительный вклад соответствующей функции в модель , рассчитанной путем принятия вклада каждой особенности для каждого дерева в модели. Более высокое значение этого показателя по сравнению с другим признаком означает, что он важнее для создания прогноза.
  2. Показатель покрытия означает относительное количество наблюдений, связанных с этой функцией. Например, если у вас есть 100 наблюдений, 4 объекта и 3 дерева, и предположим, что feature1 используется для выбора конечного узла для 10, 5 и 2 наблюдений в tree1, tree2 и tree3 соответственно; тогда метрика будет охватывать покрытие для этой функции как 10 + 5 + 2 = 17 наблюдений. Это будет рассчитано для всех 4 функций, и покрытие будет выражено в процентах для всех показателей покрытия.
  3. Частоты (/ «Frequence») представляет собой процент , представляющий относительное число раз конкретный признак происходит в деревьях модели. В приведенном выше примере, если feature1 произошел в 2 раскола, 1 раскол и 3 раскола в каждом из tree1, tree2 и tree3; тогда вес для признака 1 будет равен 2 + 1 + 3 = 6. Частота для признака 1 рассчитывается как его процентный вес по отношению к весам всех признаков.

Усиление является наиболее важным атрибутом для интерпретации относительной важности каждой функции.

Все меры относительны и, следовательно, все суммируют до одного, пример из подобранной модели xgboost в R:

> sum(importance$Frequence)
[1] 1
> sum(importance$Cover)
[1] 1
> sum(importance$Gain)
[1] 1
Сандип С. Сандху
источник
1
Покрытие рассчитывается только на основе листовых узлов или всех расщеплений?
fanfabbb
3

Спасибо Сандип за ваш подробный ответ. Я хотел бы исправить это покрытие рассчитывается по всем расщеплениям, а не только листовые узлы.

Давайте рассмотрим простой пример с данными, предоставленными библиотекой xgboost.

library('xgboost')

data(agaricus.train, package='xgboost')
data(agaricus.test, package='xgboost')

train <- agaricus.train
test <- agaricus.test

X = train$data

y = train$label

bst <- xgboost(data = X, label = y, max.depth = 2,
           eta = 1, nthread = 2, nround = 2,objective = "binary:logistic",
           reg_lambda = 0, reg_alpha = 0)

xgb.model.dt.tree(agaricus.train$data@Dimnames[[2]], model = bst)

xgb.importance(agaricus.train$data@Dimnames[[2]], bst)

Выход -

Свалка деревьев

Матрица важности

Давайте попробуем вычислить покрытие запахов = нет в матрице важности (0,495768965) из дампа дерева.

Покрытие каждого разделения, где используется запах = не используется, составляет 1628,2500 для идентификатора узла 0-0 и 765,9390 для идентификатора узла 1-1.

Общее покрытие всех разбиений (суммирование по столбцу покрытия в дампе дерева) = 1628.2500 * 2 + 786.3720 * 2

Покрытие запаха = нет в матрице важности = (1628.2500 + 765.9390) / (1628.2500 * 2 + 786.3720 * 2)

Следовательно, мы уверены, что покрытие рассчитывается по всем расколам!

Натеш Аруначалам
источник