Discusión sobre overfit en xgboost

20

Mi configuración es la siguiente:

Estoy siguiendo las pautas en "Modelado predictivo aplicado". Por lo tanto, he filtrado características correlacionadas y termino con lo siguiente:

  • 4900 puntos de datos en el conjunto de entrenamiento y 1600 puntos de datos en el conjunto de prueba.
  • Tengo 26 características y el objetivo es una variable continua.

Aplico la validación cruzada de 5 veces para entrenar modelos usando el caretpaquete. Cuando aplico un modelo MARS obtengo un error absoluto medio (MAE) de aproximadamente 4 en el conjunto de entrenamiento y en el conjunto de pruebas.

Sin embargo, al aplicar xgboost (ya sea el algoritmo de árbol o el lineal) obtengo algo así como 0.32 (!) En el conjunto de entrenamiento y 2.4 en el conjunto de prueba.

Por lo tanto, si el error de prueba es 8 veces el error de entrenamiento, entonces diría: he sobreajustado los datos de entrenamiento. Aún así obtengo un error menor en la prueba de todos modos.

Yo uso los siguientes parámetros en xgboost:

  • nrounds = 1000y eta = 0.01(aumentar los alrededores y disminuir el eta podría ayudar, pero me quedo sin memoria y el tiempo de ejecución es demasiado largo)
  • max_depth = 16: si comparo otras publicaciones y el valor predeterminado de 6, entonces esto parece grande pero el problema es bastante complejo; tal vez 16 no es demasiado grande en este caso.
  • colsample_bytree = 0.7, subsample = 0.8y min_child_weight = 5: haciendo esto trato de reducir el sobreajuste.

Si reduzco max_depth, el tren y el error de prueba se acercan, pero todavía hay una gran brecha y el error de prueba es mayor (un poco por encima de 3).

Usando el amplificador lineal obtengo aproximadamente el mismo tren y error de prueba en los parámetros óptimos:

  • lambda = 90 y `alpha = 0: encontrado por validación cruzada, lambda debería evitar el sobreajuste.
  • colsample_bytree = 0.8, subsample = 0.8y min_child_weight = 5: haciendo esto trato de reducir el sobreajuste.

Mi sensación es que xgboost todavía se sobreajusta, pero el error de entrenamiento y hasta donde puedo ver en la prueba en tiempo real (he usado los modelos xgboost y un conjunto de ellos en realidad durante 4 días) parece correcto (el error es más grande que el error de prueba, pero hay más incertidumbre en la vida real sobre el pronóstico de las características y otras variables).

¿Qué opinas: puedo aceptar sobreajuste si (si esto es posible) el rendimiento en la vida real es superior? ¿Xgboost en mi entorno tiende a sobreajustar?

Ric
fuente

Respuestas:

34

¿El ajuste excesivo es tan malo que no debe elegir un modelo que se ajuste demasiado, a pesar de que su error de prueba es menor? No. Pero deberías tener una justificación para elegirlo.

Este comportamiento no está restringido a XGBoost. Es un hilo común entre todas las técnicas de aprendizaje automático; Encontrar el equilibrio correcto entre el ajuste y el sobreajuste. La definición formal es la compensación de variación de sesgo (Wikipedia) .

El equilibrio de sesgo-varianza

La siguiente es una simplificación de la compensación de Bias-varianza, para ayudar a justificar la elección de su modelo.

  • Decimos que un modelo tiene un alto sesgo si no puede usar completamente la información en los datos. Depende demasiado de la información general, como el caso más frecuente, la media de la respuesta o algunas características potentes. El sesgo puede provenir de supuestos erróneos, por ejemplo, suponiendo que las variables están normalmente distribuidas o que el modelo es lineal.

  • Decimos que un modelo tiene una alta varianza si está usando demasiada información de los datos. Se basa en información que es reveladora solo en el conjunto de entrenamiento que se le ha presentado, que no se generaliza lo suficientemente bien. Por lo general, el modelo cambiará mucho si cambia el conjunto de entrenamiento, de ahí el nombre de "alta variación".

Esas definiciones son muy similares a las definiciones de ajuste y sobreajuste. Sin embargo, esas definiciones a menudo están demasiado simplificadas para ser opuestas, como en

  • El modelo no está ajustado si tanto el error de entrenamiento como el de prueba son altos. Esto significa que el modelo es demasiado simple.
  • El modelo se sobreajusta si el error de prueba es mayor que el error de entrenamiento. Esto significa que el modelo es demasiado complejo.

Esas simplificaciones son, por supuesto, útiles, ya que ayudan a elegir la complejidad correcta del modelo. Pero pasan por alto un punto importante, el hecho de que (casi) cada modelo tiene un componente de sesgo y de varianza. La descripción de subalimentación / sobreajuste le dice que tiene demasiado sesgo / demasiada variación, pero que (casi) siempre tiene ambos .

Si desea obtener más información sobre el equilibrio de sesgo-varianza, son una gran cantidad de visualización útil y un buen recurso disponible a través de Google. Cada libro de texto de aprendizaje automático tendrá una sección sobre el equilibrio de sesgo-varianza, aquí hay algunos

  • Una introducción al aprendizaje estadístico y a los Elementos del aprendizaje estadístico (disponible aquí) .
  • Reconocimiento de patrones y aprendizaje automático, por Christopher Bishop.
  • Aprendizaje automático: una perspectiva probabilística, por Kevin Murphy.

Además, una buena publicación de blog que me ayudó a comprender es el Entendimiento de Scott Fortmann-Roe Comprender el Bias-Varianza .

Aplicación a tu problema

Entonces tienes dos modelos,

Tren MAEPrueba MAEMARTE4.0 4.04.0 4.0Baja varianza, mayor sesgo,XGBoost0,32.4Mayor varianza, menor sesgo,

y necesitas elegir uno. Para hacerlo, debe definir qué es un mejor modelo. Los parámetros que deben incluirse en sus decisiones son la complejidad y el rendimiento del modelo.

  • ¿Cuántas "unidades" de complejidad está dispuesto a cambiar por una "unidad" de rendimiento?
    • Más complejidad se asocia con una mayor varianza. Si desea que su modelo se generalice bien en un conjunto de datos que sea un poco diferente al que ha entrenado, debe apuntar a una menor complejidad.
    • Si desea un modelo que pueda entender fácilmente, puede hacerlo a costa del rendimiento al reducir la complejidad del modelo.
    • Si está buscando el mejor rendimiento en un conjunto de datos que sabe que proviene del mismo proceso generativo que su conjunto de entrenamiento, puede manipular la complejidad para optimizar su error de prueba y usar esto como una métrica. Esto sucede cuando su conjunto de entrenamiento se muestrea aleatoriamente de un conjunto más grande, y su modelo se aplicará en este conjunto. Este es el caso en la mayoría de las competencias de Kaggle, por ejemplo.

El objetivo aquí no es encontrar un modelo que "no se sobreajuste". Es encontrar el modelo que tiene la mejor compensación de sesgo-varianza. En este caso, argumentaría que la reducción en el sesgo logrado por el modelo XGBoost es lo suficientemente buena como para justificar el aumento de la varianza.

Qué puedes hacer

Sin embargo, probablemente pueda hacerlo mejor ajustando los hiperparámetros.

  • Aumentar el número de rondas y reducir la tasa de aprendizaje es una posibilidad. Algo que es "extraño" sobre el aumento de gradiente es que ejecutarlo más allá del punto donde el error de entrenamiento ha llegado a cero parece mejorar aún más el error de prueba (como se discute aquí: ¿Es más profundo mejor solo cuando superficial es bueno? ). Puede intentar entrenar su modelo un poco más en su conjunto de datos una vez que haya configurado los otros parámetros,

  • La profundidad de los árboles que creces es un muy buen lugar para comenzar. Debe tener en cuenta que por cada unidad de profundidad, duplica el número de hojas que se construirán. Si tuviera que cultivar árboles de tamaño dos en lugar de tamaño 16, tomaría1/ /214¡del tiempo! Deberías intentar cultivar árboles más pequeños. La razón es que la profundidad del árbol debe representar el grado de interacción de la característica . Esto puede ser jerga, pero si sus características tienen un grado de interacción de 3 (Aproximadamente: una combinación de 4 características no es más poderosa que una combinación de 3 de esas características + la cuarta), entonces el crecimiento de árboles de tamaño mayor que 3 es perjudicial. Dos árboles de profundidad tres tendrán más poder de generalización que un árbol de profundidad cuatro. Este es un concepto bastante complicado y no lo abordaré en este momento, pero puede consultar esta colección de documentos para comenzar. Además, tenga en cuenta que los árboles profundos conducen a una gran variación.

  • Usar submuestreo, conocido como embolsado , es excelente para reducir la variación. Si sus árboles individuales tienen una alta varianza, el ensacado promediará los árboles y el promedio tiene menos varianza que los árboles individuales. Si, después de ajustar la profundidad de sus árboles, aún encuentra una gran variación, intente aumentar el submuestreo (es decir, reduzca la fracción de datos utilizada). El submuestreo del espacio de características también logra este objetivo.

Guiños
fuente
1
Uno no debería comentar diciendo "gracias" pero por esta larga e interesante respuesta me gustaría decir "gracias". Ya sabía algo sobre algunas de las cosas que escribes, pero esto fue muy bien organizado. Revisaré algunas de sus referencias y cultivaré nuevos árboles y tal vez regrese con un comentario. Por ahora: gracias! ¡Excelente!
Ric
¡El enlace a la página de interacciones stat.columbia.edu/~jakulin/Int es realmente genial!
Ric
Seguí su consejo y limité la profundidad de los árboles a 3, pero tomé alrededor de 1200 y el resultado se siente genial: cálculos muy rápidos, diferencia entre el tren y la prueba reducida y aún en un buen nivel. El resto de la historia está aquí: stats.stackexchange.com/questions/205858/…
Ric