Jessaie de former un modèle damplification de gradient sur 50 000 exemples avec 100 caractéristiques numériques. XGBClassifier gère 500 arbres en 43 secondes sur ma machine, tandis que GradientBoostingClassifier ne gère que 10 arbres (!) en 1 minute et 2 secondes 🙁 Je nai pas pris la peine dessayer de faire pousser 500 arbres comme il le faudrait heures. Jutilise les mêmes paramètres learning_rate et max_depth, voir ci-dessous.

Ce qui rend XGBoost tant Est-ce quil utilise une nouvelle implémentation pour le renforcement du gradient que les gars de sklearn ne connaissent pas? Ou est-ce que cest « couper les coins » et faire pousser des arbres moins profonds?

ps Je suis au courant de cette discussion: https://www.kaggle.com/c/higgs-boson/forums/t/10335/xgboost-post-competition-survey mais na pas pu trouver la réponse là-bas …

XGBClassifier(base_score=0.5, colsample_bylevel=1, colsample_bytree=1, gamma=0, learning_rate=0.05, max_delta_step=0, max_depth=10, min_child_weight=1, missing=None, n_estimators=500, nthread=-1, objective="binary:logistic", reg_alpha=0, reg_lambda=1, scale_pos_weight=1, seed=0, silent=True, subsample=1) GradientBoostingClassifier(init=None, learning_rate=0.05, loss="deviance", max_depth=10, max_features=None, max_leaf_nodes=None, min_samples_leaf=1, min_samples_split=2, min_weight_fraction_leaf=0.0, n_estimators=10, presort="auto", random_state=None, subsample=1.0, verbose=0, warm_start=False) 

Commentaires

  • suppose que je ' je devrai bientôt le reformuler comme " pourquoi LightGBM est-il tellement plus rapide que XGBoost? " 🙂

Réponse

Puisque vous mentionnez « numeric « caractéristiques, je suppose que vos caractéristiques ne sont pas catégoriques et ont une arité élevée (elles peuvent prendre beaucoup de valeurs différentes, et donc il y a beaucoup de points de partage possibles). Dans un tel cas, faire pousser des arbres est difficile car il y a [beaucoup de fonctionnalités $ \ fois $ beaucoup de points de partage] à évaluer.

Je suppose que le plus gros effet vient du fait que XGBoost utilise une approximation sur les points de partage. Si vous avez une fonction continue avec 10000 fractionnements possibles, XGBoost ne considère que « les meilleurs » 300 fractionnements par défaut (cest une simplification). Ce comportement est contrôlé par le paramètre sketch_eps, et vous pouvez en savoir plus à ce sujet dans la documentation . Vous pouvez essayer de labaisser et vérifier la différence quil fait. Puisquil ny en a aucune mention dans la documentation scikit-learn , je suppose quil nest pas disponible. Vous pouvez découvrir la méthode XGBoost dans leur article (arxiv) .

XGBoost utilise également une approximation sur lévaluation de ces points de partage . Je ne sais pas par quel critère scikit learn évalue les fractionnements, mais cela pourrait expliquer le reste du décalage horaire.


Adressing Comments

Concernant lévaluation des points de partage

Cependant, quentendez-vous par « XGBoost utilise également une approximation sur lévaluation de ces points de partage »? pour autant que je sache, pour lévaluation, ils utilisent la réduction exacte de la fonction objective optimale, telle quelle apparaît dans leq (7) dans larticle.

Pour évaluer le point de partage, il faudrait calculer $ L (y, H_ {i-1} + h_i) $ où $ L $ est la fonction de coût, $ y $ la cible, $ H_ {i- 1} $ le modèle construit jusquà présent, et $ h_i $ lajout actuel. Notez que ce nest pas ce que fait XGBoost; ils simplifient la fonction de coût $ L $ par une extension de Taylor, ce qui conduit à une fonction très simple à calculer. Ils doivent calculer le Gradient et le Hessian de $ L $ par rapport à $ H_ {i-1} $, et ils peuvent réutiliser ces nombres pour toutes les divisions potentielles à létape $ i $, ce qui accélère le calcul de la surévaluation. Vous pouvez vérifier Approximation de la fonction de perte avec lexpansion de Taylor (CrossValidated Q / A) pour plus de détails, ou la dérivation dans leur article.

Le Le fait est quils ont trouvé un moyen dapproximer $ L (y, H_ {i-1} + h_i) $ efficacement. Si vous deviez évaluer $ L $ complètement, sans connaissances dinitiés permettant loptimisation ou lévitement ou le calcul redondant, cela prendrait plus de temps par division. A cet égard, cest une approximation. Cependant, dautres implémentations de renforcement de gradient utilisent également des fonctions de coût proxy pour évaluer les fractionnements, et je ne sais pas si lapproximation XGBoost est plus rapide à cet égard que les autres.

Commentaires

  • Merci @Winks, jai lu larticle et je vois ce que vous entendez par lalgorithme dapproximation pour choisir les candidats séparés. Cependant, quentendez-vous par " XGBoost utilise également une approximation sur lévaluation de ces points de partage "? pour autant que je sache, pour lévaluation, ils utilisent la réduction exacte de la fonction objective optimale, telle quelle apparaît dans leq (7) dans larticle.
  • Jai édité ma réponse pour répondre à votre commentaire. Consultez ce Q / R pour plus de détails sur lévaluation des points de partage.
  • Merci beaucoup, @Winks! serait bien si vous pouviez également répondre à ma question plus élaborée ici: datascience.stackexchange.com/q/10997/16050
  • Cest une excellente réponse. Hat-trick!

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *