Impulso y embolsado de árboles (XGBoost, LightGBM)

17

Hay muchas publicaciones de blog, videos de YouTube, etc. sobre las ideas de embolsar o impulsar árboles. Mi comprensión general es que el pseudocódigo para cada uno es:

Harpillera:

  1. Tome N muestras aleatorias de x% de las muestras y y% de las características
  2. Ajuste su modelo (p. Ej., Árbol de decisión) en cada uno de N
  3. Predecir con cada N
  4. Promedio de las predicciones para obtener la predicción final

Impulso:

  1. Ajuste su modelo (p. Ej., Árbol de decisión) a sus datos
  2. Obtener los residuos
  3. Ajuste su modelo a los residuos
  4. Ir a 2 para N rondas de refuerzo
  5. La predicción final es una suma ponderada de los predictores secuenciales.

Tomaré cualquier aclaración a mi entender más arriba, pero mi pregunta prevista es la siguiente:

Tanto XGBoost como LightGBM tienen parámetros que permiten el ensacado. La aplicación no es Bagging OR Boosting (que es de lo que habla cada publicación de blog), sino Bagging AND Boosting. ¿Cuál es el pseudocódigo para dónde y cuándo se produce el embolsado y el refuerzo combinados?

Esperaba que fuera "Árboles impulsados ​​embolsados", pero parece que es "Árboles embolsados ​​impulsados". La diferencia parece sustancial.

Árboles impulsados ​​en bolsas:

  1. Tome N muestras aleatorias de x% de las muestras y y% de las características
  2. Ajustar árboles potenciados en cada una de las N muestras
  3. Predecir con cada N
  4. Promedio de las predicciones para obtener la predicción final

Esta parece ser la mejor manera de hacerlo. Después de todo, el riesgo de aumentar es el sobreajuste y el beneficio principal del embolsado es reducir el sobreajuste; Empacar un montón de modelos potenciados parece una gran idea.

Sin embargo, al mirar, por ejemplo, el scikit-learn gradient_boosting.py (que hace una muestra de bolsas, pero no una selección aleatoria de características), y juntar algunas pequeñas pepitas en las publicaciones sobre LightGBM y XGBoost, parece que XGBoost y LightGBM funcionan de la siguiente manera:

Árboles en bolsas impulsados:

  1. Ajuste un árbol de decisión a sus datos
  2. Para i en N rondas de refuerzo:
    • Obtener los residuos
    • si modifico bag_frequency == 0 (es decir, saco cada 5 rondas):
      • Tome una sola muestra aleatoria de x% de las muestras y y% de las características; usa esta muestra aleatoria en el futuro
    • ajustar el árbol a los residuos
  3. La predicción final es una suma ponderada de los predictores secuenciales.

Corrija mi comprensión aquí y complete los detalles. El árbol embolsado reforzado (con solo 1 árbol aleatorio por frecuencia de bolsa) no parece tan poderoso como el árbol reforzado embolsado.

Jonathan
fuente
2
+1 para una pregunta interesante y muy bien formulada. Y bienvenido al sitio.
mkt - Restablecer Monica
necesita un "calcular el error" para su impulso. Hecho mal que se desmorona. Los pesos son críticos para adaboost. No es un residuo crudo. ... No estamos hablando del gradiente estocástico como sea necesario para impulsar, aunque acelera las cosas.
EngrStudent - Restablece a Monica el
Aquí está el impulsado en bolsas. En lugar de un nuevo árbol para cada paso de la serie, obtienes un nuevo bosque con un rendimiento promedio. Eugene Tuv y Kari Torkkola. jmlr.org/papers/volume10/tuv09a/tuv09a.pdf
EngrStudent - Restablece a Monica el
el impulsado en bolsas creará un bosque de conjuntos de series y tomará la producción promedio. Puede involucrar el sobreajuste que puede hacer un conjunto de serie (reforzado) y dar un resultado más robusto, pero la ganancia no va a ser enorme.
EngrStudent - Restablece a Monica el

Respuestas:

13

Ensacado: tome N muestras aleatorias de x% de las muestras y y% de las características

Las instancias se submuestrean repetidamente en Bagging , pero no en Características. ( RandomForests , XGBoost y CatBoost hacen ambas cosas):

Given dataset D of size N.
For m in n_models:
    Create new dataset D_i of size N by sampling with replacement from D.
    Train model on D_i (and then predict)
Combine predictions with equal weight 

Incluya un paso de inicialización en su pseudocódigo de refuerzo para eliminar la redundancia:

Init data with equal weights (1/N).
For m in n_model:
    Train model on weighted data (and then predict)
    Update weights according to misclassification rate.
    Renormalize weights
Combine confidence weighted predictions

Bagged Boosted Trees (como usted lo llama) es ciertamente un enfoque razonable, pero diferente de XGBoost o CatBoost :

Given dataset D of size N.
For m in n_models:
    Create new dataset D_i of size N by sampling with replacement from D.
    (Insert Boosting pseudo code here (on D_i))
Combine predictions with equal weight 

XGBoost y CatBoost se basan en Boosting y utilizan todos los datos de entrenamiento. También implementan el embolsado submuestreando una vez en cada iteración de refuerzo:

Init data with equal weights (1/N).
For m in n_model:
    Train model on weighted bootstrap sample (and then predict)
    Update weights according to misclassification rate.
    Renormalize weights
Combine confidence weighted predictions

Si desea apegarse a "ajustar el modelo a los residuos", esto sería equivalente a "ajustar el modelo a los residuales de los datos en la muestra de arranque ".


Observaciones adicionales :

No hay una " mejor manera de hacerlo " como sugiere (no hay un teorema del almuerzo gratis). Los "árboles potenciados en bolsas" podrían superar a XGBoost en ciertos conjuntos de datos.

Tome una sola muestra aleatoria de x% de las muestras

Esta línea es confusa. ¿De dónde sacaste esto?

si modifico bag_frequency == 0 (es decir, saco cada 5 rondas):

Esto no debe mencionarse en su pseudocódigo. Especialmente cuando quedan otros parámetros más importantes (como la tasa de aprendizaje para aumentar).

Laksan Nathan
fuente
(+1) ¡Buena respuesta! Para aclarar: ¿el OP es incorrecto al indicar " XGBoost y LightGBM tienen parámetros que permiten el embolsado "?
mkt - Restablecer Monica
Ambos permiten el ensacado: bagging_fraction en LightGBM y submuestra en XGBoost . No estoy seguro, por qué me referí a CatBoost todo el tiempo. Pero todos funcionan de la misma manera con respecto a la pregunta.
Laksan Nathan
Mi error, perdí la línea en su respuesta que menciona eso. ¿Podría explicar " submuestreo una vez en cada iteración de impulso "? ¿Quiere decir que en cada iteración de impulso, se toman muchas submuestras, los árboles se ajustan a cada submuestra y luego la tasa de clasificación errónea se calcula en función de los árboles empaquetados y finalmente se actualizan los pesos? Si es así, ¿podría aclarar esto en su pseudocódigo?
mkt - Restablecer Monica
No se extraen muchas submuestras, solo una: en lugar de ajustar el modelo a todas las instancias ponderadas, el modelo se entrena en una muestra de arranque.
Laksan Nathan
Con respecto a "Tomar una sola muestra aleatoria de x% de las muestras"; mejor sería "tomar una sola muestra de x% de las filas". Lo tengo de aquí .
Jonathan