background-image: url(img/portada-flacso.png) background-size: cover class: animated slideInRight fadeOutLeft, middle # Machine Learning en Aplicaciones Espaciales ### Clase 3a. Ensembles. Boosting --- ## Boosting .bg-near-white.b--dark-blue.ba.bw2.br3.shadow-5.ph4.mt2[ ### En boosting tenemos una creación secuencial de modelos, y se trata de reducir el sesgo del estimador combinando estos modelos. El foco se va a poner en los modelos que tienen una performance pobre. ### ¿Por qué? ### Porque vamos a ponderar esos errores para no cometerlos a futuro. ] --- ## Comparación con bagging <img src="img/bagging-vs-boosting.jpeg" width="80%" style="display: block; margin: auto;" /> .bg-near-white.b--dark-blue.ba.bw2.br3.shadow-5.ph4.mt2[ Recordemos que en bagging vamos a construir modelos de manera independiente, y luego hacer un promedio de esas predicciones. La combinación de modelos suele ser mas potente que un algoritmo que el estimador base por separado. ] --- # Flavours de boosting * **Adaboost**: es el primer algoritmo de Boosting y como **algoritmo base utiliza "decision stumps"**, o árboles de decisión simples que constan de un nodo y dos raíces. Solo opera mediante iteraciones y ponderaciones. * **Gradient Boosting**: es una generalización de boosting para funciones de pérdida diferenciables. Es un procedimiento preciso y efectivo que se puede usar para regresión y clasificación. * **XGBoost**: a diferencia del anterior incluye tratamiento nativo de nulls, y además, soporta paralelización. Esto significa que paraleliza la construcción de cada árbol, guardandolos en bloques de memoria pre-ordenados y los reutiliza. Se paraleliza el split-finding. --- class: inverse, center, middle ## AdaBoost -- ## = -- ## Adaptive Boosting --- ## Adaboost **Boosting para clasificación** <img src="img/boost1.png" width="100%" style="display: block; margin: auto;" /> --- ## Adaboost **Boosting para regresión** <img src="img/boost-reg.png" width="90%" style="display: block; margin: auto;" /> --- class: inverse, center, middle -- ## Veamos como sucede esto -- ## Paso a paso --- ### Vamos a crear árboles de decisión a partir de estos datos <img src="img/ada1.png" width="80%" style="display: block; margin: auto;" /> --- #### Vamos a asignar un peso a cada muestra **Ese peso (weight) es 1/n, en este caso, 1/8** <img src="img/ada2.png" width="100%" style="display: block; margin: auto;" /> --- ## Decision stumps .bg-near-white.b--dark-blue.ba.bw2.br3.shadow-5.ph4.mt2[ Un **decision stump** es un árbol de decisión de 1 nodo raíz y 2 nodos hijos. Es un árbol de decisión muy simple. En el caso de tener una variable continua, en el nodo raíz tenemos un threshold, como en este caso. ] <img src="img/decision-stump.png" width="60%" style="display: block; margin: auto;" /> .footnote[Fuente: https://en.wikipedia.org/wiki/Decision_stump] --- ## 1er árbol de decisión Primera variable: dolor de pecho <img src="img/ada3.png" width="100%" style="display: block; margin: auto;" /> --- ## 1er árbol de decisión Segunda rama del árbol <img src="img/ada4.png" width="100%" style="display: block; margin: auto;" /> --- ## 2do árbol de decisión Operamos con la segunda variable <img src="img/ada5.png" width="100%" style="display: block; margin: auto;" /> --- ## 3er árbol de decisión Operamos con la tercer variable <img src="img/ada6.png" width="100%" style="display: block; margin: auto;" /> --- class: inverse, center, middle ## Tenemos 3 árboles de decisión -- ## ¿Cuál va a ser el primer árbol a considerar? --- ## Calculemos el índice de Gini para nuestros árboles <img src="img/ada7.png" width="100%" style="display: block; margin: auto;" /> --- ## Veamos las importancias que debemos asignar <img src="img/ada8.png" width="100%" style="display: block; margin: auto;" /> --- ## ¿Cómo interpretar este gráfico? <img src="img/amount-of-say.png" width="70%" style="display: block; margin: auto;" /> --- ## Primer árbol de decisión <img src="img/ada9.png" width="100%" style="display: block; margin: auto;" /> --- class: inverse, center, middle ## Vamos a recalcular los weights --- ## Cuando hay un error <img src="img/ada11.png" width="100%" style="display: block; margin: auto;" /> --- ## Cuando hay un acierto <img src="img/ada12.png" width="100%" style="display: block; margin: auto;" /> --- ## Tenemos los nuevos weights <img src="img/ada13.png" width="100%" style="display: block; margin: auto;" /> --- ## Normalizamos los weights <img src="img/ada14.png" width="100%" style="display: block; margin: auto;" /> --- class: inverse, center, middle ## ¿Cómo van a influir -- ## estos nuevos weights? --- <img src="img/ada15.png" width="130%" style="display: block; margin: auto;" /> --- class: inverse, center, middle ## Si tuviese un mayor weight, -- ## esa muestra va a repetirse varias veces -- ## en el nuevo dataset --- class: inverse, center, middle, ## Retomando... --- ## Adaboost (pasos) 1. Asignamos los pesos (1/n) a cada muestra. 2. Creamos decision stumps para cada variable del dataset. 3. Calculammos el índice de Gini. 4. Según el error se calcula el Amount of Say. 5. Recalculamos los pesos. 6. Se repite el proceso. 7. Se suman todas las predicciones de todos los decision stumps. --- class: inverse, center, middle ## Finalmente... --- ## Algoritmo de Adaboost <img src="img/adaboost-algo.png" width="90%" style="display: block; margin: auto;" /> .footnote[Fuente: *Applied Predictive Modeling*] --- class: inverse, center, middle ## Gradient Boosting Machines --- ## Gradient Boosting .bg-near-white.b--dark-blue.ba.bw2.br3.shadow-5.ph4.mt2[ * Al igual que AdaBoost es un algoritmo secuencial, y tiene en cuenta el error de los antiguos predictores. ] .bg-near-white.b--dark-blue.ba.bw2.br3.shadow-5.ph4.mt2[ * A diferencia de AdaBoost: 1. utilizamos árboles de decisión, pero no necesariamente, decision stumps. 2. No computamos los pesos en cada iteración, sino que se optimiza una función de pérdida diferenciable (loss function), por ejemplo, MSE para regresión. 3. Para un ejemplo de regresión, el nodo raíz, va a ser la media (average) de esa variable que intentamos predecir. ] --- class: inverse, center, middle ## Veamos paso a paso --- ## Vamos a predecir el *peso* a partir de estas variables **Estamos ante un caso de regresión** <img src="img/gbm1.png" width="90%" style="display: block; margin: auto;" /> --- ## Calculamos la media de esa variable <img src="img/gbm2.png" width="100%" style="display: block; margin: auto;" /> --- **A esa media le restamos el valor original de la variable** Decimos pseudo-residuales porque los residuales son un concepto de regresión lineal. <img src="img/gbm3.png" width="100%" style="display: block; margin: auto;" /> --- ## Primer árbol de decisión Uso los residuales en vez del valor verdadero <img src="img/gbm4.png" width="100%" style="display: block; margin: auto;" /> --- **Los valores que estan en la misma rama, los promediamos** <img src="img/gbm5.png" width="100%" style="display: block; margin: auto;" /> --- **Si a la media aritmética de todas las muestras, le sumo el valor del residual, vemos q coincide con el valor verdadero** <img src="img/gbm6.png" width="100%" style="display: block; margin: auto;" /> --- class: inverse, center, middle ## Vamos a introducir el concepto de -- ## tasa de aprendizaje --- ## Tasa de aprendizaje <img src="img/learning-rate1.png" width="50%" style="display: block; margin: auto;" /> .bg-near-white.b--dark-blue.ba.bw2.br3.shadow-5.ph4.mt2[ **Importante: definir una tasa de aprendizaje óptima, ya que si ese valor es muy grande: el algoritmo no converge, pero si es muy pequeño: vamos a necesitar muchos pasos o épocas para la convergencia** ] --- **Agregamos la tasa de aprendizaje a nuestro modelo** En este caso, definimos, una tasa de aprendizaje igual a 0.1. <img src="img/gbm7.png" width="100%" style="display: block; margin: auto;" /> --- ## Recordemos **En el contexto de una regresión lineal, siempre intentamos disminuir los residuales ya que eso implica disminuir el error en la predicción** <img src="img/reg-res.svg" width="100%" style="display: block; margin: auto;" /> --- ## Finalmente... **Los residuales han disminuido** <img src="img/gbm8.png" width="100%" style="display: block; margin: auto;" /> --- **Graficamente se ve así** <img src="img/gbm.png" width="70%" style="display: block; margin: auto;" /> --- ## Learning rate y número de árboles <img src="img/efecto-learning-rate-gbm.png" width="90%" style="display: block; margin: auto;" /> .bg-near-white.b--dark-blue.ba.bw2.br3.shadow-5.ph4.mt2[ **Cuanto más pequeño sea el learning rate del algoritmo, más árboles (n_estimators) vamos a necesitar para lograr resultados óptimos** ] .footnote[Fuente: *Hands On Machine Learning with Scikit-learn and Tensorflow*] --- ## Algoritmo Gradient Boosting *Está definido para clasificación* <img src="img/gradient-boosting-algo.png" width="100%" style="display: block; margin: auto;" /> .footnote[Fuente: *Applied Predictive Modeling*] --- class: inverse, center, middle ## XGBoost -- ## = -- ## eXtreme Gradient Boosting --- ## XGBoost .bg-near-white.b--dark-blue.ba.bw2.br3.shadow-5.ph4.mt2[ * Presentado originalmente por T.Chen & C.Guestrin (2016). XGBoost: A Scalable Tree Boosting System * Implementación escalable de GBM. * Árboles de decisión basados en CART. * Regularización para penalizar la complejidad de los árboles. * Derivadas de segundo orden para optimizar la función objetivo. * Opciones para hacer sampling de columnas y filas (similar a Random Forest). ] --- ## XGBoost -- **¿Qué nos ofrece XGBoost a diferencia de GBM?** -- <img src="img/xgboost-adv.png" width="90%" style="display: block; margin: auto;" /> .footnote[*https://towardsdatascience.com/https-medium-com-vishalmorde-xgboost-algorithm-long-she-may-rein-edd9f99be63d*] --- class: center, middle ## Optimizaciones que implementa XGBoost ## https://www.youtube.com/watch?v=oRrKeUCEbq8&t=112s --- class: inverse, center, middle ## XGBoost -- ## Paso a paso --- **Supongamos que nos interesa predecir la efectividad de una droga a partir de la dosis aplicada** <img src="img/xgb1.png" width="90%" style="display: block; margin: auto;" /> --- ### Vamos a calcular la predicción por default <img src="img/xgb2.png" width="100%" style="display: block; margin: auto;" /> --- ### Calculamos los residuales para cada predicción <img src="img/xgb3.png" width="100%" style="display: block; margin: auto;" /> --- ## Similarity Score <img src="img/xgb5.png" width="100%" style="display: block; margin: auto;" /> --- ### Fijamos en cero la regularización <img src="img/xgb6.png" width="100%" style="display: block; margin: auto;" /> --- <img src="img/xgb7.png" width="100%" style="display: block; margin: auto;" /> --- <img src="img/xgb8.png" width="100%" style="display: block; margin: auto;" /> --- <img src="img/xgb9.png" width="100%" style="display: block; margin: auto;" /> --- <img src="img/xgb10.png" width="100%" style="display: block; margin: auto;" /> --- <img src="img/xgb11.png" width="100%" style="display: block; margin: auto;" /> --- class: inverse, center, middle ## Este árbol lo creamos con un threshold < 15 -- ## Pero ese thresold podemos modificarlo --- ## Threshold < 22.5 <img src="img/xgb12.png" width="100%" style="display: block; margin: auto;" /> --- <img src="img/xgb-13.png" width="100%" style="display: block; margin: auto;" /> --- ## Threshold < 30 <img src="img/xgb-14.png" width="100%" style="display: block; margin: auto;" /> --- class: inverse, center, middle ## Recien tenemos el nodo raíz de nuestro árbol --- ## Rama con Dosage < 22.5 <img src="img/xgb15.png" width="100%" style="display: block; margin: auto;" /> --- ## Rama con Dosage < 30 <img src="img/xgb16.png" width="100%" style="display: block; margin: auto;" /> --- class: inverse, center, middle ## ¿Cómo actua el gamma? --- <img src="img/xgb-gamma.png" width="100%" style="display: block; margin: auto;" /> --- class: inverse, center, middle ## Resumen --- ### De árboles de decisión a XGBoost <img src="img/boosting-hierarchy.jpeg" width="100%" style="display: block; margin: auto;" /> .footnote[Fuente: *https://towardsdatascience.com/https-medium-com-vishalmorde-xgboost-algorithm-long-she-may-rein-edd9f99be63d*] --- ## Tunning XGBoost en R <img src="img/xgboost-tunning.png" width="100%" style="display: block; margin: auto;" /> --- class: inverse, center, middle # Manos en R 🙌 --- ## Bibliografía * Sebastian Raschka. https://www.youtube.com/watch?v=zblsrxc7XpM * Stochastic Gradient Boosting (paper) https://statweb.stanford.edu/~jhf/ftp/stobst.pdf * XGBoost: A Scalable Tree Boosting System (paper) https://arxiv.org/pdf/1603.02754.pdf * Videos de StatQuest * AdaBoost: https://www.youtube.com/watch?v=LsK-xG1cLYA * Gradient Boosting (Parte 1): https://www.youtube.com/watch?v=3CC4N4z3GJc&t=260s * XGBoost (Parte 1): https://www.youtube.com/watch?v=OtD8wVaFm6E&t=954s ---