# XGBoost

XGBoost (eXtreme Gradient Boosting) es una biblioteca de software de código abierto que proporciona un marco de regularización de potenciación de gradiente para C++, Java, Python, R, Julia, Perl, y Scala. . Funciona en Linux, Microsoft Windows, y macOS. El propósito del proyecto es ofrecer una biblioteca distribuida, portátil y escalable para potenciación de gradiente. Esta biblioteca puede operar tanto en una única máquina como en entornos de procesamiento distribuido Apache Hadoop, Apache Spark, Apache Flink y Dask.
A mediados de la década de 2010, XGBoost ganó mucha popularidad y atención al ser el algoritmo elegido por una gran cantidad de equipos ganadores de competiciones de aprendizaje automático.

## Historia

XGBoost comenzó inicialmente como un proyecto de investigación de Tianqi Chen como parte del grupo Distributed (Deep) Machine Learning Community (DMLC). Se hizo muy conocido en los círculos de competencia de ML después de su uso en la solución ganadora del Higgs Machine Learning Challenge . Poco después, se crearon los paquetes Python y R, y XGBoost ahora tiene implementaciones de paquetes para Java, Scala, Julia, Perl y otros lenguajes. Esto permitió un mayor alcance de la biblioteca, atrayendo a más usuarios y contribuyendo a su creciente popularidad en la comunidad de Kaggle, donde ha sido empleada en numerosas competiciones.
Rápidamente se integró con otros paquetes, lo que facilitó su uso en sus respectivas comunidades. Ahora se ha integrado con scikit-learn para usuarios de Python y con el paquete caret para usuarios de R. También se puede integrar en marcos de Data Flow como Apache Spark, Apache Hadoop y Apache Flink utilizando Rabit y XGBoost4J resumidos. XGBoost también está disponible en OpenCL para FPGA.
Aunque el modelo XGBoost suele alcanzar una precisión superior a la de un solo árbol de decisión, esto se logra a expensas de la capacidad de interpretación intrínseca de los árboles individuales. Mientras que seguir el camino de un árbol de decisión para comprender su decisión es relativamente sencillo y autoexplicativo, hacer lo mismo para cientos o miles de árboles resulta considerablemente más complejo.

## Características

Características destacadas de XGBoost que lo diferencian de otros algoritmos de potenciación de gradiente incluyen:
* Penalización inteligente de árboles
* Reducción proporcional de nodos hoja
* Potenciación de Newton
* Parámetro adicional de aleatorización
* Implementación en sistemas individuales y distribuidos, y cálculo fuera de línea
* Selección automática de características
* Esbozo ponderado de cuantiles justificado teóricamente para cálculos eficientes
* Impulso de estructura de árbol paralelo con esparsidad
* Estructura de bloques caché eficiente para el entrenamiento de árboles de decisión

## El algoritmo

XGBoost funciona mediante una aproximación de Taylor de segundo orden en la función de pérdida para establecer la conexión con el método de Newton Raphson.
Un algoritmo XGBoost genérico no regularizado es:
Entradas: conjunto de entrenamiento $\{(x_{i},y_{i})\}_{i=1}^{N}$, una función de pérdida diferenciable $L(y,F(x))$, un número de modelos de aprendizaje débiles $M$ y una tasa de aprendizaje $\alpha$.
Algoritmo:
* Inicializar modelo con un valor constante: ${\hat {f}}_{(0)}(x)={\underset {\theta }{\arg \min }}\sum _{i=1}^{N}L(y_{i},\theta ).$
* Para m = 1 hasta M:
** Calcular los 'gradientes' y los 'hessianos': ${\begin{aligned}{\hat {g}}_{m}(x_{i})&=\left[{\frac {\partial L(y_{i},f(x_{i}))}{\partial f(x_{i})}}\right]_{f(x)={\hat {f}}_{(m-1)}(x)}.\\{\hat {h}}_{m}(x_{i})&=\left[{\frac {\partial ^{2}L(y_{i},f(x_{i}))}{\partial f(x_{i})^{2}}}\right]_{f(x)={\hat {f}}_{(m-1)}(x)}.\end{aligned}}$
** Ajustar un modelo base (o un modelo de aprendizaje débil, como un árbol) utilizando el conjunto de entrenamiento $\left\{x_{i},-{\dfrac {{\hat {g}}_{m}(x_{i})}{{\hat {h}}_{m}(x_{i})}}\right\}_{i=1}^{N}$ resolviendo el problema de optimización a continuación: ${\hat {\phi }}_{m}={\underset {\phi \in \mathbf {\Phi } }{\arg \min }}\sum _{i=1}^{N}{\frac {1}{2}}{\hat {h}}_{m}(x_{i})\left[\phi (x_{i})-{\frac {{\hat {g}}_{m}(x_{i})}{{\hat {h}}_{m}(x_{i})}}\right]^{2}.$ ${\hat {f}}_{m}(x)=\alpha {\hat {\phi }}_{m}(x).$
** Actualizar el modelo: ${\hat {f}}_{(m)}(x)={\hat {f}}_{(m-1)}(x)+{\hat {f}}_{m}(x).$
* Salida ${\hat {f}}(x)={\hat {f}}_{(M)}(x)=\sum _{m=0}^{M}{\hat {f}}_{m}(x).$

## Aplicaciones de XGBoost

XGBoost es apto para el manejo de relaciones no lineales y su poder predictivo es bueno. Esto lo vuelve un algoritmo eficaz para aplicar a los datos del mercado financiero.