Estoy tratando de entrenar un modelo de aumento de gradiente en 50k ejemplos con 100 características numéricas. XGBClassifier maneja 500 árboles en 43 segundos en mi máquina, mientras que GradientBoostingClassifier maneja solo 10 árboles (!) en 1 minuto y 2 segundos 🙁 No me molesté en tratar de cultivar 500 árboles, ya que tomaría horas. Estoy usando la misma configuración de learning_rate y max_depth, consulte a continuación.

Lo que hace que XGBoost ¿Utiliza alguna implementación novedosa para aumentar el gradiente que los chicos de sklearn no conocen? ¿O se trata de «recortar atajos» y hacer crecer árboles menos profundos?

PS 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) 

Comentarios

  • Supongo que ' pronto tendré que reformularlo como " ¿por qué LightGBM es mucho más rápido que XGBoost? " 🙂

Responder

Ya que mencionaste «numérico «características, supongo que sus características no son categóricas y tienen una aridad alta (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 $ \ veces $ muchos puntos de división] para evaluar.

Supongo que el mayor efecto proviene del hecho de que XGBoost utiliza una aproximación en los puntos de división. Si tiene una función continua con 10000 divisiones posibles, XGBoost considera sólo «las mejores» 300 divisiones por defecto (esto es una simplificación). Este comportamiento está controlado por el parámetro sketch_eps, y puedes leer más sobre él en el documento . Puedes intentar bajarlo y comprobar la diferencia. Como no se menciona en la documentación de scikit-learn , supongo que no está disponible. Puede aprender qué es el método XGBoost en su artículo (arxiv) .

XGBoost también usa una aproximación en la evaluación de tales puntos de división . No sé con qué criterio scikit learn está evaluando las divisiones, pero podría explicar el resto de la diferencia de tiempo.


Comentarios de dirección

Con respecto a la evaluación de los puntos de división

Sin embargo, ¿a qué te refieres con «XGBoost también utiliza una aproximación en la evaluación de tales puntos de división»? Según tengo entendido, para la evaluación están usando la reducción exacta en la función objetivo óptima, como aparece en la ecuación (7) en el documento.

Para evaluar el punto de división, tendría que calcular $ L (y, H_ {i-1} + h_i) $ donde $ L $ es la función de costo, $ y $ el objetivo, $ H_ {i- 1} $ el modelo construido hasta ahora y $ h_i $ la adición actual. Tenga en cuenta que esto no es lo que está haciendo XGBoost; están simplificando la función de costo $ L $ mediante una expansión de Taylor, lo que conduce a una función muy simple de calcular. Tienen que calcular el gradiente y el hessian de $ L $ con respecto a $ H_ {i-1} $, y pueden reutilizar ese número para todas las posibles divisiones en la etapa $ i $, lo que agiliza el cálculo general. Puede consultar Aproximación de función de pérdida con expansión de Taylor (Q / A con validación cruzada) para obtener más detalles, o la derivación en su artículo.

El El punto es que han encontrado una manera de aproximar $ L (y, H_ {i-1} + h_i) $ de manera eficiente. Si tuviera que evaluar $ L $ completamente, sin un conocimiento interno que permita la optimización, la evasión o el cálculo redundante, tomaría más tiempo por división. En este sentido, es una aproximación. Sin embargo, otras implementaciones de aumento de gradiente también utilizan funciones de coste proxy para evaluar las divisiones, y no sé si la aproximación de XGBoost es más rápida en este sentido que en las demás.

Comentarios

  • Gracias @Winks, leí el artículo y veo lo que quiere decir con el algoritmo de aproximación para elegir candidatos divididos. Sin embargo, ¿qué quisiste decir con " XGBoost también utiliza una aproximación en la evaluación de dichos puntos de división "? hasta donde tengo entendido, para la evaluación están usando la reducción exacta en la función objetivo óptima, como aparece en la ecuación (7) en el documento.
  • Edité mi respuesta para abordar su comentario. Consulte esta Q / A para obtener más detalles sobre la evaluación de los puntos de división.
  • ¡Muchas gracias, @Winks! sería genial si también pudiera responder mi pregunta más elaborada aquí: datascience.stackexchange.com/q/10997/16050
  • Esta es una gran respuesta. ¡Hat-trick!

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *