XGBoost (y otras rutinas de máquinas de aumento de gradiente también) tiene una serie de parámetros que se pueden ajustar para evitar el sobreajuste. Mencionaré algunos de los más obvios. Por ejemplo, podemos cambiar:
- la proporción de características utilizadas (es decir, columnas utilizadas);
colsample_bytree
. Las proporciones más bajas evitan el sobreajuste.
- la proporción de instancias de entrenamiento utilizadas (es decir, filas utilizadas);
subsample
. Las proporciones más bajas evitan el sobreajuste.
- la profundidad máxima de un árbol;
max_depth
. Valores más bajos evitan el sobreajuste.
- la reducción mínima de la pérdida requerida para realizar una división adicional;
gamma
. Valores más grandes evitan el sobreajuste.
- la tasa de aprendizaje de nuestro GBM (es decir, cuánto actualizamos nuestra predicción con cada árbol sucesivo);
eta
. Valores más bajos evitan el sobreajuste.
- la suma mínima del peso de la instancia necesaria en una hoja, en ciertas aplicaciones esto se relaciona directamente con el número mínimo de instancias necesarias en un nodo;
min_child_weight
. Valores más grandes evitan el sobreajuste.
Esta lista no es exhaustiva y recomendaría encarecidamente consultar la documentación de XGBoost para obtener información sobre otros parámetros. Tenga en cuenta que tratar de evitar el sobreajuste podría llevar a subajuste, donde regularizamos demasiado y no logramos aprender información relevante. En ese sentido, uno podría considerar el uso de un conjunto de validación separado o simplemente validación cruzada (a través de xgboost.cv()
por ejemplo) para monitorear el progreso del GBM a medida que se realizan más iteraciones (es decir, se agregan aprendices base). De esa manera, los problemas de sobreajuste potencial pueden detectarse temprano. Esto se relaciona estrechamente con el uso de detención temprana como una forma de regularización; XGBoost ofrece un argumento early_stopping_rounds
que es relevante en este caso.
Finalmente, también señalaría que el desequilibrio de clases reportado (85-15) no es realmente grave. Usar el valor predeterminado scale_pos_weight
de 1 probablemente sea adecuado.