¿Por qué xgboost es mucho más rápido que sklearn GradientBoostingClassifier?

29

Estoy tratando de entrenar un modelo de aumento de gradiente en más de 50k ejemplos con 100 características numéricas. XGBClassifiermaneja 500 árboles en 43 segundos en mi máquina, mientras que GradientBoostingClassifiermaneja solo 10 árboles (!) en 1 minuto y 2 segundos :( No me molesté en tratar de cultivar 500 árboles, ya que tomará horas. Estoy usando lo mismo learning_ratey la max_depthconfiguración , vea abajo.

¿Qué hace que XGBoost sea mucho más rápido? ¿Utiliza alguna implementación novedosa para aumentar el gradiente que los chicos de sklearn no conocen? ¿O es "cortar esquinas" y cultivar árboles menos profundos?

PD Estoy al tanto de esta discusión: https://www.kaggle.com/c/higgs-boson/forums/t/10335/xgboost-post-competition-survey pero no pude obtener la respuesta allí ...

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
fuente
2
supongo que pronto tendré que reformularlo como "¿por qué LightGBM es mucho más rápido que XGBoost?" :)
ihadanny

Respuestas:

25

Como menciona características "numéricas", supongo que sus características no son categóricas y tienen una alta aridad (pueden tomar muchos valores diferentes y, por lo tanto, hay muchos puntos de división posibles). En tal caso, cultivar árboles es difícil ya que hay [muchas características muchos puntos de división] para evaluar.×

Supongo que el mayor efecto proviene del hecho de que XGBoost usa una aproximación en los puntos divididos. Si tiene una función continua con 10000 divisiones posibles, XGBoost considera solo "las mejores" 300 divisiones por defecto (esto es una simplificación). Este comportamiento está controlado por el sketch_epsparámetro, y puede leer más al respecto en el documento . Puedes intentar bajarlo y comprobar la diferencia que hace. Como no se menciona en la documentación de scikit-learn , supongo que no está disponible. Puede aprender qué método XGBoost está en su documento (arxiv) .

XGBoost también utiliza una aproximación en la evaluación de dichos puntos divididos. No sé por qué criterio scikit learn está evaluando las divisiones, pero podría explicar el resto de la diferencia horaria.


Comentarios de dirección

En cuanto a la evaluación de puntos de división

Sin embargo, ¿qué quiso decir con "XGBoost también utiliza una aproximación en la evaluación de dichos puntos de división"? Según tengo entendido, para la evaluación están utilizando la reducción exacta en la función objetivo óptima, como aparece en la ecuación (7) en el documento.

L(y,Hyo-1+hyo)LyHyo-1hyoLLHyo-1yo

L(y,Hyo-1+hyo)L

Guiños
fuente
Gracias @Winks, leí el periódico y veo qué querías decir con el algoritmo de aproximación para elegir candidatos divididos. Sin embargo, ¿qué quiso decir con "XGBoost también utiliza una aproximación en la evaluación de dichos puntos de división"? Según tengo entendido, para la evaluación están utilizando la reducción exacta en la función objetivo óptima, como aparece en la ecuación (7) en el documento.
ihadanny
Edité mi respuesta para abordar su comentario. Consulte este Q / A para obtener más detalles sobre la evaluación de los puntos de división.
Guiños
Muchas gracias, @Winks! sería genial si también pudieras responder mi pregunta más elaborada aquí: datascience.stackexchange.com/q/10997/16050
ihadanny
Esta es una respuesta genial. Truco de sombrero !
eliasah