Estou tentando treinar um modelo de aumento de gradiente em 50 mil exemplos com 100 recursos numéricos. XGBClassifier lida com 500 árvores em 43 segundos na minha máquina, enquanto GradientBoostingClassifier lida com apenas 10 árvores (!) em 1 minuto e 2 segundos 🙁 Não me incomodei em tentar cultivar 500 árvores, pois isso levaria horas. Estou usando as mesmas configurações learning_rate e max_depth, veja abaixo.

O que torna o XGBoost tanto mais rápido? Ele usa alguma implementação nova para aumentar gradiente que os caras do sklearn não conhecem? Ou é “cortar cantos” e cultivar árvores mais rasas?

ps Estou ciente desta discussão: https://www.kaggle.com/c/higgs-boson/forums/t/10335/xgboost-post-competition-survey mas não consegui obter 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) 

Comentários

  • acho que ' em breve terei que reformulá-lo como " por que o LightGBM é tão mais rápido que o XGBoost? " 🙂

Resposta

Já que você mencionou “numérico “, acho que seus recursos não são categóricos e têm uma alta aridade (eles podem assumir muitos valores diferentes e, portanto, há muitos pontos de divisão possíveis). Nesse caso, cultivar árvores é difícil, pois há [muitos recursos $ \ times $ muitos pontos de divisão] para avaliar.

Meu palpite é que o maior efeito vem do fato de que o XGBoost usa uma aproximação nos pontos de divisão. Se você tiver um recurso contínuo com 10.000 divisões possíveis, o XGBoost considera apenas “as melhores” 300 divisões por padrão (esta é uma simplificação). Este comportamento é controlado pelo parâmetro sketch_eps, e você pode ler mais sobre isso no documento . Você pode tentar baixá-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 seu artigo (arxiv) .

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


Comentários de abordagem

Em relação à avaliação dos pontos de divisão

No entanto, o que você quis dizer com “O 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 ótima, como aparece na eq (7) do artigo.

Para avaliar o ponto de divisão, você teria que calcular $ L (y, H_ {i-1} + h_i) $ onde $ L $ é a função de custo, $ y $ o alvo, $ H_ {i- 1} $ o modelo construído até agora, e $ h_i $ a adição atual. Observe que não é isso que o XGBoost está fazendo; eles estão simplificando a função de custo $ L $ por uma expansão de Taylor, o que leva a uma função muito simples de calcular. Eles têm que calcular o gradiente e o hessiano de $ L $ em relação a $ H_ {i-1} $ e podem reutilizar esses números para todas as divisões potenciais no estágio $ i $, tornando o cálculo overral mais rápido. Você pode verificar Aproximação da função de perda com expansão de Taylor (CrossValidated Q / A) para mais detalhes, ou a derivação em seu artigo.

O O ponto é que eles encontraram uma maneira de aproximar $ L (y, H_ {i-1} + h_i) $ de forma eficiente. Se você fosse avaliar $ L $ totalmente, sem conhecimento interno que permitisse otimização ou evasão ou computação redundante, demoraria mais tempo por divisão. Nesse sentido, é uma aproximação. No entanto, outras implementações de aumento de gradiente também usam funções de custo de proxy para avaliar as divisões, e não sei se a aproximação de XGBoost é mais rápida nesse aspecto do que as outras.

Comentários

  • Obrigado @Winks, li o artigo e vi 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 "? Pelo que eu entendi, para a avaliação eles estão usando a redução exata na função objetivo ótima, como aparece na eq (7) do artigo.
  • Eu editei minha resposta para abordar seu comentário. Verifique esta P / A para obter mais detalhes sobre a avaliação dos pontos de divisão.
  • Muito obrigado, @Winks! seria ótimo se você também pudesse responder minha pergunta mais elaborada aqui: datascience.stackexchange.com/q/10997/16050
  • Este é uma ótima resposta. Hat-trick!

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *