Чому xgboost так швидше, ніж sklearn GradientBoostingClassifier?


29

Я намагаюся підготувати градієнтну модель для збільшення градієнта на 50 к. Прикладах із 100 числовими функціями. XGBClassifierобробляє 500 дерев протягом 43 секунд на моїй машині, тоді як GradientBoostingClassifierобробляє лише 10 дерев (!) за 1 хвилину і 2 секунди :( Я не намагався виростити 500 дерев, як це займе години. Я використовую те саме learning_rateі max_depthналаштування , Дивись нижче.

Що робить XGBoost набагато швидшим? Чи використовує вона якусь нову реалізацію для збільшення градієнта, якого не знають хлопці sklearn? Або це "рубання кутів" та вирощування дрібних дерев?

ps Я знаю про це обговорення: https://www.kaggle.com/c/higgs-boson/forums/t/10335/xgboost-post-comcharge-survey, але не зміг отримати відповідь там ...

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)

2
здогадуюсь, мені незабаром доведеться перефразовувати це як "чому LightGBM настільки швидше, ніж XGBoost?" :)
ihadanny

Відповіді:


25

Оскільки ви згадуєте про "числові" функції, я вважаю, що ваші функції не є категоричними та мають високу ступінь (вони можуть приймати багато різних значень, і, отже, існує маса можливих роздільних точок). У такому випадку вирощування дерев є важким, оскільки існує [багато особливостей багато роздільних точок] для оцінки.×

Я здогадуюсь, що найбільший ефект виникає від того, що XGBoost використовує наближення на точки розщеплення. Якщо у вас є безперервна функція з 10000 можливими розбиттями, XGBoost вважає лише "найкращими" 300 розбитків за замовчуванням (це спрощення). Така поведінка контролюється sketch_epsпараметром, і ви можете прочитати більше про це в документі . Ви можете спробувати її знизити і перевірити різницю. Оскільки про це в науковій документації не згадується , я думаю, що вона недоступна. Ви можете дізнатись, що таке метод XGBoost у своїй роботі (arxiv) .

XGBoost також використовує наближення до оцінки таких розділених точок. Я не знаю, за яким критерієм scikit вивчає оцінку розбиття, але це могло б пояснити іншу різницю у часі.


Розгляд коментарів

Щодо оцінювання розділених балів

Однак, що ви мали на увазі під "XGBoost, також використовує наближення до оцінки таких розділених балів"? Наскільки я розумію, для оцінки вони використовують точне зменшення оптимальної цільової функції, як це відображено у (7) у статті.

Для того, щоб оцінити точку розбиття, вам доведеться обчислити де - функція витрат, ціль, модель, побудована дотепер, і поточне доповнення. Зауважте, що це не те, що робить XGBoost; вони спрощують функцію витрат розширенням Тейлора, що призводить до дуже простої функції для обчислення. Вони повинні обчислити градієнт і гессіан по відношенню до , і вони можуть використати це число для всіх потенційних розщеплень на етапі , зробивши обчислення надмірних швидко. Ви можете перевіритиL y H i - 1 h i L L H i - 1 iL(y,Hi1+hi)LyHi1hiLLHi1iНаближення функції втрат за допомогою розширення Тейлора (CrossValided Q / A) для отримання більш детальної інформації або виведення їх у статті.

Справа в тому, що вони знайшли спосіб ефективного наближення . Якби ви оцінювали повністю, без інсайдерських знань, що дозволяють оптимізувати чи уникати чи зайвих обчислень, знадобиться більше часу на розкол. Що стосується цього, то це наближення. Однак інші реалізації, що розширюють градієнт, також використовують функції вартості проксі-сервісів для оцінки розділень, і я не знаю, чи наближення XGBoost у цьому відношенні швидше, ніж інші.LL(y,Hi1+hi)L


Дякую @Winks, я прочитав документ і побачив, що ви мали на увазі під алгоритмом наближення для вибору розділених кандидатів. Однак, що ви мали на увазі під "XGBoost, також використовує наближення до оцінки таких розділених балів"? Наскільки я розумію, для оцінки вони використовують точне зменшення оптимальної цільової функції, як це відображено у (7) у статті.
ihadanny

Я відредагував свою відповідь, щоб звернутися до вашого коментаря. Перевірте цей Q / A для отримання більш детальної інформації про оцінку розділених балів.
Підморгує

Велике спасибі, @Winks! Було б чудово, якби ви могли також відповісти на моє більш детальне запитання тут: datascience.stackexchange.com/q/10997/16050
ihadanny

Це чудова відповідь. Хет-трик !
eliasah
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.