Xgboost neden GradientBoostingClassifier'ı sklearn'den çok daha hızlı?


29

100 sayısal özellikli 50k örneklerin üzerinde bir degrade yükseltme modeli yetiştirmeye çalışıyorum. XGBClassifieriken benim makinede 43 saniye içinde kolları 500 ağaçları, GradientBoostingClassifierkolları sadece 10 ağaç (!) 1 dakika ve 2 saniye :( Ben rahatsız etmedi o saat sürer olarak 500 ağaç büyümeye çalışan. Aynı kullanıyorum learning_rateve max_depthayarları , aşağıya bakınız.

XGBoost'u bu kadar hızlı yapan şey nedir? Sklearn adamlarının bilmediği degrade artırımı için yeni bir uygulama kullanıyor mu? Yoksa "köşeleri kesmek" ve daha sığ ağaçları büyütmek mi?

ps Bu tartışmanın farkındayım: https://www.kaggle.com/c/higgs-boson/forums/t/10335/xgboost-post-competition-survey ama yanıtı bulamadım ...

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
sanırım yakında "LightGBM neden XGBoost'tan daha hızlı?" olarak tekrar ifade etmem gerekecek. :)
ihadanny

Yanıtlar:


25

"Nümerik" özelliklerden bahsettiğinizden beri, özelliklerinizin kategorik olmadığını ve yüksek bir ariteye sahip olduklarını düşünüyorum (çok fazla farklı değer alabilirler ve bu nedenle birçok olası bölünme noktası vardır). Böyle bir durumda, ağaçların yetiştirilmesi zordur, çünkü değerlendirmek için [birçok özellik birçok bölünmüş nokta vardır].×

Benim tahminim, en büyük etkinin XGBoost'un bölünme noktalarında yaklaşık bir değer kullanması gerçeğinden kaynaklanıyor. 10000 olası bölmeyle sürekli bir özelliğiniz varsa, XGBoost varsayılan olarak yalnızca "en iyi" 300 bölmeyi dikkate alır (bu bir basitleştirmedir). Bu davranış sketch_epsparametre tarafından kontrol edilir ve onunla ilgili daha fazla bilgiyi dokümanda okuyabilirsiniz . Düşürmeyi deneyebilir ve yaptığı farkı kontrol edebilirsiniz. Scikit-learn belgelerinde bundan söz edilmediği için , sanırım mevcut değil. XGBoost yönteminin kağıtlarında ne olduğunu öğrenebilirsiniz (arxiv) .

XGBoost ayrıca bu bölünmüş noktaların değerlendirilmesinde bir yaklaşım kullanır. Hangi ölçüt bilim dalının öğrendiğini bölücülerin değerlendirdiğini bilmiyorum, ama zaman farkının kalanını açıklayabilir.


Adres Yorumları

Bölünmüş puanların değerlendirilmesi ile ilgili olarak

Ancak, "XGBoost ayrıca bu bölünmüş puanların değerlendirilmesinde bir yaklaşım kullanıyor" derken ne demek istediniz? Anladığım kadarıyla, değerlendirme için makalede, (7) 'de göründüğü gibi, optimal amaç fonksiyonunda tam bir azaltma kullanıyorlar.

noktasını değerlendirmek için, yi hesaplamanız gerekir; burada , maliyet fonksiyonudur ; hedef, , , şimdiye kadar oluşturulan model ve Geçerli ekleme . Bunun XGBoost'un yaptığı şey olmadığına dikkat edin; Onlar hesaplamak için çok basit bir fonksiyona yol açan bir Taylor Expansion tarafından maliyet fonksiyonunu basitleştiriyorlar . göre Gradient ve nin Hessian'ını hesaplamaları gerekir ve bu sayıyı, aşamasındaki tüm potansiyel bölmeler için tekrar kullanabilirler , bu da aşırı hesaplamayı hızlandırır. Kontrol edebilirsinL(y,Hi1+hi)LyHi1hiLLHi1iKayıp fonksiyonu Yaklaşım ve daha fazla ayrıntı için Taylor Genişlemesi (CrossValidated Q / A) ile veya kağıtlarındaki türevlendirme.

Mesele şu ki verimli bir şekilde yaklaştırmanın bir yolunu . tamamen değerlendirmek durumundaysanız , optimizasyon veya kaçınma veya yedekli hesaplamaya izin veren içeriden bilgi sahibi olmadan, bölünme başına daha fazla zaman alacaktır. Bu konuda, bir yaklaşımdır. Bununla birlikte, diğer gradyan arttırma uygulamaları da bölünmeleri değerlendirmek için bir vekil maliyet fonksiyonlarını kullanmaktadır ve XGBoost yaklaşımının bu konuda diğerlerinden daha hızlı olup olmadığını bilmiyorum.L(y,Hi1+hi)L


Teşekkürler @Winks, kağıdı okudum ve bölünmüş adayları seçerken yaklaşık algoritma ile ne demek istediğinizi anladım. Ancak, "XGBoost ayrıca bu bölünmüş puanların değerlendirilmesinde bir yaklaşım kullanıyor" derken ne demek istediniz? Anladığım kadarıyla, değerlendirme için makalede, (7) 'de göründüğü gibi, optimal amaç fonksiyonunda tam bir azaltma kullanıyorlar.
ihadanny

Yorumunuzu iletmek için cevabımı düzenledim. Giriş Bu S / A bölünmüş puan değerlendirilmesi hakkında daha fazla ayrıntı için.
Win

Çok teşekkürler, @Winks! burada daha ayrıntılı sorularıma da cevap verebilirseniz çok iyi olur: datascience.stackexchange.com/q/10997/16050
ihadanny

Bu harika bir cevap. Üst üste üç sayı !
eliasah
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.