Snažím se trénovat model podporující přechod na více než 50 tis. příkladech se 100 numerickými funkcemi. XGBClassifier
zpracovává 500 stromy do 43 sekund na mém stroji, zatímco GradientBoostingClassifier
zvládne pouze 10 stromů (!) za 1 minutu a 2 sekundy 🙁 Neobtěžoval jsem se pokusem o růst 500 stromů, jak to bude trvat hodin. Používám stejná nastavení learning_rate
a max_depth
, viz níže.
Co XGBoost tolik dělá rychleji? Využívá nějakou novou implementaci pro zvýšení gradientu, kterou sklearnoví kluci neznají? Nebo je to „ostříhání“ a pěstování mělčích stromů?
ps Jsem si vědom této diskuse: https://www.kaggle.com/c/higgs-boson/forums/t/10335/xgboost-post-competition-survey , ale odpověď tam nelze získat …
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)
Komentáře
- myslím, že ' brzy to budu muset přeformulovat jako " proč je LightGBM mnohem rychlejší než XGBoost? " 🙂
Odpověď
Protože zmiňujete „numeric“ „funkce, myslím, že vaše funkce nejsou kategorické a mají vysokou arititu (mohou nabývat mnoha různých hodnot, a proto existuje spousta možných bodů rozdělení).“ V takovém případě je pěstování stromů obtížné, protože existuje [spousta funkcí $ \ krát $ a mnoho bodů rozdělení], které je třeba vyhodnotit.
Můj odhad je, že největší efekt má skutečnost, že XGBoost používá aproximaci dělených bodů. Pokud máte spojitou funkci s 10 000 možnými rozděleními, považuje XGBoost ve výchozím nastavení pouze „nejlepších“ 300 rozdělení (jedná se o zjednodušení). Toto chování je řízeno parametrem sketch_eps
a další informace o něm najdete v dokumentu . Můžete to zkusit snížit a zkontrolovat rozdíl, který to dělá. Protože o tom není žádná zmínka v dokumentaci scikit-learn , myslím, že není k dispozici. Co je to metoda XGBoost, se dozvíte v jejich příspěvku (arxiv) .
XGBoost také používá aproximaci při hodnocení těchto dělených bodů . Nevím, podle kterého kritéria se scikit učí hodnotit rozdělení, ale mohlo by to vysvětlit zbytek časového rozdílu.
Adresování komentářů
Co se týče vyhodnocení bodů rozdělení
Co jste tím myslel „XGBoost také používá aproximaci při hodnocení těchto dělených bodů“? pokud chápu, pro hodnocení používají přesné snížení optimální objektivní funkce, jak je uvedeno v eq (7) v článku.
Abyste mohli vyhodnotit bod rozdělení, museli byste vypočítat $ L (y, H_ {i-1} + h_i) $, kde $ L $ je nákladová funkce, $ y $ cíl, $ H_ {i- 1} $ dosud postavený model a $ h_i $ aktuální přírůstek. Všimněte si, že to není to, co XGBoost dělá; zjednodušují nákladovou funkci $ L $ Taylorovou expanzí, což vede k velmi jednoduché výpočetní funkci. Musí vypočítat Gradient a Hessian $ L $ s ohledem na $ H_ {i-1} $ a mohou toto číslo znovu použít pro všechny potenciální rozdělení ve fázi $ i $, což umožňuje rychlý výpočet overralu. Můžete zkontrolovat Loss function Aproximation with Taylor Expansion (CrossValidated Q / A) , kde najdete další podrobnosti, nebo odvození v jejich příspěvku.
The Jde o to, že našli způsob, jak efektivně aproximovat $ L (y, H_ {i-1} + h_i) $. Pokud byste měli plně vyhodnotit $ L $, aniž by zasvěcené znalosti umožňovaly optimalizaci nebo vyhýbání se nebo redundantní výpočet, trvalo by více času na rozdělení. V tomto ohledu jde o aproximaci. Jiné implementace podporující gradient však také používají k vyhodnocení rozdělení funkce nákladů na proxy a já nevím, zda je aproximace XGBoost v tomto ohledu rychlejší než ostatní.
Komentáře
- Díky @Winks, přečetl jsem si článek a zjistil, co jste mysleli aproximačním algoritmem pro výběr rozdělených kandidátů. Co jste však měli na mysli pod " XGBoost také používá aproximaci při hodnocení těchto dělených bodů "? pokud chápu, pro hodnocení používají přesné snížení optimální objektivní funkce, jak je uvedeno v eq (7) v článku.
- Upravil jsem svou odpověď, abych adresoval váš komentář. V tomto Q / A najdete další podrobnosti o vyhodnocení bodů rozdělení.
- Děkuji, @Winks! bylo by skvělé, kdybyste zde mohli odpovědět také na mou komplikovanější otázku: datascience.stackexchange.com/q/10997/16050
- Toto je skvělá odpověď. Hattrick!