Como interpretar a saída de importância XGBoost?

37

Eu executei um modelo xgboost. Eu não sei exatamente como interpretar a saída de xgb.importance.

Qual é o significado de ganho, cobertura e frequência e como os interpretamos?

Além disso, o que significa% Split, RealCover e RealCover? Eu tenho alguns parâmetros extras aqui

Existem outros parâmetros que podem me dizer mais sobre as importâncias de recursos?

Na documentação do R, entendo que o ganho é algo semelhante ao ganho de informações e a frequência é o número de vezes que um recurso é usado em todas as árvores. Não faço ideia do que é a capa.

Eu executei o código de exemplo fornecido no link (e também tentei fazer o mesmo no problema em que estou trabalhando), mas a definição de divisão fornecida lá não correspondia aos números que calculei.

importance_matrix

Saída:

           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
Ethan
fonte

Respostas:

40

Da sua pergunta, suponho que você esteja usando o xgboost para ajustar árvores otimizadas para classificação binária. A matriz de importância é na verdade um objeto data.table com a primeira coluna listando os nomes de todos os recursos realmente usados ​​nas árvores aumentadas.

O significado da tabela de dados de importância é o seguinte:

  1. O ganho implica a contribuição relativa do recurso correspondente ao modelo calculado, considerando a contribuição de cada recurso para cada árvore no modelo. Um valor mais alto dessa métrica quando comparado a outro recurso implica que é mais importante para gerar uma previsão.
  2. A métrica de capa significa o número relativo de observações relacionadas a esse recurso. Por exemplo, se você tiver 100 observações, 4 recursos e 3 árvores, e suponha que o recurso1 seja usado para decidir o nó da folha para 10, 5 e 2 observações em árvore1, árvore2 e árvore3, respectivamente; a métrica contará a cobertura para esse recurso como 10 + 5 + 2 = 17 observações. Isso será calculado para todos os quatro recursos e a cobertura será 17 expressa como uma porcentagem para todas as métricas de cobertura dos recursos.
  3. A Frequência (/ 'Frequência') é a porcentagem que representa o número relativo de vezes que um determinado recurso ocorre nas árvores do modelo. No exemplo acima, se o recurso1 ocorreu em 2 divisões, 1 divisão e 3 divisões em cada uma das árvores1, árvore2 e árvore3; então a ponderação para o recurso1 será 2 + 1 + 3 = 6. A frequência do recurso1 é calculada como sua porcentagem de peso sobre os pesos de todos os recursos.

O ganho é o atributo mais relevante para interpretar a importância relativa de cada recurso.

As medidas são todas relativas e, portanto, somam uma, um exemplo de um modelo xgboost ajustado em R é:

> sum(importance$Frequence)
[1] 1
> sum(importance$Cover)
[1] 1
> sum(importance$Gain)
[1] 1
Sandeep S. Sandhu
fonte
11
A cobertura é calculada apenas com base nos nós das folhas ou em todas as divisões?
FanFbbb
3

Obrigado Sandeep pela sua resposta detalhada. Gostaria de corrigir que a cobertura é calculada em todas as divisões e não apenas nos nós das folhas.

Vamos seguir um exemplo simples com os dados fornecidos pela biblioteca 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)

Saída -

Despejo de árvore

Matriz de importância

Vamos tentar calcular a cobertura do odor = none na matriz de importância (0,495768965) do despejo de árvores.

A cobertura de cada divisão em que odor = nenhum é usado é 1628.2500 no ID do nó 0-0 e 765.9390 no ID do nó 1-1.

Cobertura total de todas as divisões (somatória na coluna de cobertura no despejo de árvore) = 1628.2500 * 2 + 786.3720 * 2

Cobertura de odor = nenhum na matriz de importância = (1628.2500 + 765.9390) / (1628.2500 * 2 + 786.3720 * 2)

Portanto, temos certeza de que a cobertura é calculada em todas as divisões!

Natesh Arunachalam
fonte