class: left, middle, title-slide .title[ # Árboles y Random Forest ] .subtitle[ ## 11 Árboles & Random Forest
parykit ranger
] .author[ ###
Joshua Kunst
@jbkunst
] .date[ ### 2023-06-07 ] --- class: center, inverse, middle # Árboles de Decisión --- ## Antes de empezar En caso de querer profundizar modelamiento predictivo, un buen material es _Tidy modelling with R_ https://www.tmwr.org/, nos servirá como guía en nuestro programa. - Como introducción utilizaremos el blogpost [Machine Learning for Everyone](https://vas3k.com/blog/machine_learning/). --- ## Inteligencia artificial La inteligencia artificial es, en ciencias de la computación, la disciplina que intenta replicar y desarrollar la inteligencia y sus procesos implícitos a través de computadoras. <img src="images/ai-map.jpg" width="60%" style="display: block; margin: auto;" /> --- ## Inteligencia artificial (cont.) Diferencia con el machine learning: De https://azure.microsoft.com/en-in/solutions/ai/artificial-intelligence-vs-machine-learning/#introduction: Una computadora "inteligente" usa IA para pensar como un humano y realizar tareas por sí misma. El aprendizaje automático es cómo un sistema informático desarrolla su inteligencia. --- ## Machine learning El aprendizaje de máquinas es una rama de la inteligencia artificial, cuyo objetivo es desarrollar técnicas que permitan que las computadoras _aprendan_. <img src="images/machine-learning-map.jpg" width="55%" style="display: block; margin: auto;" /> --- ## Clasificación https://vas3k.com/blog/machine_learning/#scroll70. Separar objetos basado en atributos conocidos de antemano. Usado para: * Filtro Spam. * Detección de Lenguaje. * Detección de fraude. * Venta de productos financieros. Algoritmos populares: Arbol de decisión, Regresión logística, Naive Bayes, KNN (K-Nearest Neighbours). --- ## Naive Bayes <img src="images/naive-bayes.jpg" width="70%" style="display: block; margin: auto;" /> <small>Suponga que se tienen 1.000 _good_ y 1.000 _spam_. Calcule probabilidad de que sea Spam dado que contiene la palabra Kitty.</small> --- ## Naive Bayes (cont.) Suponga que se tienen 1.000 _good_ y 1.000 _spam_. Calcule probabilidad de que sea Spam dado que contiene la palabra Kitty. `$$\begin{aligned} \Pr(Spam|Kitty) &= \frac{\Pr(Kitty|Spam) \Pr(Spam)}{\Pr(Kitty)} \\ &= \frac{ \frac{13}{1000} \times \frac{1000}{1000+1000}}{\frac{672 + 13}{1000+1000}} \\ &= 0.0189781 \end{aligned}$$` -- * ¿Qué características observamos en este método? * ¿Qué ocurre si tenemos más variables, como por ejemplo la hora del email, dominio del correo? Ver siguiente [link](https://leasetruk.medium.com/naive-bayes-classifier-with-examples-7b541f9ffedf). --- ## Árbol de Decisión (Decision tree) <img src="images/decision-tree.jpg" width="70%" style="display: block; margin: auto;" /> Revisar [Una introducción visual al machine learning](http://www.r2d3.us/visual-intro-to-machine-learning-part-1/)!. --- count: false ## Árbol de Decisión en R .panel1-arbol-auto[ ```r *set.seed(123) ``` ] .panel2-arbol-auto[ ] --- count: false ## Árbol de Decisión en R .panel1-arbol-auto[ ```r set.seed(123) *library(tidyverse) ``` ] .panel2-arbol-auto[ ] --- count: false ## Árbol de Decisión en R .panel1-arbol-auto[ ```r set.seed(123) library(tidyverse) *library(partykit) ``` ] .panel2-arbol-auto[ ] --- count: false ## Árbol de Decisión en R .panel1-arbol-auto[ ```r set.seed(123) library(tidyverse) library(partykit) *ruta <- "https://raw.githubusercontent.com/jadeyee/r2d3-part-1-data/master/part_1_data.csv" ``` ] .panel2-arbol-auto[ ] --- count: false ## Árbol de Decisión en R .panel1-arbol-auto[ ```r set.seed(123) library(tidyverse) library(partykit) ruta <- "https://raw.githubusercontent.com/jadeyee/r2d3-part-1-data/master/part_1_data.csv" *datos <- readr::read_csv(ruta, skip = 2) ``` ] .panel2-arbol-auto[ ] --- count: false ## Árbol de Decisión en R .panel1-arbol-auto[ ```r set.seed(123) library(tidyverse) library(partykit) ruta <- "https://raw.githubusercontent.com/jadeyee/r2d3-part-1-data/master/part_1_data.csv" datos <- readr::read_csv(ruta, skip = 2) *datos <- datos ``` ] .panel2-arbol-auto[ ] --- count: false ## Árbol de Decisión en R .panel1-arbol-auto[ ```r set.seed(123) library(tidyverse) library(partykit) ruta <- "https://raw.githubusercontent.com/jadeyee/r2d3-part-1-data/master/part_1_data.csv" datos <- readr::read_csv(ruta, skip = 2) datos <- datos |> * mutate(in_sf = factor(ifelse(in_sf == 1, "SF", "NY"))) ``` ] .panel2-arbol-auto[ ] --- count: false ## Árbol de Decisión en R .panel1-arbol-auto[ ```r set.seed(123) library(tidyverse) library(partykit) ruta <- "https://raw.githubusercontent.com/jadeyee/r2d3-part-1-data/master/part_1_data.csv" datos <- readr::read_csv(ruta, skip = 2) datos <- datos |> mutate(in_sf = factor(ifelse(in_sf == 1, "SF", "NY"))) *arbol <- ctree(in_sf ~ ., data = datos) ``` ] .panel2-arbol-auto[ ] --- count: false ## Árbol de Decisión en R .panel1-arbol-auto[ ```r set.seed(123) library(tidyverse) library(partykit) ruta <- "https://raw.githubusercontent.com/jadeyee/r2d3-part-1-data/master/part_1_data.csv" datos <- readr::read_csv(ruta, skip = 2) datos <- datos |> mutate(in_sf = factor(ifelse(in_sf == 1, "SF", "NY"))) arbol <- ctree(in_sf ~ ., data = datos) *arbol ``` ] .panel2-arbol-auto[ ``` ## ## Model formula: ## in_sf ~ beds + bath + price + year_built + sqft + price_per_sqft + ## elevation ## ## Fitted party: ## [1] root ## | [2] elevation <= 30 ## | | [3] price_per_sqft <= 1072 ## | | | [4] year_built <= 1970 ## | | | | [5] beds <= 1 ## | | | | | [6] sqft <= 750: NY (n = 27, err = 0.0%) ## | | | | | [7] sqft > 750: NY (n = 11, err = 36.4%) ## | | | | [8] beds > 1: NY (n = 33, err = 48.5%) ## | | | [9] year_built > 1970: SF (n = 46, err = 6.5%) ## | | [10] price_per_sqft > 1072 ## | | | [11] price_per_sqft <= 1465 ## | | | | [12] year_built <= 1999: NY (n = 49, err = 6.1%) ## | | | | [13] year_built > 1999: SF (n = 21, err = 38.1%) ## | | | [14] price_per_sqft > 1465: NY (n = 113, err = 5.3%) ## | [15] elevation > 30 ## | | [16] elevation <= 39: SF (n = 22, err = 27.3%) ## | | [17] elevation > 39: SF (n = 170, err = 1.8%) ## ## Number of inner nodes: 8 ## Number of terminal nodes: 9 ``` ] <style> .panel1-arbol-auto { color: black; width: 49%; hight: 32%; float: left; padding-left: 1%; font-size: 80% } .panel2-arbol-auto { color: black; width: 49%; hight: 32%; float: left; padding-left: 1%; font-size: 80% } .panel3-arbol-auto { color: black; width: NA%; hight: 33%; float: left; padding-left: 1%; font-size: 80% } </style> --- ## Árbol de Decisión en R (cont.) `plot()` <img src="11-Machine-Learning-Arboles-RF_files/figure-html/unnamed-chunk-5-1.svg" width="100%" /> --- ## Árbol de Decisión en R (cont.) <img src="11-Machine-Learning-Arboles-RF_files/figure-html/unnamed-chunk-6-1.svg" width="100%" /> --- ## Árbol de Decisión en R (cont.) <img src="11-Machine-Learning-Arboles-RF_files/figure-html/unnamed-chunk-7-1.svg" width="100%" /> --- ## Partes del Árbol de Decisión Las partes del árbol son: 1. Nodo: Que refleja que **variable** se utiliza para evaluar la condición. 1. Rama: Se define en base a la **región** de la variable especificada en el nodo previo. 1. Hoja o Nodo terminal: Especifica el **resultado** de la variable respuesta. Links: - https://cran.r-project.org/web/packages/partykit/ - https://cran.r-project.org/web/packages/ggparty/ - http://grantmcdermott.com/parttree/index.html --- ## Parámetros para generar un Árbol de Decisión Si bien existen varias formas/métodos/algoritmos de crear árboles (siguiente slides) los parámetros usuales son. 1. Profundidad del árbol. 1. Cantidad (o proporción) mínima de observaciones en nodo terminal. 1. Tipo de test para seleccionar la variable en un nodo. 1. Tipo de test para seleccionar el punto para la división del nodo. 1. _Confianza_ con que se genera un split/nodo. --- ## Tipos de Árbol de Decisión Existen muchos tipos de algoritmos de árboles. Básicamente se diferencian en: * La forma de seleccionar cual es la variable que mejor separa los subconjuntos (etiquetas/variable respuesta) y, * Como se obtiene el límite de dicha variable. Algoritmos conocidos son CART, CHAID, [C4.5](https://en.wikipedia.org/wiki/C4.5_algorithm), C5.0, Conditional Inference Trees. --- ## Otra forma de visualizar <img src="11-Machine-Learning-Arboles-RF_files/figure-html/unnamed-chunk-8-1.svg" width="100%" /> --- ## Otra forma de visualizar (cont.) <img src="11-Machine-Learning-Arboles-RF_files/figure-html/unnamed-chunk-9-1.svg" width="100%" /> --- ## Otra forma de visualizar (cont.) <img src="11-Machine-Learning-Arboles-RF_files/figure-html/unnamed-chunk-10-1.svg" width="100%" /> --- ## Otra forma de visualizar (cont.) <img src="11-Machine-Learning-Arboles-RF_files/figure-html/unnamed-chunk-11-1.svg" width="100%" /> --- ## Otra forma de visualizar (cont.) <img src="11-Machine-Learning-Arboles-RF_files/figure-html/unnamed-chunk-12-1.svg" width="100%" /> --- ## Otra forma de visualizar (cont.) <img src="11-Machine-Learning-Arboles-RF_files/figure-html/unnamed-chunk-13-1.svg" width="100%" /> --- class: center, inverse, middle # Métricas de Evaluación --- ## Recordar Métricas de Evaluación en caso de Regresión... En el caso de regresión, las metricas se basan en resumir (promedio, mediana, etc) los errores de predicción: `\(e_i = real_i - pred_i\)`. <br/> $$\text{Mean squared error: MSE} = {mean(e^2_i)} = {\sum{e^2_i/n}} $$ $$\text{Root mean squared error: RMSE} = \sqrt{mean(e^2_i)} = \sqrt{\sum{e^2_i/n}} $$ `$$\text{Mean absolute percentage error: MAPE} = mean(|p_i|) = \sqrt{\sum{|p_i|/n}} = \sqrt{\sum{|(e_i/y_i)|/n}}$$` --- count: false ## Volviendo al caso clasificación .panel1-arbol2-auto[ ```r *set.seed(123) ``` ] .panel2-arbol2-auto[ ] --- count: false ## Volviendo al caso clasificación .panel1-arbol2-auto[ ```r set.seed(123) *datanueva <- sample_n(datos, 5) ``` ] .panel2-arbol2-auto[ ] --- count: false ## Volviendo al caso clasificación .panel1-arbol2-auto[ ```r set.seed(123) datanueva <- sample_n(datos, 5) *datanueva$in_sf ``` ] .panel2-arbol2-auto[ ``` ## [1] SF SF NY NY NY ## Levels: NY SF ``` ] --- count: false ## Volviendo al caso clasificación .panel1-arbol2-auto[ ```r set.seed(123) datanueva <- sample_n(datos, 5) datanueva$in_sf *predict(arbol, newdata = datanueva) ``` ] .panel2-arbol2-auto[ ``` ## [1] SF SF NY NY NY ## Levels: NY SF ``` ``` ## 1 2 3 4 5 ## SF SF NY NY NY ## Levels: NY SF ``` ] --- count: false ## Volviendo al caso clasificación .panel1-arbol2-auto[ ```r set.seed(123) datanueva <- sample_n(datos, 5) datanueva$in_sf predict(arbol, newdata = datanueva) *predict(arbol, newdata = datanueva, * type = "prob") ``` ] .panel2-arbol2-auto[ ``` ## [1] SF SF NY NY NY ## Levels: NY SF ``` ``` ## 1 2 3 4 5 ## SF SF NY NY NY ## Levels: NY SF ``` ``` ## NY SF ## 1 0.27272727 0.72727273 ## 2 0.01764706 0.98235294 ## 3 0.94690265 0.05309735 ## 4 0.94690265 0.05309735 ## 5 0.94690265 0.05309735 ``` ] --- count: false ## Volviendo al caso clasificación .panel1-arbol2-auto[ ```r set.seed(123) datanueva <- sample_n(datos, 5) datanueva$in_sf predict(arbol, newdata = datanueva) predict(arbol, newdata = datanueva, type = "prob") *predict(arbol, newdata = datanueva, * type = "prob")[, 2] ``` ] .panel2-arbol2-auto[ ``` ## [1] SF SF NY NY NY ## Levels: NY SF ``` ``` ## 1 2 3 4 5 ## SF SF NY NY NY ## Levels: NY SF ``` ``` ## NY SF ## 1 0.27272727 0.72727273 ## 2 0.01764706 0.98235294 ## 3 0.94690265 0.05309735 ## 4 0.94690265 0.05309735 ## 5 0.94690265 0.05309735 ``` ``` ## 1 2 3 4 5 ## 0.72727273 0.98235294 0.05309735 0.05309735 0.05309735 ``` ] --- count: false ## Volviendo al caso clasificación .panel1-arbol2-auto[ ```r set.seed(123) datanueva <- sample_n(datos, 5) datanueva$in_sf predict(arbol, newdata = datanueva) predict(arbol, newdata = datanueva, type = "prob") predict(arbol, newdata = datanueva, type = "prob")[, 2] *predict(arbol, newdata = datanueva, * type = "node") ``` ] .panel2-arbol2-auto[ ``` ## [1] SF SF NY NY NY ## Levels: NY SF ``` ``` ## 1 2 3 4 5 ## SF SF NY NY NY ## Levels: NY SF ``` ``` ## NY SF ## 1 0.27272727 0.72727273 ## 2 0.01764706 0.98235294 ## 3 0.94690265 0.05309735 ## 4 0.94690265 0.05309735 ## 5 0.94690265 0.05309735 ``` ``` ## 1 2 3 4 5 ## 0.72727273 0.98235294 0.05309735 0.05309735 0.05309735 ``` ``` ## 1 2 3 4 5 ## 16 17 14 14 14 ``` ] <style> .panel1-arbol2-auto { color: black; width: 49%; hight: 32%; float: left; padding-left: 1%; font-size: 80% } .panel2-arbol2-auto { color: black; width: 49%; hight: 32%; float: left; padding-left: 1%; font-size: 80% } .panel3-arbol2-auto { color: black; width: NA%; hight: 33%; float: left; padding-left: 1%; font-size: 80% } </style> --- ## Métricas de Evaluación caso Clasificación Existen varias métricas. Podemos agrupar segun si el modelo está predicciendo **categorías** o **probabilidad** de pertenecer a una categoría en particular. -- En el caso de categorías, con ayuda de la matriz de confusión (siguiente slide) podremos obtener medidas como: Accuracy, Precision, Recall/sensitividad, especificidad. -- Para un modelo que proporciona probabilidades se utiliza curva ROC, estadístico Kolmogorov-Smirnov, Log-loss. Dado un punto de corte , límite o _threshold_ podemos categorízar nuestra probabilidad y utilizar las medidas para el caso de categorias. --- ## Metricas de Evaluación caso Clasificación: categorías Matriz de confusión: | | | **Predicted**| | |:----------:|----------|:------------:|:--------:| | | | Positive | Negative | | **Actual** | Positive | TP | FN | | | Negative | FP | TN | --- ## Metricas de Evaluación caso Clasificación: categorías Matriz de confusión: | | | **Predicted**| | |:----------:|----------|:------------:|:--------:| | | | Positive | Negative | | **Actual** | Positive | TP | FN | | | Negative | FP | TN | <br> `$$Accuracy = \frac{TP + TN}{TP + TN + FP + FN}$$` -- Es el más simple de entender pero con varias limitantes. --- ## Metricas de Evaluación caso Clasificación: categorías Matriz de confusión: | | | **Predicted**| | |:----------:|----------|:------------:|:--------:| | | | Positive | Negative | | **Actual** | Positive | TP | FN | | | Negative | FP | TN | <br> `$$Precision = \frac{TP}{TP + FP} \hspace{2cm} Recall = \frac{TP}{TP + FN}$$` -- La `\(Precision\)` nos proporciona información sobre el rendimiento de capturar a los positivos, cuanta seguridad se tiene cuando se predice _positivo_. Mientras que que `\(Recall\)` o `\(sensitivity\)` mide cuanto de los _reales positivos_ son bien predichos por el modelo. --- ## Metricas de Evaluación caso Clasificación: categorías Revisar ejemplo interactivo en https://mlu-explain.github.io/precision-recall/. Buen resumen tiene wikipedia https://en.wikipedia.org/wiki/Confusion_matrix, https://en.wikipedia.org/wiki/Precision_and_recall https://www.iartificial.net/precision-recall-f1-accuracy-en-clasificacion/ --- ## Metricas de Evaluación caso Clasificación: probabilidad Bien conocido es el área bajo la curva ROC el cual da una visión global de la relación entre recall/senitividad y la especificidad considerando todos los threshold posibles. Revisar: - https://mlu-explain.github.io/roc-auc/ - http://mfviz.com/binary-predictions/ - http://www.navan.name/roc/ -- Estadístico Kolmogorov-Smirnov `\(KS\)` mide la separación de las distribuciones de probabilidad de los positivos y negativos (siguiente slide). De forma técnica se define como la máxima separación de las distribuciones acumuladas. --- ## Metricas de Evaluación caso Clasificación: probabilidad <img src="11-Machine-Learning-Arboles-RF_files/figure-html/unnamed-chunk-17-1.svg" width="100%" /> --- class: center, inverse, middle # Random Forest --- ## Random Forest En Random Forest, se crea un conjunto de árboles de decisión, donde cada árbol se entrena con: 1. Una muestra aleatoria del conjunto de datos de entrenamiento (parámetro `ntree` o similar). 2. En cada nodo de división de un árbol, se considera solo un subconjunto aleatorio de características para tomar la decisión (parámetro `mtry`). -- Cuando se realiza una predicción con Random Forest, cada árbol del conjunto emite una predicción y la clase final se determina por votación o promediando las predicciones. -- Random Forest tiene varias ventajas: (1) Como su capacidad para manejar conjuntos de datos grandes, (2) lidiar con características faltantes y seleccionar características importantes, (3) es menos propenso al sobreajuste en comparación con un solo árbol de decisión. (n) etc! https://mlu-explain.github.io/random-forest/ --- ## Más información - [Tidy Modeling with R](https://www.tmwr.org/). - [Machine Learning for Everyone](https://vas3k.com/blog/machine_learning/). - [Machine Learning University](https://mlu-explain.github.io/).