Jag försöker träna en lutningsförstärkande modell över 50 000 exempel med 100 numeriska funktioner. XGBClassifier hanterar 500 träd inom 43 sekunder på min maskin, medan GradientBoostingClassifier hanterar bara 10 träd (!) på 1 minut och 2 sekunder 🙁 Jag brydde mig inte om att försöka växa 500 träd eftersom det tar timmar. Jag använder samma learning_rate och max_depth inställningar, se nedan.

Vad gör XGBoost så mycket snabbare? Använder den någon ny implementering för lutningsförstärkning som sklearn killar inte känner till? Eller är det att ”klippa hörn” och växa grundare träd?

ps Jag är medveten om den här diskussionen: https://www.kaggle.com/c/higgs-boson/forums/t/10335/xgboost-post-competition-survey men kunde inte få svaret där …

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 att jag ' snart måste omformulera det som " varför är LightGBM så mycket snabbare än XGBoost? " 🙂

Svar

Eftersom du nämner ”numeriskt ”funktioner, jag antar att dina funktioner inte är kategoriska och har hög aritet (de kan ta många olika värden, och därmed finns det många möjliga splitpunkter). I ett sådant fall är det svårt att växa träd eftersom det finns [många funktioner $ \ gånger $ många splitpunkter] att utvärdera.

Min gissning är att den största effekten kommer från det faktum att XGBoost använder en approximation på splitpunkterna. Om du har en kontinuerlig funktion med 10000 möjliga delningar, anser XGBoost endast ”de bästa” 300 delningarna som standard (detta är en förenkling). Detta beteende styrs av parametern sketch_eps och du kan läsa mer om det i dokumentet . Du kan försöka sänka det och kontrollera skillnaden det gör. Eftersom det inte nämns något i scikit-learning-dokumentationen antar jag att det inte är tillgängligt. Du kan lära dig vad XGBoost-metoden är i deras papper (arxiv) .

XGBoost använder också en approximation för utvärdering av sådana delade punkter . Jag vet inte med vilket kriterium scikit lär utvärderar delningarna, men det kan förklara resten av tidsskillnaden.


Adresseringskommentarer

När det gäller utvärdering av splitpunkter

Vad menade du dock med ”XGBoost använder också en approximation för utvärdering av sådana delade punkter”? så vitt jag förstår använder de för utvärderingen den exakta minskningen av den optimala objektivfunktionen, som den visas i ekv (7) i tidningen.

För att utvärdera delningspunkten måste du beräkna $ L (y, H_ {i-1} + h_i) $ där $ L $ är kostnadsfunktionen, $ y $ målet, $ H_ {i- 1} $ den modell som hittills har byggts och $ h_i $ det aktuella tillägget. Observera att detta inte är vad XGBoost gör; de förenklar kostnadsfunktionen $ L $ med en Taylor Expansion, vilket leder till en mycket enkel funktion att beräkna. De måste beräkna Gradient och Hessian på $ L $ med avseende på $ H_ {i-1} $, och de kan återanvända det numret för alla potentiella uppdelningar vid scenen $ i $, vilket gör den övergående beräkningen snabb. Du kan kontrollera Förlustfunktion Approximation With Taylor Expansion (CrossValidated Q / A) för mer information eller härledningen i deras papper.

poängen är att de har hittat ett sätt att approximera $ L (y, H_ {i-1} + h_i) $ effektivt. Om du skulle utvärdera $ L $ helt, utan insiderkunskap som möjliggör optimering eller undvikande eller redundant beräkning, skulle det ta mer tid per delning. Det här är det en approximation. Men andra gradientförstärkande implementeringar använder också proxy-kostnadsfunktioner för att utvärdera delningarna, och jag vet inte om XGBoost-approximationen är snabbare i detta avseende än de andra.

Kommentarer

  • Tack @Winks, jag läste tidningen och ser vad du menade med approximationsalgoritmen för att välja delade kandidater. Men vad menade du med " XGBoost använder också en approximation för utvärderingen av sådana delade punkter "? så vitt jag förstår använder de för utvärderingen den exakta minskningen av den optimala objektivfunktionen, som den visas i ekv (7) i tidningen.
  • Jag redigerade mitt svar för att ta itu med din kommentar. Kontrollera denna fråga / A för mer information om utvärderingen av splitpunkter.
  • Tack så mycket, @Winks! skulle vara jättebra om du också skulle kunna svara på min mer utarbetade fråga här: datascience.stackexchange.com/q/10997/16050
  • Detta är ett bra svar. Hat-trick!

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *