Jeg prøver å trene en gradientforsterkende modell over 50 000 eksempler med 100 numeriske funksjoner. XGBClassifier håndterer 500 trær innen 43 sekunder på maskinen min, mens GradientBoostingClassifier bare håndterer 10 trær (!) på 1 minutt og 2 sekunder 🙁 Jeg gadd ikke å prøve å dyrke 500 trær, da det vil ta timer. Jeg bruker de samme learning_rate og max_depth innstillingene, se nedenfor.

Hva gjør XGBoost så mye raskere? Bruker den noen ny implementering for gradientforsterkning som sklearn-gutta ikke vet? Eller er det «skjæring av hjørner» og voksende grunnere trær?

ps Jeg er klar over denne diskusjonen: 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

  • antar at jeg ' snart må omformulere det som " hvorfor er LightGBM så mye raskere enn XGBoost? " 🙂

Svar

Siden du nevner «numerisk «funksjoner, jeg antar at funksjonene dine ikke er kategoriske og har høy arity (de kan ta mange forskjellige verdier, og dermed er det mange mulige splitpoeng). I et slikt tilfelle er det vanskelig å dyrke trær, siden det er [mange funksjoner $ \ ganger $ mange splitpoeng] å evaluere.

Min gjetning er at den største effekten kommer av det faktum at XGBoost bruker en tilnærming på splittpunktene. Hvis du har en kontinuerlig funksjon med 10000 mulige splittelser, anser XGBoost bare «de beste» 300 splittene som standard (dette er en forenkling). Denne oppførselen styres av sketch_eps -parameteren, og du kan lese mer om den i dokumentet . Du kan prøve å senke den og sjekke forskjellen det gjør. Siden det ikke er noen omtale av det i scikit-lær dokumentasjon , antar jeg at det ikke er tilgjengelig. Du kan lære hva XGBoost-metoden er i papiret deres (arxiv) .

XGBoost bruker også en tilnærming på evaluering av slike splittpunkter . Jeg vet ikke etter hvilket kriterium scikit lærer å vurdere splittene, men det kan forklare resten av tidsforskjellen.


Adressering Kommentarer

Angående evaluering av splitpoeng

Hva mente du imidlertid med «XGBoost bruker også en tilnærming på evaluering av slike splittpunkter»? så vidt jeg forstår, bruker de for evaluering den nøyaktige reduksjonen i den optimale objektive funksjonen, slik den fremgår av ligning (7) i papiret.

For å evaluere delingspunktet, må du beregne $ L (y, H_ {i-1} + h_i) $ hvor $ L $ er kostnadsfunksjonen, $ y $ målet, $ H_ {i- 1} $ modellen som er bygget til nå, og $ h_i $ det nåværende tillegget. Legg merke til at dette ikke er det XGBoost gjør; de forenkler kostnadsfunksjonen $ L $ ved en Taylor-utvidelse, noe som fører til en veldig enkel funksjon å beregne. De må beregne Gradient og Hessian på $ L $ med hensyn til $ H_ {i-1} $, og de kan gjenbruke dette tallet for alle potensielle splittelser på scenen $ i $, noe som gjør beregningen av overstyringen rask. Du kan sjekke Tapfunksjon Tilnærming med Taylor Expansion (CrossValidated Q / A) for mer informasjon, eller avledningen i papiret.

poenget er at de har funnet en måte å tilnærme $ L (y, H_ {i-1} + h_i) $ effektivt. Hvis du skulle evaluere $ L $ fullt ut, uten innsiderkunnskap som tillater optimalisering eller unngåelse eller overflødig beregning, vil det ta mer tid per deling. Det er en tilnærming. Imidlertid bruker andre gradientforsterkende implementeringer også proxy-kostnadsfunksjoner for å evaluere splittelsene, og jeg vet ikke om XGBoost-tilnærming er raskere i dette henseende enn de andre.

Kommentarer

  • Takk @Winks, jeg leste avisen og ser hva du mente med tilnærmelsesalgoritmen for å velge delt kandidater. Men hva mente du med " XGBoost bruker også en tilnærming på evalueringen av slike splittpunkter "? så vidt jeg forstår, bruker de til evaluering den nøyaktige reduksjonen i den optimale objektive funksjonen, slik den fremgår av ligning (7) i papiret.
  • Jeg redigerte svaret mitt for å adressere kommentaren din. Sjekk denne Q / A for mer informasjon om evaluering av splitpoeng.
  • Tusen takk, @Winks! det ville være flott om du også kunne svare på det mer utførlige spørsmålet mitt her: datascience.stackexchange.com/q/10997/16050
  • Dette er et flott svar. Hat-trick!

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *