Ich versuche, ein Gradientenverstärkungsmodell über 50.000 Beispiele mit 100 numerischen Merkmalen zu trainieren. XGBClassifier
verarbeitet 500 Bäume innerhalb von 43 Sekunden auf meinem Computer, während GradientBoostingClassifier
nur 10 Bäume (!) in 1 Minute und 2 Sekunden verarbeitet 🙁 Ich habe nicht versucht, 500 Bäume zu züchten, wie es dauern wird Stunden. Ich verwende dieselben learning_rate
und max_depth
Einstellungen, siehe unten.
Was macht XGBoost so sehr? Schneller? Verwendet es eine neuartige Implementierung zur Erhöhung des Gradienten, die Sklearn-Leute nicht kennen? Oder ist es „Ecken schneiden“ und flachere Bäume wachsen lassen?
ps Ich bin mir dieser Diskussion bewusst: https://www.kaggle.com/c/higgs-boson/forums/t/10335/xgboost-post-competition-survey konnte dort jedoch keine Antwort erhalten …
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)
Kommentare
- Ich denke, ich ' muss es bald als " Warum ist LightGBM so viel schneller als XGBoost? " 🙂
Antwort
Da Sie „numerisch“ erwähnen „Features, ich denke, Ihre Features sind nicht kategorisch und haben eine hohe Arität (sie können viele verschiedene Werte annehmen, und daher gibt es viele mögliche Split-Punkte). In einem solchen Fall ist das Wachsen von Bäumen schwierig, da [viele Funktionen $ \ mal $ viele Split-Punkte] zu bewerten sind.
Ich vermute, dass der größte Effekt von der Tatsache herrührt, dass XGBoost verwendet eine Annäherung an die Teilungspunkte. Wenn Sie eine fortlaufende Funktion mit 10000 möglichen Teilungen haben, betrachtet XGBoost standardmäßig nur „die besten“ 300 Teilungen (dies ist eine Vereinfachung). Dieses Verhalten wird durch den Parameter sketch_eps
gesteuert, und Sie können mehr darüber im Dokument lesen. Sie können versuchen, es abzusenken und den Unterschied zu überprüfen. Da es in der scikit-learn-Dokumentation keine Erwähnung gibt, ist es vermutlich nicht verfügbar. Informationen zur XGBoost-Methode finden Sie in der ihrer Arbeit (arxiv) .
XGBoost verwendet auch eine Näherung für die Bewertung solcher Teilungspunkte . Ich weiß nicht, nach welchem Kriterium scikit learn die Aufteilung bewertet, aber es könnte den Rest des Zeitunterschieds erklären.
Adressierungskommentare
In Bezug auf die Bewertung von Teilungspunkten
Was meinten Sie jedoch damit? „XGBoost verwendet auch eine Annäherung an die Bewertung solcher Teilungspunkte“? Soweit ich weiß, verwenden sie für die Bewertung die exakte Reduktion der optimalen Zielfunktion, wie sie in Gleichung (7) in der Veröffentlichung erscheint.
Um den Split-Punkt zu bewerten, müssten Sie $ L (y, H_ {i-1} + h_i) $ berechnen, wobei $ L $ die Kostenfunktion ist, $ y $ das Ziel, $ H_ {i- 1} $ das bisher erstellte Modell und $ h_i $ die aktuelle Ergänzung. Beachten Sie, dass XGBoost dies nicht tut. Sie vereinfachen die Kostenfunktion $ L $ durch eine Taylor-Erweiterung, was zu einer sehr einfach zu berechnenden Funktion führt. Sie müssen den Gradienten und den Hessischen Wert von $ L $ in Bezug auf $ H_ {i-1} $ berechnen und können diese Zahl für alle möglichen Teilungen im Stadium $ i $ wiederverwenden, wodurch die Überlaufberechnung schnell wird. Sie können Verlustfunktion Approximation mit Taylor-Erweiterung (CrossValidated Q / A) auf weitere Details oder die Ableitung in ihrem Artikel überprüfen.
Die Punkt ist, dass sie einen Weg gefunden haben, $ L (y, H_ {i-1} + h_i) $ effizient zu approximieren. Wenn Sie $ L $ vollständig auswerten würden, ohne dass Insiderwissen eine Optimierung oder Vermeidung oder redundante Berechnung zulässt, würde dies mehr Zeit pro Teilung dauern. In dieser Hinsicht ist es eine Annäherung. Andere Implementierungen zur Erhöhung des Gradienten verwenden jedoch auch Proxy-Kostenfunktionen, um die Teilungen zu bewerten, und ich weiß nicht, ob die XGBoost-Approximation in dieser Hinsicht schneller ist als die anderen.
Kommentare
- Danke @Winks, ich habe das Papier gelesen und gesehen, was Sie mit dem Approximationsalgorithmus für die Auswahl von Split-Kandidaten gemeint haben. Was meinten Sie jedoch mit " XGBoost verwendet auch eine Annäherung an die Bewertung solcher Teilungspunkte "? Soweit ich weiß, verwenden sie für die Bewertung die exakte Reduzierung der optimalen Zielfunktion, wie sie in Gleichung (7) des Papiers erscheint.
- Ich habe meine Antwort bearbeitet, um Ihren Kommentar anzusprechen. Weitere Informationen zur Bewertung von Teilungspunkten finden Sie in der dieser Frage / Antwort .
- Vielen Dank, @Winks! wäre toll, wenn Sie auch meine ausführlichere Frage hier beantworten könnten: datascience.stackexchange.com/q/10997/16050
- Dies ist eine gute Antwort. Hattrick!