Jeg prøver at træne en gradientforstærkende model over 50.000 eksempler med 100 numeriske funktioner. XGBClassifier håndterer 500 træer inden for 43 sekunder på min maskine, mens GradientBoostingClassifier kun håndterer 10 træer (!) på 1 minut og 2 sekunder 🙁 Jeg gider ikke prøve at dyrke 500 træer, da det tager timer. Jeg bruger de samme learning_rate og max_depth indstillinger, se nedenfor.

Hvad gør XGBoost så meget hurtigere? Bruger den en eller anden romanimplementering til gradientforøgelse, som sklearn-fyre ikke ved? Eller er det “at skære hjørner” og vokse lavere træer?

ps Jeg er opmærksom på denne diskussion: https://www.kaggle.com/c/higgs-boson/forums/t/10335/xgboost-post-competition-survey men kunne ikke få svaret der …

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) 

Kommentarer

  • gæt jeg ' Jeg bliver snart nødt til at omformulere det som " hvorfor er LightGBM så meget hurtigere end XGBoost? " 🙂

Svar

Da du nævner “numerisk “funktioner, jeg antager, at dine funktioner ikke er kategoriske og har en høj aritet (de kan tage mange forskellige værdier, og der er således mange mulige splitpunkter). I et sådant tilfælde er det vanskeligt at dyrke træer, da der er [mange funktioner $ \ gange $ mange splitpunkter] at evaluere.

Mit gæt er, at den største effekt kommer fra det faktum, at XGBoost bruger en tilnærmelse på splitpunkterne. Hvis du har en kontinuerlig funktion med 10000 mulige opdelinger, betragter XGBoost kun “de bedste” 300 opdelinger som standard (dette er en forenkling). Denne adfærd styres af parameteren sketch_eps, og du kan læse mere om den i dokumentet . Du kan prøve at sænke det og kontrollere forskellen, det gør. Da der ikke er nogen omtale af det i scikit-learning dokumentation , antager jeg, at det ikke er tilgængeligt. Du kan lære, hvad XGBoost-metoden er i deres papir (arxiv) .

XGBoost bruger også en tilnærmelse til evaluering af sådanne splitpunkter . Jeg ved ikke på hvilket kriterium scikit lærer at evaluere splittelserne, men det kunne forklare resten af tidsforskellen.


Adressering Kommentarer

Med hensyn til evaluering af splitpunkter

Hvad mente du dog med “XGBoost bruger også en tilnærmelse til evaluering af sådanne splitpunkter”? så vidt jeg forstår, bruger de til evaluering den nøjagtige reduktion af den optimale objektive funktion, som den fremgår af ligning (7) i papiret.

For at evaluere splitpunktet skal du beregne $ L (y, H_ {i-1} + h_i) $ hvor $ L $ er omkostningsfunktionen, $ y $ målet, $ H_ {i- 1} $ den model, der er bygget indtil nu, og $ h_i $ den aktuelle tilføjelse. Bemærk, at dette ikke er, hvad XGBoost gør; de forenkler omkostningsfunktionen $ L $ ved en Taylor-udvidelse, hvilket fører til en meget enkel funktion at beregne. De er nødt til at beregne Gradient og Hessian på $ L $ med hensyn til $ H_ {i-1} $, og de kan genbruge disse tal til alle potentielle opdelinger på scenen $ i $, hvilket gør den overordnede beregning hurtig. Du kan kontrollere Tabsfunktionstilnærmelse med Taylor-udvidelse (CrossValidated Q / A) for flere detaljer eller afledningen i deres papir.

pointen er, at de har fundet en måde at tilnærme $ L (y, H_ {i-1} + h_i) $ effektivt. Hvis du skulle evaluere $ L $ fuldt ud uden insider-viden, der tillader optimering eller undgåelse eller overflødig beregning, ville det tage mere tid pr. Split. I denne henseende er det en tilnærmelse. Imidlertid bruger andre gradientforstærkende implementeringer også en proxy-omkostningsfunktion til at evaluere opdelingerne, og jeg ved ikke, om XGBoost-tilnærmelse er hurtigere i denne henseende end de andre.

Kommentarer

  • Tak @Winks, jeg læste papiret og ser, hvad du mente med tilnærmelsesalgoritmen til valg af splitkandidater. Men hvad mente du med " XGBoost bruger også en tilnærmelse til evaluering af sådanne splitpunkter "? så vidt jeg forstår, bruger de til evalueringen den nøjagtige reduktion af den optimale objektive funktion, som den fremgår af ligning (7) i papiret.
  • Jeg redigerede mit svar for at adressere din kommentar. Tjek denne Q / A for flere detaljer om evalueringen af splitpunkter.
  • Mange tak, @Winks! ville være godt, hvis du også kunne besvare mit mere uddybede spørgsmål her: datascience.stackexchange.com/q/10997/16050
  • Dette er et godt svar. Hat-trick!

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *