Warum ist xgboost so viel schneller als sklearn GradientBoostingClassifier?

29

Ich versuche, ein Steigungsverstärkungsmodell mit über 50.000 Beispielen und 100 numerischen Merkmalen zu trainieren. XGBClassifierBewältigt 500 Bäume innerhalb von 43 Sekunden auf meiner Maschine, während GradientBoostingClassifiernur 10 Bäume (!) in 1 Minute und 2 Sekunden bearbeitet werden :( Ich habe nicht versucht, 500 Bäume zu züchten, da dies Stunden dauern wird. Ich verwende dasselbe learning_rateund dieselben max_depthEinstellungen , siehe unten.

Was macht XGBoost so viel schneller? Verwendet es eine neuartige Implementierung für Gradienten-Boosting, die Sklearn-Leute nicht kennen? Oder heißt es "Ecken abschneiden" und flachere Bäume wachsen lassen?

ps Mir ist diese Diskussion bekannt: https://www.kaggle.com/c/higgs-boson/forums/t/10335/xgboost-post-competition-survey, aber ich konnte dort keine Antwort finden ...

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)
ihadanny
quelle
2
Ich denke, ich muss es bald umformulieren als "Warum ist LightGBM so viel schneller als XGBoost?" :)
ihadanny

Antworten:

25

Da Sie "numerische" Features erwähnen, sind Ihre Features vermutlich nicht kategorisch und weisen eine hohe Arität auf (sie können viele verschiedene Werte annehmen, und daher gibt es viele mögliche Teilungspunkte). In einem solchen Fall ist es schwierig, Bäume zu züchten, da [viele Merkmale viele Teilungspunkte] zu bewerten sind.×

Ich vermute, der größte Effekt ergibt sich aus der Tatsache, dass XGBoost eine Annäherung an die Teilungspunkte verwendet. Wenn Sie eine fortlaufende Funktion mit 10000 möglichen Teilungen haben, berücksichtigt XGBoost standardmäßig nur die "besten" 300 Teilungen (dies ist eine Vereinfachung). Dieses Verhalten wird durch den sketch_epsParameter gesteuert. Weitere Informationen hierzu finden Sie im Dokument . Sie können versuchen, es zu senken und den Unterschied zu überprüfen, den es macht. Da es in der Scikit-Learn-Dokumentation keine Erwähnung gibt, ist sie vermutlich nicht verfügbar. Welche XGBoost-Methode es gibt, erfahren Sie in ihrem Artikel (arxiv) .

XGBoost verwendet auch eine Annäherung an die Bewertung solcher Teilungspunkte. Ich weiß nicht, nach welchem ​​Kriterium scikit learn die Splits bewertet, aber es könnte den Rest des Zeitunterschieds erklären.


Adressierung von Kommentaren

Bezüglich der Bewertung von Splitpunkten

Was meinten Sie jedoch mit "XGBoost verwendet auch eine Annäherung an die Bewertung solcher Teilungspunkte"? Soweit ich weiß, wird für die Bewertung die exakte Reduzierung der optimalen Zielfunktion verwendet, wie sie in Gleichung (7) in der Arbeit angegeben ist.

Um den Aufteilungspunkt zu berechnen, müssten Sie berechnen wobei die Kostenfunktion, das Ziel, das bis jetzt gebaute Modell ist, und der aktuelle Zusatz. Beachten Sie, dass XGBoost dies nicht tut. Sie vereinfachen die Kostenfunktion durch eine Taylor-Erweiterung, was zu einer sehr einfach zu berechnenden Funktion führt. Sie müssen den Gradienten und den Hessischen Wert von in Bezug auf berechnen , und sie können diese Zahl für alle potenziellen Teilungen in Stufe wiederverwenden, wodurch die Berechnung des Overrals schnell wird. Du kannst nachschauenL(y,Hi1+hi)LyHi1hiLLHi1iVerlustfunktion Approximation With Taylor Expansion (CrossValidated Q / A) für weitere Details oder die Herleitung in ihrer Arbeit.

Der Punkt ist, dass sie einen Weg gefunden haben, um effizient zu approximieren . Wenn Sie vollständig auswerten würden , ohne dass Insiderwissen eine Optimierung oder Vermeidung oder redundante Berechnung zulässt, würde dies mehr Zeit pro Aufteilung in Anspruch nehmen. Diesbezüglich handelt es sich um eine Annäherung. Andere Gradientenverstärkungsimplementierungen 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.L(y,Hi1+hi)L

Zwinkert
quelle
Danke @Winks, ich habe die Zeitung gelesen und gesehen, was Sie mit dem Näherungsalgorithmus für die Auswahl der Split-Kandidaten gemeint haben. Was meinten Sie jedoch mit "XGBoost verwendet auch eine Annäherung an die Bewertung solcher Teilungspunkte"? Soweit ich weiß, wird für die Bewertung die exakte Reduzierung der optimalen Zielfunktion verwendet, wie sie in Gleichung (7) in der Arbeit angegeben ist.
Ihadanny
Ich habe meine Antwort bearbeitet, um Ihren Kommentar zu adressieren. Weitere Informationen zur Bewertung von Split-Punkten finden Sie in dieser Frage / Antwort.
Winks
Vielen Dank, @Winks! Es wäre großartig, wenn Sie meine ausführlichere Frage auch hier beantworten könnten: datascience.stackexchange.com/q/10997/16050
ihadanny
Das ist eine großartige Antwort. Hattrick, Hat-Trick !
Eliasah