Estou tentando treinar um modelo de aumento de gradiente com mais de 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 preocupei em tentar cultivar 500 árvores, pois levará horas. Estou usando o mesmo learning_rate
e max_depth
configuraçõ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)
fonte
Respostas:
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_eps
parâ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
fonte