Ich versuche, ein Steigungsverstärkungsmodell mit über 50.000 Beispielen und 100 numerischen Merkmalen zu trainieren. XGBClassifier
Bewältigt 500 Bäume innerhalb von 43 Sekunden auf meiner Maschine, während GradientBoostingClassifier
nur 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_rate
und dieselben max_depth
Einstellungen , 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)
quelle
Antworten:
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_eps
Parameter 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
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,Hi−1+hi) L y Hi−1 hi L L Hi−1 i Verlustfunktion 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,Hi−1+hi) L
quelle