Por que o xgboost é muito mais rápido que o sklearn GradientBoostingClassifier?

29

Estou tentando treinar um modelo de aumento de gradiente com mais de 50 mil exemplos com 100 recursos numéricos. XGBClassifierlida com 500 árvores em 43 segundos na minha máquina, enquanto GradientBoostingClassifierlida com apenas 10 árvores (!) em 1 minuto e 2 segundos :( Não me preocupei em tentar cultivar 500 árvores, pois levará horas. Estou usando o mesmo learning_ratee max_depthconfigurações , ver abaixo.

O que torna o XGBoost muito mais rápido? Ele usa alguma implementação inovadora para aumentar o gradiente que os sklearn não sabem? Ou é "cortar cantos" e cultivar árvores rasas?

ps Estou ciente dessa discussão: https://www.kaggle.com/c/higgs-boson/forums/t/10335/xgboost-post-competition-survey, mas não consegui encontrar a resposta lá ...

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
fonte
2
acho que em breve terei que reformulá-lo como "por que o LightGBM é muito mais rápido que o XGBoost?" :)
ihadanny

Respostas:

25

×

Meu palpite é que o maior efeito vem do fato de o XGBoost usar uma aproximação nos pontos de divisão. Se você tem um recurso contínuo com 10000 divisões possíveis, o XGBoost considera apenas "as melhores" 300 divisões por padrão (isso é uma simplificação). Esse comportamento é controlado pelo sketch_epsparâmetro e você pode ler mais sobre ele no documento . Você pode tentar abaixá-lo e verificar a diferença que faz. Como não há menção a isso na documentação do scikit-learn , acho que não está disponível. Você pode aprender qual é o método XGBoost no documento (arxiv) .

O XGBoost também usa uma aproximação na avaliação desses pontos de divisão. Não sei por qual critério o scikit learn está avaliando as divisões, mas isso poderia explicar o restante da diferença de tempo.


Comentários de endereçamento

Quanto à avaliação dos pontos de divisão

No entanto, o que você quis dizer com "XGBoost também usa uma aproximação na avaliação de tais pontos de divisão"? até onde eu entendo, para a avaliação eles estão usando a redução exata na função objetivo ideal, como aparece na eq (7) no artigo.

L(y,Hi1+hi)LyHi1hiLLHi1i

L(y,Hi1+hi)L

Winks
fonte
Obrigado @Winks, li o artigo e entendi o que você quis dizer com algoritmo de aproximação para escolher candidatos divididos. No entanto, o que você quis dizer com "XGBoost também usa uma aproximação na avaliação de tais pontos de divisão"? até onde eu entendo, para a avaliação eles estão usando a redução exata na função objetivo ideal, como aparece na eq (7) no artigo.
Ihadanny
Eu editei minha resposta para endereçar seu comentário. Verifique este Q / A para obter mais detalhes sobre a avaliação de pontos de divisão.
Winks
Muito obrigado, @Winks! Seria ótimo se você também poderia responder a minha pergunta mais elaborada aqui: datascience.stackexchange.com/q/10997/16050
ihadanny
Esta é uma ótima resposta. Hat trick !
Eliasah