Estoy tratando de entrenar un modelo de aumento de gradiente en más de 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á horas. Estoy usando lo mismo learning_rate
y la max_depth
configuració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)
fuente
Respuestas:
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_eps
pará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
fuente