class: inverse, center # <svg style="height:0.8em;top:.04em;position:relative;fill:steelblue;" viewBox="0 0 581 512"><path d="M581 226.6C581 119.1 450.9 32 290.5 32S0 119.1 0 226.6C0 322.4 103.3 402 239.4 418.1V480h99.1v-61.5c24.3-2.7 47.6-7.4 69.4-13.9L448 480h112l-67.4-113.7c54.5-35.4 88.4-84.9 88.4-139.7zm-466.8 14.5c0-73.5 98.9-133 220.8-133s211.9 40.7 211.9 133c0 50.1-26.5 85-70.3 106.4-2.4-1.6-4.7-2.9-6.4-3.7-10.2-5.2-27.8-10.5-27.8-10.5s86.6-6.4 86.6-92.7-90.6-87.9-90.6-87.9h-199V361c-74.1-21.5-125.2-67.1-125.2-119.9zm225.1 38.3v-55.6c57.8 0 87.8-6.8 87.8 27.3 0 36.5-38.2 28.3-87.8 28.3zm-.9 72.5H365c10.8 0 18.9 11.7 24 19.2-16.1 1.9-33 2.8-50.6 2.9v-22.1z"/></svg> para análisis de datos 🚀<br> <br> ## 🎉Modelización con tidymodels 💻 ### `Clasificación` .large[Roxana N. Villafañe | LEMyP | <a href='http://twitter.com/data_datum'><svg style="height:0.8em;top:.04em;position:relative;fill:steelblue;" viewBox="0 0 512 512"><path d="M459.37 151.716c.325 4.548.325 9.097.325 13.645 0 138.72-105.583 298.558-298.558 298.558-59.452 0-114.68-17.219-161.137-47.106 8.447.974 16.568 1.299 25.34 1.299 49.055 0 94.213-16.568 130.274-44.832-46.132-.975-84.792-31.188-98.112-72.772 6.498.974 12.995 1.624 19.818 1.624 9.421 0 18.843-1.3 27.614-3.573-48.081-9.747-84.143-51.98-84.143-102.985v-1.299c13.969 7.797 30.214 12.67 47.431 13.319-28.264-18.843-46.781-51.005-46.781-87.391 0-19.492 5.197-37.36 14.294-52.954 51.655 63.675 129.3 105.258 216.365 109.807-1.624-7.797-2.599-15.918-2.599-24.04 0-57.828 46.782-104.934 104.934-104.934 30.213 0 57.502 12.67 76.67 33.137 23.715-4.548 46.456-13.32 66.599-25.34-7.798 24.366-24.366 44.833-46.132 57.827 21.117-2.273 41.584-8.122 60.426-16.243-14.292 20.791-32.161 39.308-52.628 54.253z"/></svg> @data_datum</a>] <br> .large[Florencia D'Andrea | INTA-CONICET | <a href="http://twitter.com/cantoflor_87"> <svg style="height:0.8em;top:.04em;position:relative;fill:steelblue;" viewBox="0 0 512 512"><path d="M459.37 151.716c.325 4.548.325 9.097.325 13.645 0 138.72-105.583 298.558-298.558 298.558-59.452 0-114.68-17.219-161.137-47.106 8.447.974 16.568 1.299 25.34 1.299 49.055 0 94.213-16.568 130.274-44.832-46.132-.975-84.792-31.188-98.112-72.772 6.498.974 12.995 1.624 19.818 1.624 9.421 0 18.843-1.3 27.614-3.573-48.081-9.747-84.143-51.98-84.143-102.985v-1.299c13.969 7.797 30.214 12.67 47.431 13.319-28.264-18.843-46.781-51.005-46.781-87.391 0-19.492 5.197-37.36 14.294-52.954 51.655 63.675 129.3 105.258 216.365 109.807-1.624-7.797-2.599-15.918-2.599-24.04 0-57.828 46.782-104.934 104.934-104.934 30.213 0 57.502 12.67 76.67 33.137 23.715-4.548 46.456-13.32 66.599-25.34-7.798 24.366-24.366 44.833-46.132 57.827 21.117-2.273 41.584-8.122 60.426-16.243-14.292 20.791-32.161 39.308-52.628 54.253z"/></svg> @cantoflor_87</a><br>] ✨ <br> Página web del curso en <https://flor14.github.io/Curso_r_unne_2020/> 🌟 --- <img src="img/tidymodels.png" width="10%" align="right" /> # Flujo de Ciencia de Datos 📌 <img src="img/flujo-ciencia-datos-ml.png" width="100%" align="center" /> --- background-image: url(img/fondo-madera.png) background-size: cover class: center, middle # Es el proceso de desarrollo de una herramienta matemática o modelo que genera una predicción precisa. # Entrenamos un modelo para encontrar esa predicción precisa. .footnote[http://appliedpredictivemodeling.com/] --- <img src="img/tidymodels.png" width="10%" align="right" /> # ¿Qué es entrenar un modelo? <img src="img/modelo-entrenado.png" width="100%" align="center" /> .footnote[Imagen tomada del curso de Alison Pressman Hill https://conf20-intro-ml.netlify.com/] --- <img src="img/tidymodels.png" width="10%" align="right" /> # Ejemplos de modelos predictivos <br> *Modelos simples #### Determinar si un tumor es maligno o benigno en una imagen médica (clasificación en benigno/maligno). #### Predicción de los precios de inmuebles (regresión) #### Identificar el código zip de letras manuscritas en un sobre. (clasificación en letras) -- *Modelos más complejos <img src="img/ml-ejemplos.png" width="100%" align="right" /> --- <img src="img/tidymodels.png" width="10%" align="right" /> # Partes del modelo predictivo <img src="img/partes-modelo.png" width="100%" align="center" /> .footnote[http://appliedpredictivemodeling.com/] --- <img src="img/tidymodels.png" width="10%" align="right" /> # Terminología * __Muestra, punto, observación, instancia__ se refiere a una unidad de análisis. * __Set de entrenamiento__ son los datos utilizados para el modelado. * __Set de prueba__ son los datos utilizados para medir el desempeño del modelo, entre un conjunto de candidatos. * __Atributos, predictores, variables independientes o descriptores__ son los datos de entrada para la ecuación de predicción. * __Salida, variable dependiente, variable respuesta, clase, o "target"__ es la cantidad a ser predicha. * __Datos categóricos, también conocidos como nominales o atributos__ toman valores específicos que no tienen escala. Ejemplo: bueno/malo, rojo/azul, etc. * __Datos continuos__ son a base de escalas numéricas. El costo de un producto, la presión sanguínea, etc. .footnote[http://appliedpredictivemodeling.com/] --- <img src="img/tidymodels.png" width="10%" align="right" /> # Modelización supervisada ### Clasificación: la variable respuesta es una clase, es decir, una variable cualitativa En el dataset iris, el tipo de flor, iris setosa, versicolor, virginica. ### Regresión: la variable respuesta es un valor cuantitativo (un valor numérico a predecir). Predicción de precios de casas, según variables como el barrio en el que pertenecen, número de cuartos, si es de más de un piso, etc. --- class:center, inverse <img src="img/tidymodels.png" width="50%" align="middle" /> --- <img src="img/tidymodels.png" width="10%" align="right" /> # De caret a tidymodels .pull-left[ El objetivo de caret era **unificar la sintaxis** para modelizar datos usando como base distintas librerías de R. <img src="img/caret.png" width="100%" align="right" /> ] -- .pull-right[ El objetivo de Tidymodels es además hacerlo **en un formato ordenado**. <img src="img/tidymodels.png" width="80%" align="right" /> ] --- background-image: url(img/fondo-madera.png) background-size: cover class: center, middle # Tidymodels es un grupo de paquetes centrado en las tareas de modelización de datos. # La modelización consta de varios pasos, la idea es que cada paso lo realice una librería diferente. --- <img src="img/tidymodels.png" width="10%" align="right" /> <br><br> <img src="img/tidym2.png" width="100%" align="center" /> -- ### Documentación - Tidymodels https://github.com/tidymodels/tidymodels - Rsample https://tidymodels.github.io/rsample/ - Recipes https://tidymodels.github.io/recipes/reference/index.html - Parsnip https://tidymodels.github.io/parsnip/ - Yardstick https://tidymodels.github.io/yardstick/ --- <img src="img/tidymodels.png" width="10%" align="right" /> # En primer lugar instalamos tidymodels ```r install.packages(tidymodels) ``` --- <img src="img/tidymodels.png" width="10%" align="right" /> # Librerías de Tidymodels ```r library(tidymodels) ``` ``` ## ── Attaching packages ───────────────────────────────────────────────────────── tidymodels 0.1.0 ── ``` ``` ## ✓ broom 0.5.6 ✓ recipes 0.1.12 ## ✓ dials 0.0.6 ✓ rsample 0.0.6 ## ✓ dplyr 0.8.5 ✓ tibble 3.0.1 ## ✓ ggplot2 3.3.0 ✓ tune 0.1.0 ## ✓ infer 0.5.1 ✓ workflows 0.1.1 ## ✓ parsnip 0.1.1 ✓ yardstick 0.0.6 ## ✓ purrr 0.3.4 ``` ``` ## ── Conflicts ──────────────────────────────────────────────────────────── tidymodels_conflicts() ── ## x purrr::discard() masks scales::discard() ## x dplyr::filter() masks stats::filter() ## x dplyr::lag() masks stats::lag() ## x ggplot2::margin() masks dials::margin() ## x recipes::step() masks stats::step() ``` --- background-image: url(img/text-msg.png) background-size: cover class: center, middle # ✨ Data Balanceada Los clases tienen los mismos números de casos --- <img src="img/tidymodels.png" width="10%" align="right" /> # Datos: Iris * Conjunto de datos muy popular en análisis multivariado <img src="img/iris-species.png" width="100%" align="center" /> .footnote[[*] Mas información en https://es.wikipedia.org/wiki/Conjunto_de_datos_flor_iris https://archive.ics.uci.edu/ml/datasets/Iris] --- <img src="img/tidymodels.png" width="10%" align="right" /> # Vemos los primeros 5 casos del set de datos ```r head(iris) ``` ``` ## Sepal.Length Sepal.Width Petal.Length Petal.Width Species ## 1 5.1 3.5 1.4 0.2 setosa ## 2 4.9 3.0 1.4 0.2 setosa ## 3 4.7 3.2 1.3 0.2 setosa ## 4 4.6 3.1 1.5 0.2 setosa ## 5 5.0 3.6 1.4 0.2 setosa ## 6 5.4 3.9 1.7 0.4 setosa ``` --- <img src="img/tidymodels.png" width="10%" align="right" /> # Estadística descriptiva del set de datos ```r summary(iris) ``` ``` ## Sepal.Length Sepal.Width Petal.Length Petal.Width ## Min. :4.300 Min. :2.000 Min. :1.000 Min. :0.100 ## 1st Qu.:5.100 1st Qu.:2.800 1st Qu.:1.600 1st Qu.:0.300 ## Median :5.800 Median :3.000 Median :4.350 Median :1.300 ## Mean :5.843 Mean :3.057 Mean :3.758 Mean :1.199 ## 3rd Qu.:6.400 3rd Qu.:3.300 3rd Qu.:5.100 3rd Qu.:1.800 ## Max. :7.900 Max. :4.400 Max. :6.900 Max. :2.500 ## Species ## setosa :50 ## versicolor:50 ## virginica :50 ## ## ## ``` --- <img src="img/tidymodels.png" width="10%" align="right" /> ## Tenemos 150 casos o individuos (filas), 4 columnas o características (features) y 1 variable predictora (species) ```r str(iris) ``` ``` ## 'data.frame': 150 obs. of 5 variables: ## $ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ... ## $ Sepal.Width : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ... ## $ Petal.Length: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ... ## $ Petal.Width : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ... ## $ Species : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ... ``` -- ### Importante: Este set de datos no tiene valores perdidos --- # Visualización * Visualizar las variables nos permite ver gráficamente las distribuciones de las variables y ver si se presentan eventuales correlaciones ```r library(GGally) #librería GGally iris %>% #datos de entrada ggpairs(aes(color = Species))+ theme_bw() #función ggpairs ``` --- ![](ml-fundamentals_files/figure-html/unnamed-chunk-8-1.png)<!-- --> --- # Correlación ```r library(dplyr) library(corrplot) #librería corrrplot para graficar irisv<-iris %>% #ingreso de datos select(-Species) #elimino variable Species M <- cor(irisv) #calculo matriz de correlación corrplot(M, method="number") #grafico ``` .footnote[https://www.rdocumentation.org/packages/stats/versions/3.6.2/topics/cor y https://cran.r-project.org/web/packages/corrplot/vignettes/corrplot-intro.html] --- ![](ml-fundamentals_files/figure-html/unnamed-chunk-10-1.png)<!-- --> --- class: inverse, center <img src="img/rsample.png" width="50%" align="center" /> # `División de datos` --- <img src="img/rsample.png" width="10%" align="right" /> # Entrenamiento / Prueba <img src="img/training-testing.png" width="75%" align="center" /> --- # ¿Por qué dividimos los datos? <img src="img/leo.png" width="100%" align="right" /> .footnote[https://projecteuclid.org/download/pdf_1/euclid.ss/1009213726 y https://arxiv.org/pdf/1206.5538.pdf] --- <img src="img/rsample.png" width="10%" align="right" /> # 1° Paso: Dividir los datos ### Crear un set de datos training / testing con la librería *rsamples* ```r iris_split <- iris %>% #creo un objeto a partir de iris `initial_split`(prop = 0.75) #75% de los datos iris_split ``` ``` ## <Training/Validation/Total> ## <113/37/150> ``` Estos son los datos de entrenamiento/prueba/total * __Vamos a _entrenar_ con 113 muestras__ * __Vamos a _validar_ con 37 muestras__ --- background-image: url(img/engine3.png) background-size: cover class: center, middle # `initial_split()`: nos permite dividir el set de datos en entrenamiento y prueba --- class: inverse, center <img src="img/recipes.png" width="60%" align="center" /> # `Preprocesamiento` --- background-image: url(img/fondo-madera.png) background-size: cover class: center, middle # El preprocesamiento se refiere a la adición, eliminación o transformación de los datos de entrenamiento. # La necesidad de preprocesar los datos de entrada está determinada por el tipo de modelo que se utiliza. --- <img src="img/recipes_allison.png" width="100%" align="center" /> .footnote[https://github.com/allisonhorst/stats-illustrations] --- <img src="img/recipes.png" width="10%" align="right" /> # Preprocesamiento **_Este orden se aconseja en la documentación_** 1. Imputación de valores perdidos. 1. Transformaciones para variables individuales 1. Discretizar las variables (si no hubiera otra opción) 1. Creación de variables latentes 1. Creación de interacciones 1. Normalización (centrado, escalado, etc) 1. Transformaciones multivariadas (PCA, etc) .footnote[Mas información en https://tidymodels.github.io/recipes/articles/Ordering.html] --- <img src="img/recipes.png" width="10%" align="right" /> # Centrado y Escalado 1. Datos originales 1. Centrar (media 0) 1. Escalado (desvío estandar igual a 1) <img src="img/prepro1.png" width="100%" align="right" /> .footnote[Imagen tomada de http://aikorea.org/cs231n/neural-networks-2/] --- <img src="img/recipes.png" width="10%" align="right" /> # 2° Paso: Preprocesamiento - **recipe()**: empieza una lista de transformaciones a ser aplicadas <br> - **step_corr()**: remueve todas las variables con alta correlación - **step_center()**: centrar los datos con media igual a 0. - **step_scale()**: Normaliza con desvío estándar igual a 1. <br> - **all_predictors()** y **all_outcomes()** son todas las variables predictivas y predictoras - **prep()**: Indica que hay que ejecutar todos los pasos anteriores. ```r iris_recipe <- `training`(iris_split) %>% `recipe`(Species~.) %>% `step_corr`(all_predictors()) %>% `step_center`(all_predictors(), -all_outcomes()) %>% `step_scale`(all_predictors(), -all_outcomes()) %>% `prep`() ``` --- <img src="img/recipes.png" width="10%" align="right" /> ```r iris_recipe <- training(iris_split) %>% recipe(Species~.) %>% step_corr(all_predictors()) %>% step_center(all_predictors(), -all_outcomes()) %>% step_scale(all_predictors(), -all_outcomes()) %>% prep() ``` ```r iris_recipe ``` ``` ## Data Recipe ## ## Inputs: ## ## role #variables ## outcome 1 ## predictor 4 ## ## Training data contained 113 data points and no missing data. ## ## Operations: ## ## Correlation filter removed Petal.Length [trained] ## Centering for Sepal.Length, Sepal.Width, Petal.Width [trained] ## Scaling for Sepal.Length, Sepal.Width, Petal.Width [trained] ``` --- background-image: url(img/engine3.png) background-size: cover class: center, middle # `recipe()`: especifico fórmula # `step_corr()`: remuevo las variables correlacionadas # `step_center()`: centrar # `step_scale()`: escalar # `prep()`: ejecutar --- <img src="img/recipes.png" width="10%" align="right" /> ## juice() - **juice()** se utiliza para darle formato final al dataset antes del procesamiento de los datos #### juice() aplicamos a los datos de entrenamiento ```r iris_training <- `juice`(iris_recipe) ``` ```r head(iris_training) ``` ``` ## # A tibble: 6 x 4 ## Sepal.Length Sepal.Width Petal.Width Species ## <dbl> <dbl> <dbl> <fct> ## 1 -0.869 0.974 -1.23 setosa ## 2 -1.14 -0.182 -1.23 setosa ## 3 -1.40 0.280 -1.23 setosa ## 4 -1.54 0.0491 -1.23 setosa ## 5 -1.00 1.20 -1.23 setosa ## 6 -0.467 1.90 -0.960 setosa ``` .footnote[https://tidymodels.github.io/recipes/reference/juice.html ] --- <img src="img/recipes.png" width="10%" align="right" /> ## bake() - **bake()** toma un recipiente entreanado y aplica las operaciones a un set de datos para crear la matriz de diseño. #### bake() aplicamos a los datos de prueba ```r iris_testing <- iris_recipe %>% `bake`(testing(iris_split)) head(iris_testing) ``` ``` ## # A tibble: 6 x 4 ## Sepal.Length Sepal.Width Petal.Width Species ## <dbl> <dbl> <dbl> <fct> ## 1 -1.81 -0.413 -1.23 setosa ## 2 -0.467 1.44 -1.23 setosa ## 3 -0.735 0.742 -1.23 setosa ## 4 -0.467 0.742 -0.960 setosa ## 5 -1.00 0.974 -1.09 setosa ## 6 -1.81 0.280 -1.23 setosa ``` .footnote[https://tidymodels.github.io/recipes/reference/bake.html ] --- background-image: url(img/engine3.png) background-size: cover class: center, middle # `juice()`: formato final a datos de entrenamiento # `bake()`: aplicar transformaciones a datos de prueba --- background-image: url(img/engine3.png) background-size: cover class: center, middle # recipe --> prep() --> bake/juice # (definir) --> (estimar) --> (aplicar) --- background-image: url(img/textura-fondo.png) background-size: cover class: center, middle, inverse # 🔧 DEMO 💻 --- class: inverse, center <img src="img/parsnip_h.png" width="70%" align="center" /> # `Modelización` --- background-image: url(img/fondo-madera.png) background-size: cover class: center, middle # En esta etapa se realiza el ajuste de varios modelos # Cada modelo tiene variables internas propias que surgen de su expresión matemática # No existe el mejor modelo, siempre depende del conjunto de datos utilizado --- <img src="img/parsnip_allison.png" width="100%" align="center" /> .footnote[https://github.com/allisonhorst/stats-illustrations] --- <img src="img/parsnip.png" width="15%" align="right" /> # Árboles de decisión (Decision Trees) <img src="img/bret-tree.png" width="100%" align="center" /> .footnote[Imagen tomada de https://www.packtpub.com/big-data-and-business-intelligence/machine-learning-r-second-edition] --- <img src="img/parsnip.png" width="15%" align="right" /> # Árboles de decisión (Decision Trees) <img src="img/decision1.png" width="100%" align="center" /> .footnote[https://bookdown.org/content/2031/arboles-de-decision-parte-i.html#que-son-los-arboles-de-decision] --- <img src="img/parsnip.png" width="15%" align="right" /> # Bosques aleatorios (Random Forest) <img src="img/netflix-rf.png" width="100%" align="center" /> .footnote[https://en.wikipedia.org/wiki/Netflix_Prize y https://static.aminer.org/pdf/PDF/000/294/514/random_decision_forests.pdf] --- <img src="img/parsnip.png" width="15%" align="right" /> # Bosques aleatorios (Random Forest) <img src="img/random-forest1.png" width="100%" align="center" /> .footnote[Imagen tomada de https://conf20-intro-ml.netlify.com/] --- <img src="img/parsnip.png" width="15%" align="right" /> # Bosques aleatorios (Random Forest) <img src="img/random-forest2.png" width="100%" align="center" /> .footnote[Imagen tomada de https://conf20-intro-ml.netlify.com/] --- <img src="img/parsnip.png" width="15%" align="right" /> # Bosques aleatorios (Random Forest) <img src="img/random-forest3.png" width="100%" align="center" /> .footnote[Imagen tomada de https://conf20-intro-ml.netlify.com/] --- <img src="img/parsnip.png" width="15%" align="right" /> # Bosques aleatorios (Random Forest) <img src="img/random-forest4.png" width="100%" align="center" /> .footnote[Imagen tomada de https://conf20-intro-ml.netlify.com/] --- <img src="img/parsnip.png" width="15%" align="right" /> # Bosques aleatorios (Random Forest) <img src="img/random-forest5.png" width="100%" align="center" /> .footnote[Imagen tomada de https://conf20-intro-ml.netlify.com/] --- <img src="img/parsnip.png" width="15%" align="right" /> ### Out-of-bag error Error de validación interna del modelo ### mtry Número de variables elegidas de manera aleatoria como candidatas para cada split. ### Gini index (Índice Gini) Medida de varianza entre las clases. Nos permite medir la pureza del nodo. Un nodo más puro es cuando mas similares son entre sí, los elementos clasificados. .footnote[http://faculty.marshall.usc.edu/gareth-james/ISL/] --- <img src="img/parsnip.png" width="15%" align="right" /> ## 3° Paso: Entrenamiento del modelo - Para a entrenar un modelo de random forest con librería {ranger} y {randomForest} en el set de entrenamiento. - Se puede entrenar cualquier modelo de clasificación o regresión - Partes: 1. *rand_forest()*: es el nombre de tidymodels para el modelo. 1. *set_engine()*: especifico librería que contiene el modelo. 1. *fit()*: ajuste de la función según la fórmula y los datos ```r iris_ranger <- #creo objeto de R `rand_forest`(trees = 500, mode = "classification") %>% `set_engine`("ranger") %>% #escifico librería `fit`(Species~., data = iris_training) #ajuste iris_ranger ``` .footnote[Más información en https://tidymodels.github.io/parsnip/articles/articles/Models.html] --- <img src="img/parsnip.png" width="15%" align="right" /> {ranger} ``` ## parsnip model object ## ## Fit time: 33ms ## Ranger result ## ## Call: ## ranger::ranger(formula = formula, data = data, num.trees = ~500, num.threads = 1, verbose = FALSE, seed = sample.int(10^5, 1), probability = TRUE) ## ## Type: Probability estimation ## Number of trees: 500 ## Sample size: 113 ## Number of independent variables: 3 ## Mtry: 1 ## Target node size: 10 ## Variable importance mode: none ## Splitrule: gini ## OOB prediction error (Brier s.): 0.07080107 ``` --- background-image: url(img/engine3.png) background-size: cover class: center, middle # `rand_forest()`: declaro `trees` y el `mode` (clasificación) # `set_engine()`: declaro que librería voy a usar # `fit()`:declaro la fórmula y los datos de entrada --- <img src="img/parsnip.png" width="15%" align="right" /> # `predict()` ```r predict(objeto, datos_nuevos) ``` * El objeto es un objeto de clase "model fit" (obtenido en el paso anterior) * datos_nuevos es un tibble o data.frame .footnote[https://tidymodels.github.io/parsnip/reference/predict.model_fit.html] --- <img src="img/parsnip.png" width="15%" align="right" /> # `predict()` ```r iris_ranger %>% `predict`(iris_testing) #predicción ``` ``` ## # A tibble: 37 x 1 ## .pred_class ## <fct> ## 1 setosa ## 2 setosa ## 3 setosa ## 4 setosa ## 5 setosa ## 6 setosa ## 7 setosa ## 8 setosa ## 9 versicolor ## 10 versicolor ## # … with 27 more rows ``` .footnote[https://tidymodels.github.io/parsnip/reference/predict.model_fit.html] --- <img src="img/parsnip.png" width="15%" align="right" /> # `bind_cols()` ```r iris_ranger %>% `predict`(iris_testing) %>% `bind_cols`(iris_testing) # me permite comparar ``` ``` ## # A tibble: 37 x 5 ## .pred_class Sepal.Length Sepal.Width Petal.Width Species ## <fct> <dbl> <dbl> <dbl> <fct> ## 1 setosa -1.81 -0.413 -1.23 setosa ## 2 setosa -0.467 1.44 -1.23 setosa ## 3 setosa -0.735 0.742 -1.23 setosa ## 4 setosa -0.467 0.742 -0.960 setosa ## 5 setosa -1.00 0.974 -1.09 setosa ## 6 setosa -1.81 0.280 -1.23 setosa ## 7 setosa -1.27 -0.182 -1.09 setosa ## 8 setosa -1.00 0.511 -1.23 setosa ## 9 versicolor -0.0652 -0.644 0.237 versicolor ## 10 versicolor -1.00 -2.49 -0.162 versicolor ## # … with 27 more rows ``` .footnote[https://dplyr.tidyverse.org/reference/bind.html] --- background-image: url(img/engine3.png) background-size: cover class: center, middle # `predict()`: me permite hacer la predicción del modelo con datos nuevos # `bind_cols()`: me permite comparar los resultados con los valores verdaderos --- class: inverse, center <img src="img/yardstick.png" width="60%" align="center" /> # `Validación` --- background-image: url(img/fondo-madera.png) background-size: cover class: center, middle # Durante la validación, evaluamos el modelo predictivo # Esa evaluación puede ser mediante una métrica o un gráfico --- <img src="img/yardstick.jpg" width="10%" align="right" /> # Evaluación de un clasificador <img src="img/eval-clasificador.png" width="100%" align="right" /> --- <img src="img/yardstick.jpg" width="10%" align="right" /> # Matriz de Confusión <img src="img/matriz-confusion.png" width="100%" align="right" /> --- <img src="img/yardstick.jpg" width="10%" align="right" /> # Curvas ROC * Las curvas ROC son una poderosa herramienta gráfica para visualizar el desempeño de un algoritmo de aprendizaje a través de una variación en el criterio de decisión. <br><br> * Las curvas ROC se han utilizado no sólo para __estudiar el comportamiento de un algoritmo__ sino también __identificar regiones óptimas de desempeño__, __realizar la selección de modelos__, y lo más importante para __comparar y evaluar algoritmos de aprendizaje automático__. <br><br> * En el _eje X_ de una curva ROC tenemos el eje horizontal, que muestra la _tasa de falsos positivos (TFP)_ y el eje vertical (_eje y_) muestra la _tasa de verdaderos positivos_ de un clasificador. --- <img src="img/yardstick.jpg" width="10%" align="right" /> ## 4° Paso: Validación del modelo predictivo ### Random Forest con librería `ranger` ```r iris_ranger %>% predict(iris_testing) %>% #predicción bind_cols(iris_testing) %>% #comparar `metrics`(truth=Species, estimate=.pred_class) #métricas ``` ``` ## # A tibble: 2 x 3 ## .metric .estimator .estimate ## <chr> <chr> <dbl> ## 1 accuracy multiclass 1 ## 2 kap multiclass 1 ``` --- <img src="img/yardstick.jpg" width="10%" align="right" /> # `metrics()` ```r iris_ranger %>% `predict`(iris_testing) %>% `bind_cols`(iris_testing) %>% `metrics`(truth=Species, estimate=.pred_class) ``` ``` ## # A tibble: 2 x 3 ## .metric .estimator .estimate ## <chr> <chr> <dbl> ## 1 accuracy multiclass 1 ## 2 kap multiclass 1 ``` --- <img src="img/yardstick.jpg" width="10%" align="right" /> # `sens()` ```r iris_ranger %>% predict(iris_testing) %>% bind_cols(iris_testing) %>% `sens`(truth=Species, estimate=.pred_class) #sensibilidad ``` ``` ## # A tibble: 1 x 3 ## .metric .estimator .estimate ## <chr> <chr> <dbl> ## 1 sens macro 1 ``` .footnote[https://tidymodels.github.io/yardstick/reference/sens.html] --- <img src="img/yardstick.jpg" width="10%" align="right" /> # `spec()` ```r iris_ranger %>% predict(iris_testing) %>% bind_cols(iris_testing) %>% `spec`(truth=Species, estimate=.pred_class) #especificidad ``` ``` ## # A tibble: 1 x 3 ## .metric .estimator .estimate ## <chr> <chr> <dbl> ## 1 spec macro 1 ``` .footnote[https://tidymodels.github.io/yardstick/reference/spec.html] --- <img src="img/yardstick.jpg" width="10%" align="right" /> # `precision()` ```r iris_ranger %>% predict(iris_testing) %>% bind_cols(iris_testing) %>% `precision`(truth=Species, estimate=.pred_class) #precisión ``` ``` ## # A tibble: 1 x 3 ## .metric .estimator .estimate ## <chr> <chr> <dbl> ## 1 precision macro 1 ``` .footnote[https://tidymodels.github.io/yardstick/reference/precision.html] --- <img src="img/yardstick.jpg" width="10%" align="right" /> # `conf_mat()` ```r iris_ranger %>% predict(iris_testing) %>% bind_cols(iris_testing) %>% `conf_mat`(truth=Species, estimate=.pred_class) #matriz de confusión ``` ``` ## Truth ## Prediction setosa versicolor virginica ## setosa 8 0 0 ## versicolor 0 12 0 ## virginica 0 0 17 ``` .footnote[https://tidymodels.github.io/yardstick/reference/conf_mat.html] --- background-image: url(img/engine3.png) background-size: cover class: center, middle # `metrics()`: exactitud y kappa # `sens()`: sensibilidad # `spec()`: especificidad # `precision()`: precisión # `conf_mat()`: matriz de confusión --- <img src="img/yardstick.jpg" width="10%" align="right" /> # Obtengo las probabilidades ```r iris_probs <- iris_ranger %>% `predict`(iris_testing, type = "prob") %>% bind_cols(iris_testing)%>% select(.pred_setosa:.pred_virginica, Species) iris_probs ``` ``` ## # A tibble: 37 x 4 ## .pred_setosa .pred_versicolor .pred_virginica Species ## <dbl> <dbl> <dbl> <fct> ## 1 0.900 0.0845 0.0160 setosa ## 2 0.984 0.0163 0 setosa ## 3 0.992 0.00785 0 setosa ## 4 0.976 0.0243 0 setosa ## 5 1.00 0 0.000444 setosa ## 6 0.987 0.0125 0 setosa ## 7 0.964 0.0267 0.00979 setosa ## 8 0.966 0.0234 0.0104 setosa ## 9 0.0135 0.928 0.0586 versicolor ## 10 0.137 0.705 0.158 versicolor ## # … with 27 more rows ``` --- <img src="img/yardstick.jpg" width="10%" align="right" /> ```r iris_probs%>% roc_curve(Species, .pred_setosa:.pred_virginica) %>% autoplot() ``` ![](ml-fundamentals_files/figure-html/unnamed-chunk-31-1.png)<!-- --> .footnote[https://tidymodels.github.io/yardstick/reference/roc_curve.html] --- background-image: url(img/engine3.png) background-size: cover class: center, middle # `roc_curve()`: curva ROC # `autoplot()`: me permite graficar --- <img src="img/tidymodels.png" width="10%" align="right" /> # Resumiendo <img src="img/resumiendo-tidymodels1.png" width="100%" align="right" /> --- <img src="img/tidymodels.png" width="10%" align="right" /> # Resumiendo <img src="img/resumiendo-tidymodels2.png" width="100%" align="right" /> --- <img src="img/tidymodels.png" width="10%" align="right" /> # Resumiendo <img src="img/resumiendo-tidymodels3.png" width="100%" align="right" /> --- <img src="img/tidymodels.png" width="10%" align="right" /> # Resumiendo <img src="img/resumiendo-tidymodels4.png" width="100%" align="right" /> --- <img src="img/tidymodels.png" width="10%" align="right" /> # Resumiendo <img src="img/resumiendo-tidymodels5.png" width="100%" align="right" /> --- <img src="img/tidymodels.png" width="10%" align="right" /> # NO OLVIDAR ## Para buscar información sobre alguna función en particular ```r library(tidymodels) ?initial_split ?recipe ?bake ?rand_forest ?metrics ``` --- # Bibliografía - Tutorial de Tidymodels https://rviews.rstudio.com/2019/06/19/a-gentle-intro-to-tidymodels/ - Tutorial de Tidymodels (español) https://diegokoz.github.io/EEA2019/clase%208/tidymodels.nb.html - Tutorial "Modeling with parsnip and tidymodels" https://www.benjaminsorensen.me/post/modeling-with-parsnip-and-tidymodels/ - parsnip: A tidy model interface - Max Kuhn (video) bit.ly/parsnip-rstudioconf2019 - Recipes for data Preprocessing - Max Kuhn (video) bit.ly/recipes-useR2018 - Árboles de decisión y Random Forest https://bookdown.org/content/2031/ - Applied Predictive Modeling http://appliedpredictivemodeling.com/ --- # ¿De donde estudio para aprender ML? <img src="img/ml-libros.png" width="100%" align="center" /> --- ```r sessionInfo() ``` ``` ## R version 3.6.3 (2020-02-29) ## Platform: x86_64-pc-linux-gnu (64-bit) ## Running under: Ubuntu 20.04 LTS ## ## Matrix products: default ## BLAS: /usr/lib/x86_64-linux-gnu/blas/libblas.so.3.9.0 ## LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.9.0 ## ## locale: ## [1] LC_CTYPE=es_AR.UTF-8 LC_NUMERIC=C ## [3] LC_TIME=es_AR.UTF-8 LC_COLLATE=es_AR.UTF-8 ## [5] LC_MONETARY=es_AR.UTF-8 LC_MESSAGES=es_AR.UTF-8 ## [7] LC_PAPER=es_AR.UTF-8 LC_NAME=C ## [9] LC_ADDRESS=C LC_TELEPHONE=C ## [11] LC_MEASUREMENT=es_AR.UTF-8 LC_IDENTIFICATION=C ## ## attached base packages: ## [1] stats graphics grDevices utils datasets methods base ## ## other attached packages: ## [1] corrplot_0.84 GGally_1.5.0 yardstick_0.0.6 workflows_0.1.1 ## [5] tune_0.1.0 tibble_3.0.1 rsample_0.0.6 recipes_0.1.12 ## [9] purrr_0.3.4 parsnip_0.1.1 infer_0.5.1 ggplot2_3.3.0 ## [13] dplyr_0.8.5 dials_0.0.6 scales_1.1.0 broom_0.5.6 ## [17] tidymodels_0.1.0 emo_0.0.0.9000 fontawesome_0.1.0 ## ## loaded via a namespace (and not attached): ## [1] backports_1.1.6 xaringan_0.16 tidytext_0.2.4 ## [4] plyr_1.8.6 igraph_1.2.5 splines_3.6.3 ## [7] crosstalk_1.0.0 listenv_0.8.0 SnowballC_0.7.0 ## [10] rstantools_2.0.0 inline_0.3.15 digest_0.6.25 ## [13] foreach_1.4.8 htmltools_0.4.0 rsconnect_0.8.16 ## [16] fansi_0.4.1 magrittr_1.5 globals_0.12.5 ## [19] gower_0.2.1 matrixStats_0.56.0 xts_0.12-0 ## [22] prettyunits_1.1.1 colorspace_1.4-1 xfun_0.13 ## [25] callr_3.4.3 crayon_1.3.4 lme4_1.1-23 ## [28] survival_3.1-8 zoo_1.8-8 iterators_1.0.12 ## [31] glue_1.4.0 gtable_0.3.0 ipred_0.9-9 ## [34] pkgbuild_1.0.7 rstan_2.19.3 miniUI_0.1.1.1 ## [37] Rcpp_1.0.4.6 xtable_1.8-4 GPfit_1.0-8 ## [40] stats4_3.6.3 lava_1.6.7 StanHeaders_2.19.2 ## [43] prodlim_2019.11.13 DT_0.12 htmlwidgets_1.5.1 ## [46] threejs_0.3.3 RColorBrewer_1.1-2 ellipsis_0.3.0 ## [49] farver_2.0.3 reshape_0.8.8 pkgconfig_2.0.3 ## [52] loo_2.2.0 nnet_7.3-13 utf8_1.1.4 ## [55] labeling_0.3 tidyselect_1.0.0 rlang_0.4.6 ## [58] DiceDesign_1.8-1 reshape2_1.4.4 later_1.0.0 ## [61] munsell_0.5.0 tools_3.6.3 cli_2.0.2 ## [64] generics_0.0.2 ranger_0.12.1 ggridges_0.5.2 ## [67] evaluate_0.14 stringr_1.4.0 fastmap_1.0.1 ## [70] yaml_2.2.1 processx_3.4.2 knitr_1.28 ## [73] future_1.16.0 nlme_3.1-144 mime_0.9 ## [76] rstanarm_2.19.3 rstudioapi_0.11 tokenizers_0.2.1 ## [79] compiler_3.6.3 bayesplot_1.7.1 shinythemes_1.1.2 ## [82] tidyposterior_0.0.2 lhs_1.0.2 statmod_1.4.34 ## [85] stringi_1.4.6 ps_1.3.2 lattice_0.20-40 ## [88] Matrix_1.2-18 nloptr_1.2.2.1 markdown_1.1 ## [91] shinyjs_1.1 vctrs_0.2.4 pillar_1.4.3 ## [94] lifecycle_0.2.0 furrr_0.1.0 httpuv_1.5.2 ## [97] R6_2.4.1 promises_1.1.0 gridExtra_2.3 ## [100] janeaustenr_0.1.5 codetools_0.2-16 boot_1.3-24 ## [103] colourpicker_1.0 MASS_7.3-51.5 gtools_3.8.2 ## [106] assertthat_0.2.1 withr_2.2.0 shinystan_2.5.0 ## [109] parallel_3.6.3 grid_3.6.3 rpart_4.1-15 ## [112] timeDate_3043.102 tidyr_1.0.2 class_7.3-15 ## [115] minqa_1.2.4 rmarkdown_2.1 pROC_1.16.2 ## [118] tidypredict_0.4.5 shiny_1.4.0.2 lubridate_1.7.8 ## [121] base64enc_0.1-3 dygraphs_1.1.1.6 ```