LightGBM resulta diferente dependiendo del orden de los datos

8

Tengo dos conjuntos de datos A y B que son exactamente iguales en términos de número de columnas, nombre de columnas y valores. La única diferencia es el orden de esas columnas. Luego entreno el modelo LightGBM en cada uno de los dos conjuntos de datos con los siguientes pasos

  1. Divida cada conjunto de datos en capacitación y pruebas (use la misma semilla aleatoria y la misma proporción para A y B)
  2. Deje los hiperparámetros como predeterminados.
  3. Establecer un estado aleatorio como un número fijo (para reproducción)
  4. Ajuste la tasa de aprendizaje utilizando una búsqueda de cuadrícula
  5. Entrene un modelo LightGBM en el conjunto de entrenamiento y pruébelo en el conjunto de prueba
  6. Se elegirá la tasa de aprendizaje con el mejor rendimiento en el conjunto de pruebas

Los modelos de salida en los dos conjuntos de datos son muy diferentes, lo que me hace pensar que el orden de las columnas sí afecta el rendimiento del entrenamiento del modelo con LightGBM.

¿Sabes por qué este es el caso?

Duy Bui
fuente

Respuestas:

6

Una posible explicación es esta:

Cuando el orden de las columnas difiere, hay una pequeña diferencia en el procedimiento.

Lo que hacen LightGBM, XGBoost, CatBoost, entre otros, es seleccionar diferentes columnas de las características de su conjunto de datos en cada paso de la capacitación.

Las selecciones de estas columnas se realizan al azar: supongamos que su conjunto de datos tiene 20 columnas. El nodo raíz selecciona las características 1, 3 y 18 , en ambos conjuntos de datos, las características 1, 3 y 18 son diferentes en ambos conjuntos de datos posibles. Esto se hace repetidamente y en cada paso hay aleatoriedad que afecta su resultado final.

Juan Esteban de la calle
fuente
¿Cómo podemos controlar esa aleatoriedad cuando el algoritmo selecciona un subconjunto de características para construir un árbol de decisión? Ese también fue mi único pensamiento para responder a esta situación. Además, supongo que si siempre seleccionamos todas las características por árbol, el algoritmo usará Gini (o algo similar) para calcular la importancia de la característica en cada paso, lo que no creará una aleatoriedad.
Duy Bui
lightgbmpermite al usuario establecer las semillas aleatorias utilizadas para el muestreo de filas y columnas.
bradS
1
@bradS: No configuré la semilla como un hiperparámetro en el LightGBM, pero lo verifiqué nuevamente y las semillas deberían establecerse como un número fijo por defecto. Eso significa que debería tener el mismo resultado, que no es el caso aquí. lightgbm.readthedocs.io/en/latest/Parameters.html
Duy Bui
3

Si bien el ordenamiento de los datos es intrascendente en teoría, es importante en la práctica. Teniendo en cuenta que tomó medidas para garantizar la reproducibilidad, un orden diferente de los datos alterará su lógica de división de prueba de tren (a menos que sepa con certeza que los conjuntos de trenes y los conjuntos de pruebas en ambos casos son exactamente iguales). Aunque no especifica cómo dividir los datos, es muy posible que una cierta variedad de puntos de datos haga que la máquina sea más robusta para los valores atípicos y, por lo tanto, ofrezca un mejor rendimiento del modelo. En el caso de que los datos del tren y la prueba sean los mismos en ambos casos, es probable que tenga que ver si hay una medida de semilla / reproducibilidad (en cualquier parte de su código) que no haya tomado.

gbdata
fuente
Lo siento, olvidé mencionar eso. Actualizará mi consulta. Entrenar y probar son exactamente iguales porque los dividí usando la misma semilla aleatoria.
Duy Bui
@DuyBui algunas sugerencias para probar: 1) si está utilizando Gpu, configure gpu_use_dp como verdadero De: github.com/Microsoft/LightGBM/pull/560#issuecomment-304561654 2) establezca num_threads en un número fijo De: github.com/ Microsoft / LightGBM / issues / 632 ;
gbdata