class: center, middle, inverse, title-slide .title[ # Introdução ao Machine Learning ] .subtitle[ ## Definição e Estratégias ] .author[ ###
] .date[ ### September de 2022 ] --- # Ciência de dados <img src="static/img/ciclo-ciencia-de-dados.png" style = "display: block; margin-left: auto; margin-right: auto;" width = 70%> --- # Referências .pull-left[ <a href = "https://web.stanford.edu/~hastie/ISLRv2_website.pdf"> <img src="static/img/islr.png" style=" display: block; margin-left: auto; margin-right: auto;"></img> </a> ] .pull-right[ <a href = "https://web.stanford.edu/~hastie/Papers/ESLII.pdf"> <img src="static/img/esl.jpg" width = 44% style=" display: block; margin-left: auto; margin-right: auto;"></img> </a> ] --- # Referências .pull-left[ <a href = "https://r4ds.had.co.nz/"> <img src="static/img/r4ds.png" style=" display: block; margin-left: auto; margin-right: auto;"></img> </a> ] .pull-right[ <a href = "https://www.tmwr.org/"> <img src="static/img/tidymodels.png" width = 55% style=" display: block; margin-left: auto; margin-right: auto;"></img> </a> ] --- # Referências - [Feature Engineering and Selection: A Practical Approach for Predictive Models](http://www.feat.engineering/) - [Aprendizado De Máquina](http://www.rizbicki.ufscar.br/AME.pdf) - [Forecasting: Principles and Practice](https://otexts.com/fpp3/) --- class: middle, center, inverse # Introdução --- # O que é Machine Learning? <br> - Termo criado por Arthur Samuel, em 1959 <img src="static/img/arthur-sam.png" class="center2" width=100> - Modelagem preditiva é um framework de análise de dados que visa gerar a estimativa mais precisa possível para uma quantidade ou fenômeno (Max Kuhn, 2014). --- ## Exemplos .pull-left[ - Previsão de churn - Previsão de inadimplência - Previsão de demanda - Previsão de preço - Previsão meteorológica - Diagnóstico em imagem médica - Carro autônomo - Projeção da taxa de desemprego ] .pull-right[ - Teste A/B - Teste clínico - Eficácia de vacinas - Impactos de políticas públicas - Impactos de campanha publicitária - Curvas epidemiológicas - Projeção do PIB - ... ] --- <img src="https://wordstream-files-prod.s3.amazonaws.com/s3fs-public/styles/simple_image/public/images/machine-learning1.png?Q_SmWhhhAEOO_32HNjPhcxsPhreWV26o&itok=yjEJbEKD" style="display: block; margin-left: auto; margin-right: auto;" width=70%></img> .footnote[ fonte: [business2community](https://www.business2community.com/trends-news/10-companies-using-machine-learning-cool-ways-01889944) ] --- # Motivação Somos consultores e fomos contratados para dar conselhos para uma empresa aumentar as suas vendas. Obtivemos o seguinte banco de dados <img src="01-intro-ml_files/figure-html/unnamed-chunk-2-1.png" style="display: block; margin: auto;" /> * PERGUNTA: Quantas vendas terão se eu investir X? Em qual mídia eu escolho alocar meu orçamento? --- # Motivação Somos consultores e fomos contratados para dar conselhos para uma empresa aumentar as suas vendas. Obtivemos o seguinte banco de dados <img src="01-intro-ml_files/figure-html/unnamed-chunk-3-1.png" style="display: block; margin: auto;" /> * PERGUNTA: Quantas vendas terão se eu investir X? Em qual mídia eu escolho alocar meu orçamento? --- # Motivação - outro exemplo Somos da área de inadimplência e precisamos agir para assessorar clientes em situação iminente de atraso. Obtivemos o seguinte banco de dados <img src="01-intro-ml_files/figure-html/unnamed-chunk-4-1.png" style="display: block; margin: auto;" /> * PERGUNTA: Qual a probabilidade do contrato 123 atrasar a próxima fatura no mês que vem? --- # Motivação - outro exemplo Somos da área de inadimplência e precisamos agir para assessorar clientes em situação iminente de atraso. Obtivemos o seguinte banco de dados <img src="01-intro-ml_files/figure-html/unnamed-chunk-5-1.png" style="display: block; margin: auto;" /> * PERGUNTA: Qual a probabilidade do contrato 123 atrasar a próxima fatura no mês que vem? --- # Motivação - outro exemplo Somos da área de inadimplência e precisamos agir para assessorar clientes em situação iminente de atraso. Obtivemos o seguinte banco de dados <img src="01-intro-ml_files/figure-html/unnamed-chunk-6-1.png" style="display: block; margin: auto;" /> * PERGUNTA: Qual a probabilidade do contrato 123 atrasar a próxima fatura no mês que vem? --- # Motivação - outro exemplo Somos da área de inadimplência e precisamos agir para assessorar clientes em situação iminente de atraso. Obtivemos o seguinte banco de dados <img src="01-intro-ml_files/figure-html/unnamed-chunk-7-1.png" style="display: block; margin: auto;" /> * PERGUNTA: Qual a probabilidade do contrato 123 atrasar a próxima fatura no mês que vem? --- # Motivação - outro exemplo Somos da área de inadimplência e precisamos agir para assessorar clientes em situação iminente de atraso. Obtivemos o seguinte banco de dados <img src="01-intro-ml_files/figure-html/unnamed-chunk-8-1.png" style="display: block; margin: auto;" /> * PERGUNTA: Qual a probabilidade do contrato 123 atrasar a próxima fatura no mês que vem? --- # Motivação - outro exemplo Somos da área de inadimplência e precisamos agir para assessorar clientes em situação iminente de atraso. Obtivemos o seguinte banco de dados <img src="01-intro-ml_files/figure-html/unnamed-chunk-9-1.png" style="display: block; margin: auto;" /> * PERGUNTA: Qual a probabilidade do contrato 123 atrasar a próxima fatura no mês que vem? --- # Machine Learning Matematicamente, queremos encontrar uma função `\(f()\)` tal que: <img src="static/img/y_fx.png" style="position: fixed; width: 40%; top: 250px; left: 300px;"> <br/> <br/> <br/> <br/> <br/> <br/> <br/> Nos exemplos: `\(vendas = f(midia, investimento)\)` `\(inadimplência = f(valor da parcela, tipo de contrato)\)` --- # Modo - Regressão e Classificação Existem dois principais tipos de problemas em Machine Learning: .pull-left[ ## Regressão __Y__ é uma variável contínua. - Volume de vendas - Peso - Temperatura - Valor de Ações ] .pull-right[ ## Classificação __Y__ é uma variável categórica. - Fraude/Não Fraude - Pegou em dia/Não pagou - Cancelou assinatura/Não cancelou - Gato/Cachorro/Cavalo/Outro ] --- # Exemplos de f(x) <img src="01-intro-ml_files/figure-html/unnamed-chunk-11-1.png" style="display: block; margin: auto;" /> --- # Exemplos de f(x) <img src="01-intro-ml_files/figure-html/unnamed-chunk-12-1.png" style="display: block; margin: auto;" /> --- # Exemplos de f(x) <img src="01-intro-ml_files/figure-html/unnamed-chunk-14-1.png" style="display: block; margin: auto;" /> --- # Exemplos de f(x) <img src="01-intro-ml_files/figure-html/unnamed-chunk-15-1.png" style="display: block; margin: auto;" /> --- # Definições e Nomenclaturas ### A tabela por trás (do excel, do sql, etc.) <table> <thead> <tr> <th style="text-align:left;"> midia </th> <th style="text-align:right;"> investimento </th> <th style="text-align:right;"> vendas </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> TV </td> <td style="text-align:right;"> 220.3 </td> <td style="text-align:right;"> 24.7 </td> </tr> <tr> <td style="text-align:left;"> newspaper </td> <td style="text-align:right;"> 25.6 </td> <td style="text-align:right;"> 5.3 </td> </tr> <tr> <td style="text-align:left;"> newspaper </td> <td style="text-align:right;"> 38.7 </td> <td style="text-align:right;"> 18.3 </td> </tr> <tr> <td style="text-align:left;"> radio </td> <td style="text-align:right;"> 42.3 </td> <td style="text-align:right;"> 25.4 </td> </tr> <tr> <td style="text-align:left;"> radio </td> <td style="text-align:right;"> 43.9 </td> <td style="text-align:right;"> 22.3 </td> </tr> <tr> <td style="text-align:left;"> TV </td> <td style="text-align:right;"> 139.5 </td> <td style="text-align:right;"> 10.3 </td> </tr> <tr> <td style="text-align:left;"> radio </td> <td style="text-align:right;"> 11.0 </td> <td style="text-align:right;"> 7.2 </td> </tr> <tr> <td style="text-align:left;"> radio </td> <td style="text-align:right;"> 1.6 </td> <td style="text-align:right;"> 6.9 </td> </tr> </tbody> </table> --- # Definições e Nomenclaturas * `\(X_1\)`, `\(X_2\)`, ..., `\(X_p\)`: variáveis explicativas (ou variáveis independentes ou *features* ou preditores). - `\(\boldsymbol{X} = {X_1, X_2, \dots, X_p}\)`: conjunto de todas as *features*. * __Y__: variável resposta (ou variável dependente ou *target*). * __Ŷ__: valor **esperado** (ou predição ou estimado ou *fitted*). * `\(f(X)\)` também é conhecida também como "Modelo" ou "Hipótese". ## No exemplo: - `\(X_1\)`: `midia` - indicadador de se a propaganda é para jornal, rádio, ou TV. - `\(X_2\)`: `investimento` - valor do orçamento * __Y__: `vendas` - qtd vendida --- # Definições e Nomenclaturas ### **Observado** *versus* **Esperado** - __Y__ é um valor **observado** (ou verdade ou *truth*) - __Ŷ__ é um valor **esperado** (ou predição ou estimado ou *fitted*). - __Y__ - __Ŷ__ é o resíduo (ou erro) Por definição, `\(\hat{Y} = f(x)\)` que é o valor que a função `\(f\)` retorna. <img src="01-intro-ml_files/figure-html/unnamed-chunk-17-1.png" width="750" style="display: block; margin: auto;" /> --- # Definições e Nomenclaturas ### **Observado** *versus* **Esperado** - __Y__ é um valor **observado** (ou verdade ou *truth*) - __Ŷ__ é um valor **esperado** (ou predição ou estimado ou *fitted*). - __Y__ - __Ŷ__ é o resíduo (ou erro) Por definição, `\(\hat{Y} = f(x)\)` que é o valor que a função `\(f\)` retorna. <img src="01-intro-ml_files/figure-html/unnamed-chunk-18-1.png" width="750" style="display: block; margin: auto;" /> --- # Definições e Nomenclaturas ### A tabela por trás depois das predições <table> <thead> <tr> <th style="text-align:left;"> midia </th> <th style="text-align:right;"> investimento </th> <th style="text-align:right;"> vendas </th> <th style="text-align:right;"> arvore </th> <th style="text-align:right;"> regressao_linear </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> TV </td> <td style="text-align:right;"> 220.3 </td> <td style="text-align:right;"> 24.7 </td> <td style="text-align:right;font-weight: bold;color: purple !important;"> 18.1 </td> <td style="text-align:right;font-weight: bold;color: purple !important;"> 17.8 </td> </tr> <tr> <td style="text-align:left;"> newspaper </td> <td style="text-align:right;"> 25.6 </td> <td style="text-align:right;"> 5.3 </td> <td style="text-align:right;font-weight: bold;color: purple !important;"> 12.2 </td> <td style="text-align:right;font-weight: bold;color: purple !important;"> 13.8 </td> </tr> <tr> <td style="text-align:left;"> newspaper </td> <td style="text-align:right;"> 38.7 </td> <td style="text-align:right;"> 18.3 </td> <td style="text-align:right;font-weight: bold;color: purple !important;"> 14.9 </td> <td style="text-align:right;font-weight: bold;color: purple !important;"> 14.4 </td> </tr> <tr> <td style="text-align:left;"> radio </td> <td style="text-align:right;"> 42.3 </td> <td style="text-align:right;"> 25.4 </td> <td style="text-align:right;font-weight: bold;color: purple !important;"> 21.9 </td> <td style="text-align:right;font-weight: bold;color: purple !important;"> 15.0 </td> </tr> <tr> <td style="text-align:left;"> radio </td> <td style="text-align:right;"> 43.9 </td> <td style="text-align:right;"> 22.3 </td> <td style="text-align:right;font-weight: bold;color: purple !important;"> 16.8 </td> <td style="text-align:right;font-weight: bold;color: purple !important;"> 15.1 </td> </tr> <tr> <td style="text-align:left;"> TV </td> <td style="text-align:right;"> 139.5 </td> <td style="text-align:right;"> 10.3 </td> <td style="text-align:right;font-weight: bold;color: purple !important;"> 14.2 </td> <td style="text-align:right;font-weight: bold;color: purple !important;"> 13.6 </td> </tr> <tr> <td style="text-align:left;"> radio </td> <td style="text-align:right;"> 11.0 </td> <td style="text-align:right;"> 7.2 </td> <td style="text-align:right;font-weight: bold;color: purple !important;"> 12.2 </td> <td style="text-align:right;font-weight: bold;color: purple !important;"> 13.4 </td> </tr> <tr> <td style="text-align:left;"> radio </td> <td style="text-align:right;"> 1.6 </td> <td style="text-align:right;"> 6.9 </td> <td style="text-align:right;font-weight: bold;color: purple !important;"> 12.2 </td> <td style="text-align:right;font-weight: bold;color: purple !important;"> 12.9 </td> </tr> </tbody> </table> --- # Outro Exemplo: Classificação ### A tabela por trás (do excel, do sql, etc.) <table> <thead> <tr> <th style="text-align:left;"> tipo_de_contrato </th> <th style="text-align:right;"> valor_da_parcela </th> <th style="text-align:right;"> atrasou </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> padrao </td> <td style="text-align:right;"> 2692 </td> <td style="text-align:right;"> 1 </td> </tr> <tr> <td style="text-align:left;"> revol </td> <td style="text-align:right;"> 1245 </td> <td style="text-align:right;"> 0 </td> </tr> <tr> <td style="text-align:left;"> price </td> <td style="text-align:right;"> 2369 </td> <td style="text-align:right;"> 1 </td> </tr> <tr> <td style="text-align:left;"> revol </td> <td style="text-align:right;"> 1571 </td> <td style="text-align:right;"> 1 </td> </tr> <tr> <td style="text-align:left;"> padrao </td> <td style="text-align:right;"> 2349 </td> <td style="text-align:right;"> 1 </td> </tr> <tr> <td style="text-align:left;"> revol </td> <td style="text-align:right;"> 1652 </td> <td style="text-align:right;"> 1 </td> </tr> <tr> <td style="text-align:left;"> price </td> <td style="text-align:right;"> 2840 </td> <td style="text-align:right;"> 1 </td> </tr> <tr> <td style="text-align:left;"> revol </td> <td style="text-align:right;"> 924 </td> <td style="text-align:right;"> 0 </td> </tr> </tbody> </table> --- # Outro Exemplo: Classificação * `\(X_1\)`, `\(X_2\)`, ..., `\(X_p\)`: variáveis explicativas (ou variáveis independentes ou *features* ou preditores). - `\(\boldsymbol{X} = {X_1, X_2, \dots, X_p}\)`: conjunto de todas as *features*. * __Y__: variável resposta (ou variável dependente ou *target*). * __Ŷ__: valor **esperado** (ou predição ou score ou *fitted*). * `\(f(X)\)` também é conhecida também como "Modelo" ou "Hipótese". ## No exemplo: - `\(X_1\)`: `tipo_de_contrato` - flags de se o contrato é padrao, price, ou revol. - `\(X_2\)`: `valor_da_parcela` - Valor da parcela do financiamento. * __Y__: `atrasou` - indicador de atraso maior que 30 dias na parcela. --- # Outro Exemplo: Classificação ### **Observado** *versus* **Esperado** - __Y__ é um valor **observado** (ou rótulo ou target ou verdade ou *truth*) - __Ŷ__ é um valor **esperado** (ou score ou probabilidade predita). - __log(Ŷ)__ ou __log(1-Ŷ)__ é o resíduo (ou erro) Por definição, `\(\hat{Y} = f(x)\)` que é o valor que a função `\(f\)` retorna. <img src="01-intro-ml_files/figure-html/unnamed-chunk-21-1.png" width="750" style="display: block; margin: auto;" /> --- # Outro Exemplo: Classificação ### **Observado** *versus* **Esperado** - __Y__ é um valor **observado** (ou rótulo ou target ou verdade ou *truth*) - __Ŷ__ é um valor **esperado** (ou score ou probabilidade predita). - __log(Ŷ)__ ou __log(1-Ŷ)__ é o resíduo (ou erro) Por definição, `\(\hat{Y} = f(x)\)` que é o valor que a função `\(f\)` retorna. <img src="01-intro-ml_files/figure-html/unnamed-chunk-22-1.png" width="750" style="display: block; margin: auto;" /> --- # Outro Exemplo: Classificação ### A tabela por trás depois das predições <table> <thead> <tr> <th style="text-align:left;"> tipo_de_contrato </th> <th style="text-align:right;"> valor_da_parcela </th> <th style="text-align:right;"> atrasou </th> <th style="text-align:right;"> arvore </th> <th style="text-align:right;"> regressao_logistica </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> padrao </td> <td style="text-align:right;"> 2692 </td> <td style="text-align:right;"> 1 </td> <td style="text-align:right;font-weight: bold;color: purple !important;"> 0.95 </td> <td style="text-align:right;font-weight: bold;color: purple !important;"> 0.98 </td> </tr> <tr> <td style="text-align:left;"> revol </td> <td style="text-align:right;"> 1245 </td> <td style="text-align:right;"> 0 </td> <td style="text-align:right;font-weight: bold;color: purple !important;"> 0.03 </td> <td style="text-align:right;font-weight: bold;color: purple !important;"> 0.26 </td> </tr> <tr> <td style="text-align:left;"> price </td> <td style="text-align:right;"> 2369 </td> <td style="text-align:right;"> 1 </td> <td style="text-align:right;font-weight: bold;color: purple !important;"> 0.95 </td> <td style="text-align:right;font-weight: bold;color: purple !important;"> 0.98 </td> </tr> <tr> <td style="text-align:left;"> revol </td> <td style="text-align:right;"> 1571 </td> <td style="text-align:right;"> 1 </td> <td style="text-align:right;font-weight: bold;color: purple !important;"> 0.90 </td> <td style="text-align:right;font-weight: bold;color: purple !important;"> 0.71 </td> </tr> <tr> <td style="text-align:left;"> padrao </td> <td style="text-align:right;"> 2349 </td> <td style="text-align:right;"> 1 </td> <td style="text-align:right;font-weight: bold;color: purple !important;"> 0.95 </td> <td style="text-align:right;font-weight: bold;color: purple !important;"> 0.88 </td> </tr> <tr> <td style="text-align:left;"> revol </td> <td style="text-align:right;"> 1652 </td> <td style="text-align:right;"> 1 </td> <td style="text-align:right;font-weight: bold;color: purple !important;"> 0.90 </td> <td style="text-align:right;font-weight: bold;color: purple !important;"> 0.80 </td> </tr> <tr> <td style="text-align:left;"> price </td> <td style="text-align:right;"> 2840 </td> <td style="text-align:right;"> 1 </td> <td style="text-align:right;font-weight: bold;color: purple !important;"> 0.95 </td> <td style="text-align:right;font-weight: bold;color: purple !important;"> 1.00 </td> </tr> <tr> <td style="text-align:left;"> revol </td> <td style="text-align:right;"> 924 </td> <td style="text-align:right;"> 0 </td> <td style="text-align:right;font-weight: bold;color: purple !important;"> 0.03 </td> <td style="text-align:right;font-weight: bold;color: purple !important;"> 0.05 </td> </tr> </tbody> </table> --- ## Desempenho vs Interpretabilidade da f(x) <img src="01-intro-ml_files/figure-html/unnamed-chunk-25-1.png" width="600" style="display: block; margin: auto;" /> Características importantes: interprabilidade, custo computacional e poder preditivo. --- # Por que ajustar uma f? * Predição * Inferência ## Predição Em muitas situações X está disponível facilmente mas, Y não é fácil de descobrir. (Ou mesmo não é possível descobrí-lo). Queremos que `\(\hat{Y} = \hat{f}(X)\)` seja uma boa estimativa (preveja bem o futuro). Neste caso não estamos interessados em como é a estrutura `\(\hat{f}\)` desde que ela apresente predições boas para `\(Y\)`. Por exemplo: * Meu cliente vai atrasar a fatura no mês que vem? --- # Por que ajustar uma f? * Predição * Inferência ## Inferência Em inferência estamos mais interessados em entender a relação entre as variáveis explciativas `\(X\)` e a variável resposta `\(Y\)`. Por exemplo: * A dose da droga é eficaz para o tratamento da doença X até quanto? * **Quanto que é** o impacto nas vendas para cada real investido em TV? Neste material focaremos em **predição**. --- # Por que ajustar uma f? <img src="static/img/usos_do_ml.png" style="display: block; margin-left: auto; margin-right: auto;" width=80%></img> --- ## Métricas - "Melhor f(x)" segundo o quê? Queremos a `\(f(x)\)` que **erre menos**. Exemplo de **métrica** de erro: **R**oot **M**ean **S**quared **E**rror. $$ RMSE = \sqrt{\frac{1}{N}\sum(y_i - \hat{y_i})^2} $$ <img src="01-intro-ml_files/figure-html/unnamed-chunk-26-1.png" style="display: block; margin: auto;" /> --- ## Métricas - "Melhor f(x)" segundo o quê? Queremos a `\(f(x)\)` que **erre menos**. Exemplo de métrica de erro: **R**oot **M**ean **S**quared **E**rror. $$ RMSE = \sqrt{\frac{1}{N}\sum(y_i - \hat{y_i})^2} $$ Ou seja, nosso **objetivo** é ### Encontrar `\(f(x)\)` que nos retorne o ~menor~ RMSE. --- ## Métricas - "Melhor f(x)" segundo o quê? Queremos a reta que **erre menos**. Exemplo: Modelo de regressão linear `\(f(x) = \beta_0 + \beta_1 x\)`. <img src="static/img/0_D7zG46WrdKx54pbU.gif" style="position: fixed; width: 60%; "> .footnote[ Fonte: [https://alykhantejani.github.io/images/gradient_descent_line_graph.gif](https://alykhantejani.github.io/images/gradient_descent_line_graph.gif) ] --- ## Métricas - "Melhor f(x)" segundo o quê? Queremos a `\(f(x)\)` que **erre menos**. Exemplo de métrica de erro: **R**oot **M**ean **S**quared **E**rror. $$ RMSE = \sqrt{\frac{1}{N}\sum(y_i - \hat{y_i})^2} $$ .pull-left[ MAE: Mean Absolute Error $$ MAE = \frac{1}{N}\sum|y_i - \hat{y_i}| $$ ] .pull-right[ R2: R-squared $$ R^2 = 1 - \frac{\sum(y_i - \color{salmon}{\hat{y_i}})^2}{\sum(y_i - \color{royalblue}{\bar{y}})^2} $$ ] --- ## Métricas - "Melhor f(x)" segundo o quê? Na classificação a estratégia é a mesma. Queremos a curva que **erre menos**. Exemplo: Modelo de regressão logística `\(f(x) = \frac{1}{1 + e^{-(\beta_0 + \beta_1 x)}}\)`. .pull-left[ <img src="static/img/gif_reg_logistica_otimizacao.gif" style="position: fixed; width: 35%; "> ] .pull-right[ Métrica de Erro da Logística: `$$D = \frac{-1}{N}\sum[y_i \log\hat{y_i} + (1 - y_i )\log(1 - \hat{y_i})]$$` Em que `$$\hat{y}_i = f(x_i) = \frac{1}{1 + e^{-(\beta_0 + \beta_1 x_i)}}$$` ] --- # Métricas Métricas: para medir o quanto a `\(f(x)\)` está errando as previsões. .pull-left[ ## Regressão __Y__ é uma variável contínua. - **RMSE** - R2 - MAE - MAPE ... ] .pull-right[ ## Classificação __Y__ é uma variável categórica. - **Deviance (Cross-Entropy)** - Acurácia - AUROC - Precision/Recall - F1 - Kappa ... ] [lista de métricas no `yardstick`](https://tidymodels.github.io/yardstick/articles/metric-types.html) --- # Regressão Linear .pull-left[ ### Regressão Linear Simples $$ y = \beta_0 + \beta_1x $$ ### Exemplo: $$ dist = \beta_0 + \beta_1speed $$ ```r ### No R: linear_reg() %>% fit(dist ~ speed, data=cars) ``` ] .pull-right[ <img src="01-intro-ml_files/figure-html/unnamed-chunk-28-1.png" style="display: block; margin: auto;" /> .footnote[ Ver [ISL](https://www.ime.unicamp.br/~dias/Intoduction%20to%20Statistical%20Learning.pdf) página 61 (Simple Linear Regression). ] ] --- # Regressão Linear .pull-left[ ### Regressão Linear Múltipla $$ y = \beta_0 + \beta_1x_1 + \dots + \beta_px_p $$ ### Exemplo: $$ mpg = \beta_0 + \beta_1wt + \beta_2disp $$ ```r ### No R: linear_reg() %>% fit(mpg ~ wt + disp, data=mtcars) ``` ] .pull-right[
.footnote[ Fonte: [sthda.com](http://www.sthda.com/english/wiki/impressive-package-for-3d-and-4d-graph-r-software-and-data-visualization) ] ] --- # Regressão Linear - "Melhor Reta" Queremos a reta que **erre menos**. Uma métrica de erro: RMSE $$ RMSE = \sqrt{\frac{1}{N}\sum(y_i - \hat{y_i})^2} = \sqrt{\frac{1}{N}\sum(y_i - \color{red}{(\hat{\beta}_0 + \hat{\beta}_1speed)})^2} $$ Ou seja, nosso é **encontrar os `\(\hat{\beta}'s\)` que nos retorne o ~menor~ RMSE.** #### IMPORTANTE! o RMSE é **Métrica** que a regressão usa como **Função de Custo**. - **Função de Custo** - **Métrica** usada para encontrar os melhores parâmetros. --- ## Qual o valor ótimo para `\(\beta_0\)` e `\(\beta_1\)`? No nosso exemplo, a nossa **HIPÓTESE** é de que $$ dist = \beta_0 + \beta_1speed $$ Então podemos escrever o RMSE $$ RMSE = \sqrt{\frac{1}{N}\sum(y_i - \hat{y_i})^2} = \sqrt{\frac{1}{N}\sum(y_i - \color{red}{(\hat{\beta}_0 + \hat{\beta}_1speed)})^2} $$ .pull-left[ Método mais utilizado para otimizar modelos com parâmetros: **Gradient Descent** Ver [Wikipedia do Gradient Descent](https://en.wikipedia.org/wiki/Gradient_descent) ] .pull-right[ <img src = "static/img/gradient_descent.png" width = 45%> ] --- # Regressão Linear - "Melhor Reta" Queremos a reta que **erre menos**. Modelo: `\(y = \beta_0 + \beta_1 x\)` <img src="static/img/0_D7zG46WrdKx54pbU.gif" style="position: fixed; width: 60%; "> .footnote[ Fonte: [https://alykhantejani.github.io/images/gradient_descent_line_graph.gif](https://alykhantejani.github.io/images/gradient_descent_line_graph.gif) ] --- ## Depois de estimar... $$ \hat{y} = \hat{f}(x) = \hat{\beta}_0 + \hat{\beta}_1x $$ ### Exemplo: $$ \hat{dist} = \hat{\beta}_0 + \hat{\beta}_1speed $$ Colocamos um `\(\hat{}\)` em cima dos termos para representar "estimativas". Ou seja, `\(\hat{y}_i\)` é uma estimativa de `\(y_i\)`. No nosso exemplo, - `\(\hat{\beta}_0\)` é uma estimativa de `\(\beta_0\)` e vale `-17.5`. - `\(\hat{\beta}_1\)` é uma estimativa de `\(\beta_1\)` e vale `3.9`. - `\(\hat{dist}\)` é uma estimativa de `\(dist\)` e vale `-17.5 + 3.9 x speed`. ```r # Exercício: se speed for 15 m/h, quanto que # seria a distância dist esperada? ``` --- ## Tidymodels - Conjunto de pacotes/framework para desenvolvimento de modelos preditivos. Muitos tutoriais e guias no [site](https://www.tidymodels.org/). - Em desenvolvimento ativo pela RStudio. Possui muitas semelhanças com o 'tidyverse' o que faz com que mais prático. - Unifica o uso dos modelos já existentes no R. Ele é também extensível: você pode implementar um novo modelo que funcione com o tidymodels. - Alternativas: [{caret}](https://topepo.github.io/caret/), [{mlr3}](https://mlr3.mlr-org.com/), [{scikit-learn}](https://scikit-learn.org/stable/) (Python), [{PyCaret}](https://pycaret.org/) (Python). Em geral é fácil migrar de um framework p/ o outro - a parte mais difícil é aprender o fluxo de trabalho de **machine learning**. --- class: middle, center ## Exemplo 01 --- # Overfitting (sobreajuste) - Acontece quando um modelo funciona muito pior quando usado com dados novos quando comparado com a performance nos dados em que foi treinado. - Uma das principais preocupações quando ajustamos modelos em ML. - **Solução**: Sempre testar o modelo com dados 'novos'. --- # Overfitting (sobreajuste) <img src="01-intro-ml_files/figure-html/unnamed-chunk-33-1.png" width="720" style="display: block; margin: auto;" /> --- # Overfitting (sobreajuste) <img src="01-intro-ml_files/figure-html/unnamed-chunk-34-1.png" width="720" style="display: block; margin: auto;" /> --- # Overfitting (sobreajuste) <img src="01-intro-ml_files/figure-html/unnamed-chunk-35-1.png" width="720" style="display: block; margin: auto;" /> --- # Overfitting (sobreajuste) <img src="01-intro-ml_files/figure-html/unnamed-chunk-36-1.png" width="720" style="display: block; margin: auto;" /> --- # Overfitting (sobreajuste) Intuição ![scatter_eqm](static/img/overfiting_scatter_eqm.gif) --- # Overfitting (sobreajuste) Intuição ![scatter_eqm](static/img/overfiting_scatter_eqm_logistic.gif) --- # Dados novos vs antigos - **Base de Treino** (dados antigos): a base de histórico que usamos para ajustar o modelo. - **Base de Teste** (dados novos): a base que irá simular a chegada de dados novos, "em produção". .pull-left[ ```r initial_split(dados, prop=3/4) ``` > "Quanto mais complexo for o modelo, menor será o **erro de treino.**" > "Porém, o que importa é o **erro de teste**." ] .pull-right[ <img src="static/img/erro_treino_erro_teste.png" width = "400px"> ] --- class: middle, center ## Exemplo 02 --- # Dados novos vs antigos ## Estratégia #### 1) Separar inicialmente a base de dados em duas: **treino** e **teste**. ```r initial_split(dados, prop=3/4) # 3/4 de treino aleatoriamente initial_time_split(dados, prop=3/4) # 3/4 de treino respeitando a ordem ``` A base de teste só será tocada quando a modelagem terminar. Ela nunca deverá influenciar nas decisões que tomamos durante o período da modelagem. palavra-chave: **data leakage** ou **vazamento de informação** --- ## Regularização **Objetivo da Regularização:** Oferecer um parâmetro (um valor que podemos mudar) para termos controle sobre a **complexidade** da `\(f(x)\)` e assim evitar o *sobreajuste*. No exemplo da regressão linear, haverá um valor `\(\lambda\)` que chamaremos de "hiperparâmetro" da regressão. Iremos chutar diferentes valores de `\(\lambda\)` até encontrar a melhor `\(f(x)\)`. --- ## Regularização - LASSO Relembrando o nossa **função de custo** RMSE. `$$RMSE = \sqrt{\frac{1}{N}\sum(y_i - \hat{y_i})^2} = \sqrt{\frac{1}{N}\sum(y_i - \color{red}{(\hat{\beta}_0 + \hat{\beta}_1x_{1i} + \dots + \hat{\beta}_px_{pi})})^2}$$` Regularizar é "não deixar os `\(\beta's\)` soltos demais". `$$RMSE_{regularizado} = RMSE + \color{red}{\lambda}\sum_{j = 1}^{p}|\beta_j|$$` Ou seja, **penalizamos** a função de custo se os `\(\beta's\)` forem muito grandes. **PS1:** O `\(\color{red}{\lambda}\)` é um **hiperparâmetro** da Regressão Linear. **PS2:** Quanto maior o `\(\color{red}{\lambda}\)`, mais penalizamos os `\(\beta's\)` por serem grandes. --- ## Regularização - LASSO Vamos testar diversos valores para `\(\color{red}{\lambda}\)` até encontrar o que dá o menor erro de teste. <img src='static/img/lasso_lambda2.png' width = 70%> --- ## Regularização - LASSO Conforme aumentamos o `\(\color{red}{\lambda}\)`, forçamos os `\(\beta's\)` a serem cada vez menores. ![scatter_eqm](static/img/betas.png) .footnote[ Ver [ISL](https://www.ime.unicamp.br/~dias/Intoduction%20to%20Statistical%20Learning.pdf) página 219 (The LASSO). ] --- # Hiperparâmetros São parâmetros que têm que ser definidos antes de ajustar o modelo. Não há como achar o valor ótimo diretamente nas funções de custo. Precisam ser achados **na força bruta**. Exemplo: `lambda` da penalização do LASSO (`penalty`) .pull-left[ ``` linear_reg(penalty = 0.0) linear_reg(penalty = 0.1) linear_reg(penalty = 1.0) linear_reg(penalty = tune()) ``` ] --- ## Problema! Teremos que testar muitos 'lambdas'. Podemos desgastar a base de teste (erro de teste vai ter alta variabilidade). Para isso, inventaram a estratégia de reamostragem que oferece uma estimativa do erro de predição (erro de teste) de forma mais confiável. --- # Cross-validation (validação cruzada) **O que Validação cruzada faz:** estima (muito bem) o erro de predição. **Objetivo da Validação cruzada:** encontrar o melhor conjunto de hiperparâmetros. ### Estratégia .pull-left[ 1) Dividir o banco de dados em K partes. (Por ex, K = 5 como na figura) 2) Ajustar o mesmo modelo K vezes, deixar sempre um pedaço de fora para servir de base de teste. 3) Teremos K valores de erros de teste. Tira-se a média dos erros. ] .pull-right[ <img src="static/img/k-fold-cv.png"> ] --- # Cross-validation (validação cruzada) ```r vfold_cv(cars, v = 5) ``` ``` ## # 5-fold cross-validation ## # A tibble: 5 × 6 ## splits id n_treino n_teste regressao rmse_teste ## <list> <chr> <dbl> <dbl> <list> <dbl> ## 1 <split [40/10]> Fold1 40 10 <lm> 12.0 ## 2 <split [40/10]> Fold2 40 10 <lm> 21.4 ## 3 <split [40/10]> Fold3 40 10 <lm> 16.6 ## 4 <split [40/10]> Fold4 40 10 <lm> 11.3 ## 5 <split [40/10]> Fold5 40 10 <lm> 13.8 ``` ERRO DE VALIDAÇÃO CRUZADA: `$$RMSE_{cv} = \frac{1}{5}\sum_{i=1}^{5}RMSE_{Fold_i} = 15,1$$` --- # Cross-validation (validação cruzada) ### Esquema das divisões de bases: <img src="static/img/resampling.svg" width = 45%> .footnote[ Fonte: [bookdown.org/max/FES/resampling.html](https://bookdown.org/max/FES/resampling.html) ] --- # Cross-validation (validação cruzada) Em pseudo-código: ``` K <- 5 fold <- sample.int(K, nrow(mtcars), replace = TRUE) for (k in 1:K) { train <- mtcars[fold != k,] valid <- mtcars[fold == k,] # ajusta_modelo(train) # metrics(valid) } ``` --- class: middle, center ## Exemplo 03 --- ## Regularização - Ridge No LASSO, usamos o módulo dos betas para fazer a regularização. É possível fazer também usando o quadrado dos coeficientes: `$$RMSE_{Ridge} = RMSE + \color{red}{\lambda}\sum_{j = 1}^{p}\beta_j^2$$` Também é possível misturar os dois `$$RMSE_{regularizado} = RMSE + (\alpha) \times \color{red}{\lambda}\sum_{j = 1}^{p}|\beta_j| + (1 - \alpha) \times \color{red}{\lambda}\sum_{j = 1}^{p}\beta_j^2$$` Nessa definição `\(\alpha\)` é chamado de 'mixture' (mistura). Quando `\(\alpha=1\)` temos o LASSO e quando `\(\alpha=0\)` temos Ridge. O `\(\alpha\)` também pode ser tunado. --- ## Ridge vs LASSO O LASSO tem uma propriedade muito interessante quando comparada ao Ridge. Por razões matemáticas, ele consegue produzir estamativas esparsas, isto é, alguns coeficientes podem ser exatamente 0. <img src="static/img/ridge-vs-lasso.png" width = "45%"> .footnote[ Fonte: [ISLR pag. 224](https://web.stanford.edu/~hastie/ISLRv2_website.pdf) ] --- class: middle, center ## Exercício 01 --- ## Resumo dos conceitos <img src="static/img/ml_101.png" width = 85%>