J'utilise actuellement XGBoost sur un ensemble de données avec 21 fonctionnalités (sélectionnées dans la liste de quelque 150 fonctionnalités), puis je les ai codées à chaud pour obtenir ~ 98 fonctionnalités. Certaines de ces 98 fonctionnalités sont quelque peu redondantes, par exemple: une variable (fonctionnalité) apparaît également comme B etC .
Mes questions sont:
- Comment ( si? ) Les arbres de décision boostés gèrent-ils la multicolinéarité?
- Comment l'existence de la multicolinéarité affecterait-elle la prédiction si elle n'était pas gérée?
D'après ce que je comprends, le modèle apprend plus d'un arbre et la prédiction finale est basée sur quelque chose comme une «somme pondérée» des prédictions individuelles. Donc, si cela est correct, les arbres de décision boostés devraient être capables de gérer la co-dépendance entre les variables.
En outre, sur une note connexe - comment fonctionne l'objet d'importance variable dans XGBoost?
la source
Réponses:
Les arbres de décision sont par nature immunisés contre la multi-colinéarité. Par exemple, si vous avez 2 fonctionnalités qui sont corrélées à 99%, lorsque vous décidez d'une division, l'arborescence n'en choisit qu'une. D'autres modèles tels que la régression logistique utiliseraient les deux fonctionnalités.
Étant donné que les arbres boostés utilisent des arbres de décision individuels, ils ne sont pas non plus affectés par la multi-colinéarité. Cependant, c'est une bonne pratique pour supprimer toutes les fonctionnalités redondantes de tout ensemble de données utilisé pour la formation, quel que soit l'algorithme du modèle. Dans votre cas, puisque vous dérivez de nouvelles fonctionnalités, vous pouvez utiliser cette approche, évaluer l'importance de chaque fonctionnalité et ne conserver que les meilleures fonctionnalités pour votre modèle final.
La matrice d'importance d'un modèle xgboost est en fait un objet data.table avec la première colonne listant les noms de toutes les fonctionnalités réellement utilisées dans les arbres boostés. La deuxième colonne est la métrique Gain qui 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 qu'elle est plus importante pour générer une prédiction.
la source
J'étais curieux à ce sujet et j'ai fait quelques tests.
J'ai formé un modèle sur l'ensemble de données sur les diamants et j'ai observé que la variable «x» est la plus importante pour prédire si le prix d'un diamant est supérieur à un certain seuil. Ensuite, j'ai ajouté plusieurs colonnes hautement corrélées à x, exécuté le même modèle et observé les mêmes valeurs.
Il semble que lorsque la corrélation entre deux colonnes est 1, xgboost supprime la colonne supplémentaire avant de calculer le modèle, de sorte que l'importance n'est pas affectée. Cependant, lorsque vous ajoutez une colonne partiellement corrélée à une autre, donc avec un coefficient inférieur, l'importance de la variable d'origine x est réduite.
Par exemple, si j'ajoute une variable xy = x + y, l'importance de x et y diminue. De même, l'importance de x diminue si j'ajoute de nouvelles variables avec r = 0,4, 0,5 ou 0,6, bien que juste un peu.
Je pense que la colinéarité n'est pas un problème pour booster lorsque vous calculez la précision du modèle, car l'arbre de décision ne se soucie pas de laquelle des variables est utilisée. Cependant, cela pourrait affecter l'importance des variables, car la suppression de l'une des deux variables corrélées n'a pas un grand impact sur la précision du modèle, étant donné que l'autre contient des informations similaires.
Évaluer un modèle sur les données diamants
Nous prédisons si le prix est supérieur à 400, compte tenu de toutes les variables numériques disponibles (carat, profondeur, tableau, x, y, x)
Notez que x est la variable la plus importante, avec un score de gain d'importance de 0,375954.
Modèle formé sur les diamants, ajoutant une variable avec r = 1 à x
Ici, nous ajoutons une nouvelle colonne, qui n'ajoute cependant aucune nouvelle information, car elle est parfaitement corrélée à x.
Notez que cette nouvelle variable n'est pas présente dans la sortie. Il semble que xgboost supprime automatiquement les variables parfaitement corrélées avant de commencer le calcul. Le gain d'importance de x est le même, 0,3759.
Modèle formé sur les diamants, ajoutant une colonne pour x + y
Nous ajoutons une nouvelle colonne xy = x + y. Ceci est partiellement corrélé à la fois à x et à y.
Notez que l'importance de x et y est légèrement réduite, passant de 0,3759 à 0,3592 pour x, et de 0,116 à 0,079 pour y.
Modèle formé sur les données Diamonds, modifié en ajoutant des colonnes redondantes
Nous ajoutons trois nouvelles colonnes qui sont corrélées à x (r = 0,4, 0,5 et 0,6) et voyons ce qui se passe.
Notez que l'importance de x diminue, passant de 0,3759 à 0,279.
la source
Il y a une réponse de Tianqi Chen (2018).
Pour résumer, Xgboost n'utilise pas au hasard les caractéristiques corrélées de chaque arbre, quel modèle de forêt aléatoire souffre d'une telle situation.
Référence :
Tianqi Chen, Michaël Benesty, Tong He. 2018. «Comprendre votre ensemble de données avec Xgboost» . Https://cran.r-project.org/web/packages/xgboost/vignettes/discoverYourData.html#numeric-vs-categorical-variables .
la source
Une remarque sur la réponse de Sandeep: en supposant que 2 de vos fonctionnalités sont hautement colinéaires (disons égales à 99% du temps). Par conséquent, le classement des entités xgb classera probablement les 2 entités colinéaires de manière égale. Sans connaissances préalables ou traitement des autres fonctionnalités, vous n'avez pratiquement aucun moyen à partir de ce classement fourni pour détecter que les 2 fonctionnalités sont colinéaires.
Maintenant, en ce qui concerne l'importance relative qui produit xgboost, elle devrait être très similaire (ou peut-être exactement similaire) au classement de l'arbre boosté par le gradient sklearn. Voir ici pour les explications.
la source