Mengapa xgboost jauh lebih cepat daripada sklearn GradientBoostingClassifier?

29

Saya mencoba untuk melatih model peningkatan gradien lebih dari 50k contoh dengan 100 fitur numerik. XGBClassifiermenangani 500 pohon dalam waktu 43 detik pada mesin saya, sementara GradientBoostingClassifierhanya menangani 10 pohon (!) dalam 1 menit dan 2 detik :( Saya tidak repot-repot mencoba menumbuhkan 500 pohon karena akan memakan waktu berjam-jam. Saya menggunakan pengaturan learning_ratedan max_depthpengaturan yang sama , Lihat di bawah.

Apa yang membuat XGBoost jauh lebih cepat? Apakah itu menggunakan beberapa implementasi baru untuk meningkatkan gradien yang tidak diketahui orang-orang sklearn? Atau apakah itu "memotong sudut" dan menumbuhkan pohon dangkal?

ps Saya mengetahui diskusi ini: https://www.kaggle.com/c/higgs-boson/forums/t/10335/xgboost-post-competition-survey tetapi tidak bisa mendapatkan jawabannya di sana ...

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)
ihadanny
sumber
2
kira saya akan segera harus mengubah kata-kata itu sebagai "mengapa LightGBM jauh lebih cepat daripada XGBoost?" :)
ihadanny

Jawaban:

25

×

Dugaan saya adalah bahwa efek terbesar berasal dari fakta bahwa XGBoost menggunakan perkiraan pada titik perpecahan. Jika Anda memiliki fitur terus-menerus dengan 10000 kemungkinan pemisahan, XGBoost hanya mempertimbangkan 300 pemisahan terbaik "" (ini adalah penyederhanaan). Perilaku ini dikendalikan oleh sketch_epsparameter, dan Anda dapat membaca lebih lanjut tentang hal itu di doc . Anda dapat mencoba menurunkannya dan memeriksa perbedaannya. Karena tidak disebutkan dalam dokumentasi scikit-learn , saya kira itu tidak tersedia. Anda dapat mempelajari metode XGBoost di dalam makalahnya (arxiv) .

XGBoost juga menggunakan perkiraan pada evaluasi titik perpecahan tersebut. Saya tidak tahu kriteria scikit belajar mana yang mengevaluasi pemisahan, tetapi bisa menjelaskan perbedaan waktu yang tersisa.


Komentar Adressing

Mengenai evaluasi poin split

Namun, apa yang Anda maksud dengan "XGBoost juga menggunakan perkiraan pada evaluasi titik perpecahan seperti itu"? Sejauh yang saya mengerti, untuk evaluasi mereka menggunakan pengurangan yang tepat dalam fungsi objektif yang optimal, seperti yang terlihat pada persamaan (7) dalam makalah.

L(y,Hi1+hi)LyHi1hiLLHi1i

L(y,Hi1+hi)L

Mengedipkan mata
sumber
Terima kasih @Winks, saya membaca makalah dan melihat apa yang Anda maksud dengan algoritma aproksimasi untuk memilih kandidat yang terbagi. Namun, apa yang Anda maksud dengan "XGBoost juga menggunakan perkiraan pada evaluasi titik perpecahan seperti itu"? Sejauh yang saya mengerti, untuk evaluasi mereka menggunakan pengurangan yang tepat dalam fungsi tujuan optimal, seperti yang terlihat pada persamaan (7) di makalah.
ihadanny
Saya mengedit jawaban saya untuk mendukung komentar Anda. Periksa Tanya Jawab ini untuk perincian lebih lanjut tentang evaluasi titik perpecahan.
Mengedipkan mata
Terima kasih banyak, @Winks! akan lebih bagus jika Anda juga bisa menjawab pertanyaan saya yang lebih terperinci di sini: datacience.stackexchange.com/q/10997/16050
ihadanny
Ini jawaban yang bagus. Tiga kali berturut-turut !
eliasah