XGBoost revolucionó el Machine Learning en 2016 y a día de hoy, ni tan siquiera las redes neuronales han logrado superarlo en aplicaciones con datos tabulares.
Sigue siendo el Rey 👑.
XGBoost is all you need.
En este tutorial, vamos a analizar XGBoost al detalle para que la próxima vez que lo utilices no solo entiendas cómo funciona, sino que aprendas a exprimirlo a tope.
Hablaremos de:
Ya sea que estés empezando en el mundo del Machine Learning o quieras dominar XGBoost para subir de nivel, este tutorial tiene todo lo que necesitas.
¡Acomódate que vamos a exprimir el poder de este algoritmo al máximo!
Ya hemos hablado de las técnicas de ensemble en el podcast y en el tutorial de Random Forest.
Las técnicas de ensemble son una forma de combinar varios modelos para obtener un resultado más preciso que el de cualquier modelo individual. Me gusta verlo como el comodín del público.
Dentro de estas técnicas está el Boosting.
Mientras que otros métodos como Bagging (por ejemplo, Random Forest) se centran en reducir la varianza mediante la combinación de múltiples modelos independientes, Boosting trabaja en cadena.
Cada modelo se entrena para corregir los errores del modelo anterior, poniendo más atención en las observaciones difíciles.
El objetivo es transformar varios modelos débiles en uno muy potente.
¿Y dónde entra XGBoost?
XGBoost es una implementación avanzada de Gradient Boosting que ha ganado popularidad por su rendimiento superior en competiciones de machine learning como Kaggle.
XGBoost es un modelo de Machine Learning que combina árboles de decisión y técnicas de ensemble.
Así que ya tenemos sus dos características principales:
XGBoost está basado en el modelo Gradient Boosting pero podríamos decir que es una versión vitaminada (💪), de ahí que XGBoost venga de Extreme Gradient Boosting.
Para entender cómo funciona XGBoost antes vamos a ver rápidamente el método de Gradient Boosting:
Te voy a explicar brevemente cómo funciona el algoritmo Gradient Boosting.
Presta atención porque los principios de XGBoost son los mismos 👀.
1
si la observación pertenece a la clase positiva.0
si la observación no pertenece a la clase positiva.Ahora que ya sabemos la base sobre la que se construye XGBoost, vamos a por la parte “vitaminada” 🚀:
🔑 Como ves, XGBoost es más rápido y generaliza mejor ya que incorpora regularización de serie.
Igual que vimos en el caso del algoritmo de Random Forest, XGBoost también incorpora los hiperparámetros de los árboles de decisión como la profundidad del árbol o el número de observaciones que tiene que haber para que podamos hacer una nueva división del árbol.
Por otro lado, al ser XGBoost una versión vitaminada del algoritmo Gradient Boosting, también hereda sus hiperparámetros y, luego, tiene sus propios hiperparámetros (como los relacionados con la regularización).
A continuación te explico algunos de los principales hiperparámetros de XGBoost, pero ten en cuenta que no son los únicos. Si quieres ver una lista extensiva de los hiperparámetros de XGBoost puedes consultar la documentación oficial.
n_estimators
: Número total de árboles en el modelo.learning_rate
: Tasa de aprendizaje que ajusta la contribución de cada árbol.max_depth
: Profundidad máxima de los árboles.min_child_weight
: Peso mínimo requerido en un nodo hoja para que pueda dividirse.gamma
(o min_split_loss
): Reducción mínima de pérdida necesaria para permitir una división.Nombre | Valor predeterminado | Rango | Efecto | Notas/Consejos |
---|---|---|---|---|
n_estimators | 100 | [1, inf) | Aumentar este valor puede mejorar los resultados con conjuntos de datos grandes. | Número de árboles en el conjunto (ensemble). |
learning_rate | 0.3 | (0, inf) | Disminuir este valor ayuda a prevenir el sobreajuste (overfitting). | Reduce los pesos de los árboles en cada ronda de boosting. |
max_depth | 6 | [0, inf) | Disminuir este valor ayuda a prevenir el sobreajuste (overfitting). | La profundidad máxima del árbol. |
gamma (alias: min_split_loss ) | 0 | [0, inf) | Incrementar este valor ayuda a prevenir el sobreajuste (overfitting). | Valores bajos, generalmente menores a 10, son estándar. |
min_child_weight | 1 | [0, inf) | Incrementar este valor ayuda a prevenir el sobreajuste (overfitting). | El mínimo de pesos requeridos para que un nodo se divida. |
subsample
: Fracción de filas del conjunto de datos que se utilizan en cada árbol.colsample_bytree
: Porcentaje de características (columnas) seleccionadas aleatoriamente para cada árbol.colsample_bylevel
: Porcentaje de características seleccionadas para cada nivel del árbol.colsample_bynode
: Porcentaje de características seleccionadas para cada nodo.Nombre | Valor predeterminado | Rango | Efecto | Notas/Consejos |
---|---|---|---|---|
subsample | 1 | (0, 1] | Disminuir este valor ayuda a prevenir el sobreajuste (overfitting). | Limita el porcentaje de filas de entrenamiento utilizadas en cada ronda de boosting. |
colsample_bytree | 1 | (0, 1] | Disminuir este valor ayuda a prevenir el sobreajuste (overfitting). | Limita el porcentaje de columnas de entrenamiento utilizadas en cada ronda de boosting. |
colsample_bylevel | 1 | (0, 1] | Disminuir este valor ayuda a prevenir el sobreajuste (overfitting). | Limita el porcentaje de columnas utilizadas para cada nivel de profundidad del árbol. |
colsample_bynode | 1 | (0, 1] | Disminuir este valor ayuda a prevenir el sobreajuste (overfitting). | Limita el porcentaje de columnas evaluadas para dividir los nodos. |
lambda
: Regularización L2 (Ridge) aplicada a los coeficientes del modelo.alpha
: Regularización L1 (Lasso) aplicada a los coeficientes del modelo.Nombre | Valor predeterminado | Rango | Efecto | Notas/Consejos |
---|---|---|---|---|
lambda | 1 | [0, inf) | Incrementar este valor ayuda a prevenir el sobreajuste (overfitting). | Regularización L2 de los pesos. |
alpha | 0 | [0, inf) | Incrementar este valor ayuda a prevenir el sobreajuste (overfitting). | Regularización L1 de los pesos. |
scale_pos_weight
: Peso relativo entre las clases positivas y negativas (útil en problemas de clasificación binaria).max_delta_step
: Restringe el tamaño de las actualizaciones en problemas desbalanceados.Nombre | Valor predeterminado | Rango | Efecto | Notas/Consejos |
---|---|---|---|---|
scale_pos_weight | 1 | (0, inf) | Se utiliza para equilibrar conjuntos de datos desbalanceados. | |
max_delta_step | 0 | [0, inf) | Incrementar este valor ayuda a prevenir el sobreajuste (overfitting). | Solo recomendado para conjuntos de datos muy desbalanceados. |
¡Enhorabuena por llegar hasta aquí! 👏👏👏
Te he soltado un buen turrón sobre XGBoost.
Pero ya estás ready para la parte práctica.
Aquí empieza la chicha… 🥷
Con nuestro dataset ya preparado, es hora de pasar a la acción: entrenar el modelo XGBoost.
Aquí veremos cómo configurar el algoritmo para aprovechar al máximo sus capacidades y adaptarlo a las características de nuestro problema.
Si te fijas, hasta el momento no hemos tocado ni un solo hiperparámetro de XGBoost.
Hemos usado los que vienen por defecto y aun así hemos conseguido una precisión de 0.79 😌
No está mal.
Peeeero sabemos que XGBoost tiene mucho más potencial.
Ajustar los hiperparámetros nos permite sacar el máximo rendimiento del modelo, adaptándolo específicamente a las características de nuestros datos.
Desde la profundidad de los árboles hasta la tasa de aprendizaje, cada parámetro influye en cómo aprende el modelo y en su capacidad para generalizar correctamente.
En esta sección, te voy a enseñar cómo buscar la combinación óptima de hiperparámetros usando RandomizedSearchCV, una función de Scikit learn que simplifica el proceso y ahorra tiempo al explorar varais confirguracoines de hiperparámetros al azar y quedarse con las mejores.
Al final, la única manera de saber qué valor asignar a un hiperparámetro para mejorar el rendimiento del modelo es: probarlo.
Con el ajuste de hiperparámetros hemos mejorado la precisión del modelo a 0.83 🎉
¡Enhorabuena!
En el dataset que hemos usado para este tutorial no ha hecho falta porque era pequeñito... pero si estás trabajando con datasets grandes, el tiempo de entrenamiento puede ser muuuuuy laaargo 👵🏻⏳...
Por suerte, XGBoost ofrece soporte nativo para GPUs, lo que permite acelerar significativamente el entrenamiento (especialmente si vas a construir un XGBoost con muchos árboles...).
En esta sección, aprenderás cómo configurar XGBoost para aprovechar la potencia de una GPU y no sentir como envejeces mientras entrenas tu modelo.
Habilitar el uso de GPUs con XGBoost es muy sencillo.
Tanto Random Forest como XGBoost son algoritmos muy potentes para tareas de machine learning y ambos están basados en lo mismo: árboles de decisión y técnicas de ensemble.
Sin embargo, funcionan de manera muy diferente.
Random Forest es un algoritmo basado en bagging, donde se entrenan múltiples árboles de decisión independientes en subconjuntos del dataset.
La predicción final se obtiene combinando las salidas de todos los árboles por lo que el rendimiento del modelo está limitado por el rendimiento de los árboles que componen el bosque.
Además, Random Forest puede sobreajustarse si la mayoría de los árboles reciben subconjuntos de datos similares o si se permiten árboles muy profundos. Aunque el bagging ayuda a mitigar el overfitting, el riesgo aumenta con datos mal balanceados o hiperparámetros mal ajustados.
Por otro lado, XGBoost está basado en boosting y los árboles se construyen secuencialmente. La clave es que cada árbol nuevo intenta corregir los errores de los árboles anteriores, dando más peso a las observaciones mal predichas por lo que el rendimiento del modelo va mejorando.
En cuanto al overfitting, hemos visto que XGBoost incluye mecanismos de regularización L1 y L2 lo que evita la construcción de árboles innecesariamente profundos y el sobreajuste.
Sin embargo, Random Forest es más fácil de ajustar y de comprender ya que no tiene tantos hiperparámetros críticos como XGBoost.
Criterio | XGBoost | Random Forest |
---|---|---|
Datos complejos | Ideal para detectar patrones complejos y aprender de errores iterativamente. | Menos flexible en casos avanzados. |
Facilidad de uso | Requiere ajuste fino, ya que tiene más hiperparámetros críticos. | Más fácil de ajustar, ideal para tareas estándar y rápidas. |
Escalabilidad | Compatible con GPUs para grandes volúmenes de datos. | Se adapta bien a entornos distribuidos con menor esfuerzo. |