Comment interpréter la sortie d'importance XGBoost?

37

J'ai couru un modèle xgboost. Je ne sais pas exactement comment interpréter le résultat de xgb.importance.

Quelle est la signification de gain, couverture et fréquence et comment les interprète-t-on?

De plus, que signifient Split, RealCover et RealCover%? J'ai quelques paramètres supplémentaires ici

Existe-t-il d'autres paramètres pouvant en dire plus sur l'importance des fonctionnalités?

D'après la documentation R, je comprends un peu que le gain est quelque chose de similaire au gain d'information et que la fréquence correspond au nombre de fois qu'une fonctionnalité est utilisée dans tous les arbres. Je n'ai aucune idée de ce qu'est la couverture.

J'ai exécuté l'exemple de code donné dans le lien (et j'ai également essayé de faire de même pour le problème sur lequel je travaille), mais la définition de fractionnement indiquée ne correspond pas aux nombres que j'ai calculés.

importance_matrix

Sortie:

           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
la source

Réponses:

40

D'après votre question, je suppose que vous utilisez xgboost pour adapter les arbres boostés à la classification binaire. La matrice d'importance est en réalité un objet data.table dont la première colonne répertorie les noms de toutes les fonctionnalités réellement utilisées dans les arborescences boostées.

La signification du tableau de données d’importance est la suivante:

  1. Le gain implique la contribution relative de l'entité correspondante au modèle, calculée en prenant la contribution de chaque entité pour chaque arbre du modèle. Une valeur plus élevée de cette métrique par rapport à une autre fonctionnalité implique que cela est plus important pour générer une prédiction.
  2. La métrique Couverture désigne le nombre relatif d'observations liées à cette caractéristique. Par exemple, si vous avez 100 observations, 4 entités et 3 arbres, et supposons que fonctionnalité1 soit utilisée pour choisir le nœud feuille pour 10, 5 et 2 observations dans tree1, tree2 et tree3 respectivement; ensuite, la métrique comptera la couverture de cette entité sous la forme de 10 + 5 + 2 = 17 observations. Cela sera calculé pour toutes les 4 fonctionnalités et la couverture sera de 17 exprimée en pourcentage pour les métriques de couverture de toutes les fonctionnalités.
  3. La fréquence (/ "fréquence") est le pourcentage représentant le nombre relatif d'occurrences d'une caractéristique particulière dans les arbres du modèle. Dans l'exemple ci-dessus, si caractéristique1 s'est produite dans 2 divisions, 1 division et 3 divisions dans chacune de tree1, tree2 et tree3; la pondération de la caractéristique 1 sera alors 2 + 1 + 3 = 6. La fréquence de la caractéristique 1 est calculée en tant que pourcentage de sa pondération par rapport aux poids de toutes les caractéristiques.

Le gain est l'attribut le plus pertinent pour interpréter l'importance relative de chaque caractéristique.

Les mesures sont toutes relatives et toutes résument donc à un. Un exemple tiré d’un modèle ajusté de xgboost dans R est:

> sum(importance$Frequence)
[1] 1
> sum(importance$Cover)
[1] 1
> sum(importance$Gain)
[1] 1
Sandeep S. Sandhu
la source
1
La couverture est uniquement calculée en fonction des nœuds feuilles ou de toutes les divisions.
fanfabbb
3

Merci Sandeep pour votre réponse détaillée. Je voudrais corriger que la couverture est calculée pour toutes les divisions et pas seulement pour les nœuds terminaux.

Passons en exemple simple avec les données fournies par la bibliothèque 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)

Sortie -

Dépotoir

Matrice d'importance

Essayons de calculer la couverture d'odeur = aucune dans la matrice d'importance (0.495768965) à partir du vidage d'arbres.

La couverture de chaque division où odeur = aucune est utilisée est 1628.2500 au ID de nœud 0-0 et 765.9390 au ID de nœud 1-1.

Couverture totale de tous les fractionnements (somme de la colonne de couverture dans le vidage d'arbre) = 1628,2500 * 2 + 786,3720 * 2

Couverture d'odeur = aucune dans la matrice d'importance = (1628.2500 + 765.9390) / (1628.2500 * 2 + 786.3720 * 2)

Nous sommes donc sûrs que la couverture est calculée sur toutes les divisions!

Natesh Arunachalam
la source