Joana D’arc Nunes da Silva, Matrícula: 20180078535
Published
14 Aug, 2024
Questão 1:
Disserte sobre o processo de treinamento de modelo de regressão em aprendizagem de máquina. Explique cada um dos passos considerando a imagem que segue: Não esqueça de explicar:
1. O que é a validação cruzada e qual a diferença entre o leave-one-out e o k-fold cross-validation;
2. O que é o risco preditivo do modelo e qual seu estimador;
3. A importância de se ter uma base de dados de teste para avaliação final do modelo.
Resposta: No processo de treinamento de um modelo de regressão em aprendizagem de máquina, primeimeiramente fazemos o data spliting dos dados, ou seja, a divisão dos dados que usualmente é dividida em treino, validação e teste, onde no conjunto de treino realizamos o ajuste do modelo que melhor se adaptou aos dados, no conjunto de validação fazemos a tunagem de hiperparâmetros do modelo, e no conjunto de teste é onde avaliamos o desempenho do modelo final escolhido por meio do risco preditivo. A validação cruzada consiste na divisão dos dados em treino e validação, em que no leave-one-out cross validation a cada iteração tiramos de fora uma única observação para teste e treinamos o modelo com as observações que ficaram, assim consequentemente, iremos ter \(n\) modelos ajustados, em que \(n\) é o número de observações total na base de dados. Já no k-fold cross validation iremos ter \(k\) modelos finais ajustados, em que \(k\) é o número de lotes, onde a cada iteração um determinado lote será utilizado para teste e o restante das observações serão usadas para treinar o modelo. O risco preditivo avalia o desempenho do modelo ajustado, no qual o Erro Quadrático Médio (EQM) geralmente é utilizado como medida para avaliar este desempenho, onde o EQM é a média do quadrado dos erros entre os valores observados e os valores preditos pelo modelo. É importante termos uma base de dados somente de teste para avaliação do modelo final, pois é nela que verificamos a capacidade de generalização do modelo.
Questão 2:
Considere o modelo de regressão real definido pela equação abaixo: \[r(x) = 2.76 + 0.5x_1 - 0.75x_2 + 0.5x_3 - 0.75x_4 + x_5 + \sum_{i=6}^{30} 0x_i + \epsilon,\]
em que \(\epsilon \sim N(0,0.5^2)\) e \(x_i \sim N(0,1)\), \(\forall{i} = 1, ..., 30\). Treine um modelo de regressão linear múltipla e estime o risco preditivo do modelo.
Dicas:
1. Considere uma base de dados com \(n=1000\) observações e \(31\) colunas;
2. Note que \(X\) será uma matriz de features (recursos/covariáveis) com \(31\) colunas, sendo a primeira coluna composta por \(1’s\) (por conta do intercepto) e as demais colunas compostas por valores aleatórios de uma distribuição normal padrão, conforme mencionado anteriormente, i.e., \(x_i \sim N(0,1), \forall{i}\);
3. Note que não há hiperparâmetros a serem ajustados, diferentemente da regressão polinomial que vimos em sala de aula;
4. Não havendo hiperparâmetros, você precisa apenas dividir a base de dados entre treino e teste, isto é, realizar o hold-out;
5. Ajuste o modelo na base de dados considerando o conjunto de treino;
6. Avalie o modelo na base de teste.
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ readr::col_factor() masks scales::col_factor()
✖ purrr::discard() masks scales::discard()
✖ dplyr::filter() masks stats::filter()
✖ stringr::fixed() masks recipes::fixed()
✖ dplyr::lag() masks stats::lag()
✖ readr::spec() masks yardstick::spec()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
Code
tidymodels::tidymodels_prefer()i =31n =1000# Fixando a sementeset.seed(0)# Matriz com as featuresX <-cbind(1, matrix(rnorm(n*(i-1), mean =0, sd =1), n, i-1))# Vetor com os coeficientescoeficientes <-c(2.76, 0.5, -0.75, 0.5, -0.75, 1.0, rep(0,i-6))# Modelo de regressão realy <- X %*% coeficientes +rnorm(n, mean =0, sd =0.5)# Juntando as variáveis em um dataframedados <-as.data.frame(X)names(dados) =paste0("x", 0:30)dados = dados %>%mutate(y = y)# Realizando o Hold-outdados_split <- rsample::initial_split(dados, prop =0.8, strata = y)treino <- rsample::training(dados_split)teste <- rsample::testing(dados_split)# Definindo o modelomodelo =lm(y ~ ., data = treino)modelo
O modelo apresentou um erro quadrático médio relativamente baixo de 0.2642.
Questão 3:
Considere o modelo de regressão real dado por: \[r(x) = 1.6 + 5\sin(x) - 8x^2 + \epsilon,\]
em que \(x \sim U(0,20)\) e \(\epsilon \sim N(0,1)\) (normal padrão). Treine modelos de regressão polinomial com o grau do polinômio \(p=1,2,3\) e estime o risco preditivo de cada um dos modelos.
Dicas:
1. Considere \(n = 10000\) observações;
2. Não é necessário fazer fazer cross-validation;
3. Apenas considere treino e teste;
4. Ajuste cada um dos modelos no treino e estime o risco preditivo do modelo de cada um dos modelos no conjunto de teste.
Interprete o resultado obtido.
Resposta:
Code
rm(list=ls())# Clarregando as bibliotecaslibrary(tidymodels)library(ggplot2)library(tibble)library(rsample)library(patchwork)library(tidyverse)tidymodels_prefer()# Modelo real que não conhecemosrandom_real <-function(n){ x <-runif(n = n, min =0, max =20)# Essa é a regressão real y <-1.6+5*sin(x) -8*(x^2) +rnorm(n, mean =0, sd =1)tibble(x = x, y = y)}# Funções para treinartreinar <-function(p, dados_treino){# Criando uma regressao polinomiallm(data = dados_treino, y ~poly(x, degree = p, raw =TRUE))}# Função para testarteste <-function(modelo, dados_teste){# Calculando o erro quadrático médio dados_teste %>%mutate(y_hat =predict(modelo, newdata = dados_teste) # Aqui calculo y chapeu ) %>%summarise(eqm =mean((y - y_hat)^2) )}# Função para avaliar o modeloavaliacao_eqm <-function(p, dados_treino, dados_teste){# Treinando o modelo ajuste <-treinar(p, dados_treino)# Calculando o erro quadrático médio eqm <-teste(ajuste, dados_teste)list(ajuste = ajuste, eqm =as.numeric(eqm[1,1]))}
Code
# Fixando sementeset.seed(0)# Gerando a base total de dados com 10000 observaçõesdados <-random_real(n =10000)# Realizando o Hold-outdados_divididos <- rsample::initial_split(dados, prop =0.8, strata = y)dados_treino <- rsample::training(dados_divididos)dados_teste <- rsample::testing(dados_divididos)grau_maximo <-3# Avaliando o erro quadrático médio para cada grauvec_eqm <- purrr::map_dbl(.x = 1L:grau_maximo,.f = \(p) avaliacao_eqm(p = p, dados_treino = dados_treino, dados_teste = dados_teste)$eqm )
Code
# Tabela com os EQM's e seus respectivos graus de polinômiodados_eqm <-tibble(p = 1L:grau_maximo, eqm = vec_eqm)dados_eqm
# A tibble: 3 × 2
p eqm
<int> <dbl>
1 1 56140.
2 2 12.5
3 3 12.3
Code
# Melhor grau do polinômio que tem o menor EQMmelhor_p <-which.min(vec_eqm)melhor_p
[1] 3
Code
# Ajustando a regressão verdadeira com grau 1 sobre os dadosajuste1 <-treinar(p =1, dados_treino = dados_teste)ajuste1
Call:
lm(formula = y ~ poly(x, degree = p, raw = TRUE), data = dados_treino)
Coefficients:
(Intercept) poly(x, degree = p, raw = TRUE)
538.6 -160.6
Code
# Ajustando a regressão verdadeira com grau 2 sobre os dadosajuste2 <-treinar(p =2, dados_treino = dados_teste)ajuste2
Call:
lm(formula = y ~ poly(x, degree = p, raw = TRUE), data = dados_treino)
Coefficients:
(Intercept) poly(x, degree = p, raw = TRUE)1
4.1746 -0.5012
poly(x, degree = p, raw = TRUE)2
-7.9806
Code
# Ajustando a regressão verdadeira com grau 3 sobre os dadosajuste3 <-treinar(p =3, dados_treino = dados_teste)ajuste3
Call:
lm(formula = y ~ poly(x, degree = p, raw = TRUE), data = dados_treino)
Coefficients:
(Intercept) poly(x, degree = p, raw = TRUE)1
5.265589 -1.148003
poly(x, degree = p, raw = TRUE)2 poly(x, degree = p, raw = TRUE)3
-7.900008 -0.002684
Observa-se que o melhor o modelo de regressão polinomial é o de grau 3, pois apresentou menor erro quadrático médio.
Questão 4:
Considere a base de dados referente à vendas de sorvetes. A base de dados contém as seguintes variáveis:
1. Temperatura: temperatura média do dia;
2. Vendas: quantidade de sorvetes vendidos no dia.
Download: Para baixar os dados, acesse o link e clique em “Download”, no canto superior direito.
Estamos interessados em estimar as vendas de sorvetes dado a temperatura. Dessa forma, considere o número de vendas como sendo o label (variável \(y\)) e as temperaturas como sendo as features (variáveis \(x\)).
Considerando a base de dados fornecida, treine um modelo de regressão polinomial com grau \(p = 1,2,3,4,5\) e estime o risco preditivo do modelo selecionado. Além disso, construa um gráfico do modelo selecionado ajustado aos dados.
Dicas:
1. Considere utilizar um esquema de validação cruzada para selecionar o melhor hiperparâmetro;
2. Com o grau de polinômio escolhido, treine o modelo na base de dados de treino e avalie o risco desse modelo no conjunto de teste;
3. Considere uma divisão inicial (hold-out) na proporção \(80\%\) (treino) e \(20\%\) para teste.
Resposta:
Code
rm(list=ls())# Carregando os pacoteslibrary(tidymodels)library(ggplot2)library(tibble)library(rsample)library(patchwork)library(tidyverse)library(corrr)tidymodels::tidymodels_prefer()# Carregando a base de dadosdados <-read.csv("C:/Users/gleyc/Downloads/archive (1)/Ice_cream selling data.csv", sep =",",col.names =c("temperatura","vendas"))# Renomeando as variáveisdados <- dados %>% dplyr::rename(x = temperatura, y = vendas)# Fixando a sementeset.seed(0)# Realizadon hold-outdados_split <- rsample::initial_split(dados, prop =0.8, strata ="y")treino <- rsample::training(dados_split)teste <- rsample::testing(dados_split)# Fazendo validação cruzadacv <-vfold_cv(treino, v =5)# Definindo o modelomodelo <- parsnip::linear_reg() %>% parsnip::set_engine("lm") %>% parsnip::set_mode("regression")# Definindo receitareceita <-recipe(y ~ ., data = treino) %>% recipes::step_poly(all_numeric_predictors(),degree =tune("p"),options =list(raw =TRUE) )# Validacação cruzadacv <-vfold_cv(treino, v =5)# Criando o workflowwf <-workflow() %>%add_recipe(receita) %>%add_model(modelo)# Extraindo hiperparametros do modeloparametros <- wf %>%extract_parameter_set_dials() %>%# Extraindo os hiperparâmetros do modeloextract_parameter_dials("p") %>%range_set(range =c(1, 5)) %>%parameters()parametros$id <-"p"# Tunando o modelotunagem <-tune_grid( wf,resamples = cv,grid =tibble(p =1:5), # Parâmetros que desejamos que ele testemetrics =metric_set(rmse))# Coletando as métricas e o melhor graucollect_metrics(tunagem)
# A tibble: 5 × 7
p .metric .estimator mean n std_err .config
<int> <chr> <chr> <dbl> <int> <dbl> <chr>
1 1 rmse standard 12.7 5 1.41 Preprocessor1_Model1
2 2 rmse standard 3.66 5 0.407 Preprocessor2_Model1
3 3 rmse standard 4.51 5 1.35 Preprocessor3_Model1
4 4 rmse standard 4.20 5 1.53 Preprocessor4_Model1
5 5 rmse standard 5.02 5 2.35 Preprocessor5_Model1
Code
# Visualizando o melhor grau segundo a métrica RMSEshow_best(tunagem, n =1, metric ="rmse")
# A tibble: 1 × 7
p .metric .estimator mean n std_err .config
<int> <chr> <chr> <dbl> <int> <dbl> <chr>
1 2 rmse standard 3.66 5 0.407 Preprocessor2_Model1
Code
# Selecionado o melhor "p"melhor_p <-select_best(tunagem, metric ="rmse")melhor_p
# A tibble: 1 × 2
p .config
<int> <chr>
1 2 Preprocessor2_Model1
O melhor grau de polinômio é 2, segundo a métrica RMSE.
Code
# Finalizandowf <- wf %>%finalize_workflow(melhor_p)# Realizando o ajuste final do modeloajuste <-last_fit(wf, dados_split, metrics =metric_set(rmse))# Olhando o desempenho no testecollect_metrics(ajuste)
# A tibble: 1 × 4
.metric .estimator .estimate .config
<chr> <chr> <dbl> <chr>
1 rmse standard 3.08 Preprocessor1_Model1
Code
real_vs_estimado <-collect_predictions(ajuste)real_vs_estimado %>%ggplot(aes(x = .pred, y = y)) +geom_point() +geom_smooth(method ="lm", se =FALSE, color ="tomato") +labs(title ="Real vs Estimado",subtitle ="Base de teste",x ="Previsões",y ="Observações" )
Code
# Prevendodados_qualquer <-sample_n(dados, 10) # Seleciona 10 linhas quaisquer de dados.wf_modelo <-extract_workflow(ajuste)valores_previstos <-predict(wf_modelo, new_data = dados_qualquer)# Visualizando lado a lado, y e valores previstosdplyr::bind_cols(dados_qualquer, valores_previstos)
# Prevendo o número de vendas de sorvetes em uma temperatura de 3 graus celsiuspredict(wf_modelo, new_data =tibble(x =3))
# A tibble: 1 × 1
.pred
<dbl>
1 16.4
Estima-se que o número de vendas de sorvetes em uma temperatura de 3 graus celsius é de aproximadamente 16 unidades.
Questão 5:
Considere o modelo de regressão real dado por: \[r(x) = 45 \times tanh\left(\frac{x}{1.9} - 7\right) + 57 + \epsilon,\]
em que \(x\) são observações de uma variável aleatória \(X \sim U(0,18)\) e \(\epsilon \sim N(0,4)\). Considerando um conjunto de dados de 10 mil observações, treine um modelo de regressão polinomial com grau \(p=1, ..., 15\). Estime o risco preditivo do melhor modelo. Construa um gráfico do melhor modelo ajustando aos dados de teste, i.e., \(y\) versus \(\hat{y}\) do conjunto de teste.
Resposta:
Code
rm(list=ls())# Carregando as bibliotecaslibrary(tidymodels)library(ggplot2)library(tibble)library(rsample)library(patchwork)# Modelo real que não conhecemosrandom_real <-function(n){ x <-runif(n = n, min =0, max =18)# Regressão real y <-45*tanh(x/1.9-7) +57+rnorm(n, 0, 2)tibble(x = x, y = y)}# Função para treinar o modelotreinar <-function(p, dados_treino){# Criando uma regressao polinomiallm(data = dados_treino, y ~poly(x, degree = p, raw =TRUE))}# Função para testar o modeloteste <-function(modelo, dados_teste){# Calculando o erro quadrático médio dados_teste %>%mutate(y_hat =predict(modelo, newdata = dados_teste) # Aqui calculo y chapeu ) %>%summarise(eqm =mean((y - y_hat)^2) )}# Função para avaliar o erro quadrático médioavaliacao_eqm <-function(p, dados_treino, dados_teste){# Treinando o modelo ajuste <-treinar(p, dados_treino)# Calculando o erro quadrático médio eqm <-teste(ajuste, dados_teste)list(ajuste = ajuste, eqm =as.numeric(eqm[1,1]))}
Code
# Fixando sementeset.seed(0)# Gerando a base total de dados com 10000 observaçõesdados <-random_real(n =10000)# Realizando o Hold-outdados_divididos <- rsample::initial_split(dados, prop =0.8, strata = y)dados_treino <- rsample::training(dados_divididos)dados_teste <- rsample::testing(dados_divididos)grau_maximo <-15# Avaliando o erro quadrático médio para cada grau de polinômiovalores <- purrr::map_dbl(.x = 1L:grau_maximo,.f = \(p) avaliacao_eqm(p = p, dados_treino = dados_treino, dados_teste = dados_teste)$eqm )# Melhor grau de polinômiomelhor_p <-which.min(valores)melhor_p
[1] 14
Code
# Ajustando a regressão verdadeira com melhor_p sobre os dadosajuste <-treinar(p = melhor_p, dados_treino = dados_teste)# Visualizando os dados e a regressão realp <-ggplot(data = dados_teste, aes(x = x, y = y)) +geom_point() +theme_minimal() +ggtitle("Dados reais") +stat_function(fun =function(x) 45*tanh(x/1.9-7) +57, col ="red", linewidth =1.2)# Visualizando o ajustep_ajuste <- p +geom_function(fun =function(x) predict(ajuste, newdata =tibble(x = x)), col ="blue", linewidth =1.2) +ggtitle("Ajuste") +labs(x ="x", y ="y")# Visualizando os EQM'sp_eqm <-tibble(p = 1L:grau_maximo, eqm = valores) %>%ggplot(aes(x = p, y = eqm)) +geom_line(linetype ="dotted", linewidth =1) +annotate("point", x = melhor_p, y = valores[melhor_p], col ="red", size =4, alpha =0.7) +theme_minimal() +ggtitle("EQM") +labs(x ="p", y ="EQM") +scale_y_log10()p + p_ajuste + p_eqm
Nota-se que o melhor modelo de regressão polinomial é o de grau 14. O gráfico acima mostra a regressão real (em vermelho) e o ajuste do modelo de regressão polinomial de grau 14 (em azul) sobre os dados de teste. Além disso, o gráfico de EQM mostra que o modelo de grau 14 é o que apresenta menor Erro Quadrático Médio.
Source Code
---title: "Prova 1 - Aprendizagem de Máquina"author: "Joana D'arc Nunes da Silva, Matrícula: 20180078535"date: last-modifieddate-format: "DD MMM, YYYY"format: html: theme: lux code-fold: show code-tools: true code-block-bg: true code-block-border-left: "#9400D3" highlight-style: github code-link: true toc: true toc-title: Sumário toc-location: left toc-depth: 2 number-sections: false number-depth: 3 smooth-scroll: true link-external-newwindow: truefig-dpi: 1000self-contained: truepage-layout: fulleditor: source---# Questão 1:Disserte sobre o processo de treinamento de modelo de regressão em aprendizagem de máquina. Explique cada um dos passos considerando a imagem que segue:\Não esqueça de explicar:\1. O que é a validação cruzada e qual a diferença entre o *leave-one-out* e o *k-fold cross-validation*;\2. O que é o risco preditivo do modelo e qual seu estimador;\3. A importância de se ter uma base de dados de teste para avaliação final do modelo.\`Resposta:` No processo de treinamento de um modelo de regressão em aprendizagem de máquina, primeimeiramente fazemos o *data spliting* dos dados, ou seja, a divisão dos dados que usualmente é dividida em treino, validação e teste, onde no conjunto de treino realizamos o ajuste do modelo que melhor se adaptou aos dados, no conjunto de validação fazemos a tunagem de hiperparâmetros do modelo, e no conjunto de teste é onde avaliamos o desempenho do modelo final escolhido por meio do risco preditivo. A validação cruzada consiste na divisão dos dados em treino e validação, em que no *leave-one-out cross validation* a cada iteração tiramos de fora uma única observação para teste e treinamos o modelo com as observações que ficaram, assim consequentemente, iremos ter $n$ modelos ajustados, em que $n$ é o número de observações total na base de dados. Já no *k-fold cross validation* iremos ter $k$ modelos finais ajustados, em que $k$ é o número de lotes, onde a cada iteração um determinado lote será utilizado para teste e o restante das observações serão usadas para treinar o modelo. O risco preditivo avalia o desempenho do modelo ajustado, no qual o Erro Quadrático Médio (EQM) geralmente é utilizado como medida para avaliar este desempenho, onde o EQM é a média do quadrado dos erros entre os valores observados e os valores preditos pelo modelo. É importante termos uma base de dados somente de teste para avaliação do modelo final, pois é nela que verificamos a capacidade de generalização do modelo.\# Questão 2:Considere o modelo de regressão real definido pela equação abaixo:\$$r(x) = 2.76 + 0.5x_1 - 0.75x_2 + 0.5x_3 - 0.75x_4 + x_5 + \sum_{i=6}^{30} 0x_i + \epsilon,$$\em que $\epsilon \sim N(0,0.5^2)$ e $x_i \sim N(0,1)$, $\forall{i} = 1, ..., 30$. Treine um modelo de regressão linear múltipla e estime o risco preditivo do modelo.\**Dicas:**\1. Considere uma base de dados com $n=1000$ observações e $31$ colunas;\2. Note que $X$ será uma matriz de *features* (recursos/covariáveis) com $31$ colunas, sendo a primeira coluna composta por $1’s$ (por conta do intercepto) e as demais colunas compostas por valores aleatórios de uma distribuição normal padrão, conforme mencionado anteriormente, i.e., $x_i \sim N(0,1), \forall{i}$;\3. Note que não há hiperparâmetros a serem ajustados, diferentemente da regressão polinomial que vimos em sala de aula;\4. Não havendo hiperparâmetros, você precisa apenas dividir a base de dados entre treino e teste, isto é, realizar o *hold-out*;\5. Ajuste o modelo na base de dados considerando o conjunto de treino;\6. Avalie o modelo na base de teste.\`Resposta:````{r, warning=FALSE}rm(list=ls())library(tidymodels)library(rsample)library(patchwork)library(tidyverse)tidymodels::tidymodels_prefer()i =31n =1000# Fixando a sementeset.seed(0)# Matriz com as featuresX <-cbind(1, matrix(rnorm(n*(i-1), mean =0, sd =1), n, i-1))# Vetor com os coeficientescoeficientes <-c(2.76, 0.5, -0.75, 0.5, -0.75, 1.0, rep(0,i-6))# Modelo de regressão realy <- X %*% coeficientes +rnorm(n, mean =0, sd =0.5)# Juntando as variáveis em um dataframedados <-as.data.frame(X)names(dados) =paste0("x", 0:30)dados = dados %>%mutate(y = y)# Realizando o Hold-outdados_split <- rsample::initial_split(dados, prop =0.8, strata = y)treino <- rsample::training(dados_split)teste <- rsample::testing(dados_split)# Definindo o modelomodelo =lm(y ~ ., data = treino)modelo# Fazendo predições com o modeoy_pred =predict(modelo, newdata = teste)y_pred# Erro Quadrático Médioeqm =mean((teste$y - y_pred)^2)eqm```O modelo apresentou um erro quadrático médio relativamente baixo de 0.2642.\ # Questão 3:Considere o modelo de regressão real dado por: $$r(x) = 1.6 + 5\sin(x) - 8x^2 + \epsilon,$$\em que $x \sim U(0,20)$ e $\epsilon \sim N(0,1)$ (normal padrão). Treine modelos de regressão polinomial com o grau do polinômio $p=1,2,3$ e estime o risco preditivo de cada um dos modelos.\**Dicas:**\1. Considere $n = 10000$ observações;\2. Não é necessário fazer fazer *cross-validation*;\3. Apenas considere treino e teste;\4. Ajuste cada um dos modelos no treino e estime o risco preditivo do modelo de cada um dos modelos no conjunto de teste.\Interprete o resultado obtido.`Resposta:````{r, warning=FALSE, message=FALSE}rm(list=ls())# Clarregando as bibliotecaslibrary(tidymodels)library(ggplot2)library(tibble)library(rsample)library(patchwork)library(tidyverse)tidymodels_prefer()# Modelo real que não conhecemosrandom_real <-function(n){ x <-runif(n = n, min =0, max =20)# Essa é a regressão real y <-1.6+5*sin(x) -8*(x^2) +rnorm(n, mean =0, sd =1)tibble(x = x, y = y)}# Funções para treinartreinar <-function(p, dados_treino){# Criando uma regressao polinomiallm(data = dados_treino, y ~poly(x, degree = p, raw =TRUE))}# Função para testarteste <-function(modelo, dados_teste){# Calculando o erro quadrático médio dados_teste %>%mutate(y_hat =predict(modelo, newdata = dados_teste) # Aqui calculo y chapeu ) %>%summarise(eqm =mean((y - y_hat)^2) )}# Função para avaliar o modeloavaliacao_eqm <-function(p, dados_treino, dados_teste){# Treinando o modelo ajuste <-treinar(p, dados_treino)# Calculando o erro quadrático médio eqm <-teste(ajuste, dados_teste)list(ajuste = ajuste, eqm =as.numeric(eqm[1,1]))}``````{r, warning=FALSE}# Fixando sementeset.seed(0)# Gerando a base total de dados com 10000 observaçõesdados <-random_real(n =10000)# Realizando o Hold-outdados_divididos <- rsample::initial_split(dados, prop =0.8, strata = y)dados_treino <- rsample::training(dados_divididos)dados_teste <- rsample::testing(dados_divididos)grau_maximo <-3# Avaliando o erro quadrático médio para cada grauvec_eqm <- purrr::map_dbl(.x = 1L:grau_maximo,.f = \(p) avaliacao_eqm(p = p, dados_treino = dados_treino, dados_teste = dados_teste)$eqm )``````{r, warning=FALSE}# Tabela com os EQM's e seus respectivos graus de polinômiodados_eqm <-tibble(p = 1L:grau_maximo, eqm = vec_eqm)dados_eqm``````{r, warning=FALSE}# Melhor grau do polinômio que tem o menor EQMmelhor_p <-which.min(vec_eqm)melhor_p``````{r, warning=FALSE}# Ajustando a regressão verdadeira com grau 1 sobre os dadosajuste1 <-treinar(p =1, dados_treino = dados_teste)ajuste1``````{r, warning=FALSE}# Ajustando a regressão verdadeira com grau 2 sobre os dadosajuste2 <-treinar(p =2, dados_treino = dados_teste)ajuste2``````{r, warning=FALSE}# Ajustando a regressão verdadeira com grau 3 sobre os dadosajuste3 <-treinar(p =3, dados_treino = dados_teste)ajuste3```Observa-se que o melhor o modelo de regressão polinomial é o de grau 3, pois apresentou menor erro quadrático médio.\# Questão 4:Considere a base de dados referente à vendas de sorvetes. A base de dados contém as seguintes variáveis:\1. `Temperatura:` temperatura média do dia;\2. `Vendas:` quantidade de sorvetes vendidos no dia.\**Download:** Para baixar os dados, acesse o [link](https://www.kaggle.com/datasets/mirajdeepbhandari/polynomial-regression?select=Ice_cream+selling+data.csv) e clique em "Download", no canto superior direito.\Estamos interessados em estimar as vendas de sorvetes dado a temperatura. Dessa forma, considere o número de vendas como sendo o *label* (variável $y$) e as temperaturas como sendo as *features* (variáveis $x$).\Considerando a base de dados fornecida, treine um modelo de regressão polinomial com grau $p = 1,2,3,4,5$ e estime o risco preditivo do modelo selecionado. Além disso, construa um gráfico do modelo selecionado ajustado aos dados.\**Dicas:**\1. Considere utilizar um esquema de validação cruzada para selecionar o melhor hiperparâmetro;\2. Com o grau de polinômio escolhido, treine o modelo na base de dados de treino e avalie o risco desse modelo no conjunto de teste;\3. Considere uma divisão inicial *(hold-out)* na proporção $80\%$ (treino) e $20\%$ para teste.\`Resposta:````{r, warning=FALSE}rm(list=ls())# Carregando os pacoteslibrary(tidymodels)library(ggplot2)library(tibble)library(rsample)library(patchwork)library(tidyverse)library(corrr)tidymodels::tidymodels_prefer()# Carregando a base de dadosdados <-read.csv("C:/Users/gleyc/Downloads/archive (1)/Ice_cream selling data.csv", sep =",",col.names =c("temperatura","vendas"))# Renomeando as variáveisdados <- dados %>% dplyr::rename(x = temperatura, y = vendas)# Fixando a sementeset.seed(0)# Realizadon hold-outdados_split <- rsample::initial_split(dados, prop =0.8, strata ="y")treino <- rsample::training(dados_split)teste <- rsample::testing(dados_split)# Fazendo validação cruzadacv <-vfold_cv(treino, v =5)# Definindo o modelomodelo <- parsnip::linear_reg() %>% parsnip::set_engine("lm") %>% parsnip::set_mode("regression")# Definindo receitareceita <-recipe(y ~ ., data = treino) %>% recipes::step_poly(all_numeric_predictors(),degree =tune("p"),options =list(raw =TRUE) )# Validacação cruzadacv <-vfold_cv(treino, v =5)# Criando o workflowwf <-workflow() %>%add_recipe(receita) %>%add_model(modelo)# Extraindo hiperparametros do modeloparametros <- wf %>%extract_parameter_set_dials() %>%# Extraindo os hiperparâmetros do modeloextract_parameter_dials("p") %>%range_set(range =c(1, 5)) %>%parameters()parametros$id <-"p"# Tunando o modelotunagem <-tune_grid( wf,resamples = cv,grid =tibble(p =1:5), # Parâmetros que desejamos que ele testemetrics =metric_set(rmse))# Coletando as métricas e o melhor graucollect_metrics(tunagem)``````{r, warning=FALSE}# Visualizando o melhor grau segundo a métrica RMSEshow_best(tunagem, n =1, metric ="rmse")``````{r, warning=FALSE}# Selecionado o melhor "p"melhor_p <-select_best(tunagem, metric ="rmse")melhor_p```O melhor grau de polinômio é 2, segundo a métrica RMSE.\```{r, warning=FALSE}# Finalizandowf <- wf %>%finalize_workflow(melhor_p)# Realizando o ajuste final do modeloajuste <-last_fit(wf, dados_split, metrics =metric_set(rmse))# Olhando o desempenho no testecollect_metrics(ajuste)``````{r, warning=FALSE, message= FALSE}real_vs_estimado <-collect_predictions(ajuste)real_vs_estimado %>%ggplot(aes(x = .pred, y = y)) +geom_point() +geom_smooth(method ="lm", se =FALSE, color ="tomato") +labs(title ="Real vs Estimado",subtitle ="Base de teste",x ="Previsões",y ="Observações" )``````{r, warning=FALSE}# Prevendodados_qualquer <-sample_n(dados, 10) # Seleciona 10 linhas quaisquer de dados.wf_modelo <-extract_workflow(ajuste)valores_previstos <-predict(wf_modelo, new_data = dados_qualquer)# Visualizando lado a lado, y e valores previstosdplyr::bind_cols(dados_qualquer, valores_previstos)``````{r, warning=FALSE}# Prevendo o número de vendas de sorvetes em uma temperatura de 3 graus celsiuspredict(wf_modelo, new_data =tibble(x =3))```Estima-se que o número de vendas de sorvetes em uma temperatura de 3 graus celsius é de aproximadamente 16 unidades.\# Questão 5:Considere o modelo de regressão real dado por: $$r(x) = 45 \times tanh\left(\frac{x}{1.9} - 7\right) + 57 + \epsilon,$$\em que $x$ são observações de uma variável aleatória $X \sim U(0,18)$ e $\epsilon \sim N(0,4)$. Considerando um conjunto de dados de 10 mil observações, treine um modelo de regressão polinomial com grau $p=1, ..., 15$. Estime o risco preditivo do melhor modelo. Construa um gráfico do melhor modelo ajustando aos dados de teste, i.e., $y$ versus $\hat{y}$ do conjunto de teste.\`Resposta:````{r, warning=FALSE}rm(list=ls())# Carregando as bibliotecaslibrary(tidymodels)library(ggplot2)library(tibble)library(rsample)library(patchwork)# Modelo real que não conhecemosrandom_real <-function(n){ x <-runif(n = n, min =0, max =18)# Regressão real y <-45*tanh(x/1.9-7) +57+rnorm(n, 0, 2)tibble(x = x, y = y)}# Função para treinar o modelotreinar <-function(p, dados_treino){# Criando uma regressao polinomiallm(data = dados_treino, y ~poly(x, degree = p, raw =TRUE))}# Função para testar o modeloteste <-function(modelo, dados_teste){# Calculando o erro quadrático médio dados_teste %>%mutate(y_hat =predict(modelo, newdata = dados_teste) # Aqui calculo y chapeu ) %>%summarise(eqm =mean((y - y_hat)^2) )}# Função para avaliar o erro quadrático médioavaliacao_eqm <-function(p, dados_treino, dados_teste){# Treinando o modelo ajuste <-treinar(p, dados_treino)# Calculando o erro quadrático médio eqm <-teste(ajuste, dados_teste)list(ajuste = ajuste, eqm =as.numeric(eqm[1,1]))}``````{r, warning=FALSE}# Fixando sementeset.seed(0)# Gerando a base total de dados com 10000 observaçõesdados <-random_real(n =10000)# Realizando o Hold-outdados_divididos <- rsample::initial_split(dados, prop =0.8, strata = y)dados_treino <- rsample::training(dados_divididos)dados_teste <- rsample::testing(dados_divididos)grau_maximo <-15# Avaliando o erro quadrático médio para cada grau de polinômiovalores <- purrr::map_dbl(.x = 1L:grau_maximo,.f = \(p) avaliacao_eqm(p = p, dados_treino = dados_treino, dados_teste = dados_teste)$eqm )# Melhor grau de polinômiomelhor_p <-which.min(valores)melhor_p``````{r, warning=FALSE}# Ajustando a regressão verdadeira com melhor_p sobre os dadosajuste <-treinar(p = melhor_p, dados_treino = dados_teste)# Visualizando os dados e a regressão realp <-ggplot(data = dados_teste, aes(x = x, y = y)) +geom_point() +theme_minimal() +ggtitle("Dados reais") +stat_function(fun =function(x) 45*tanh(x/1.9-7) +57, col ="red", linewidth =1.2)# Visualizando o ajustep_ajuste <- p +geom_function(fun =function(x) predict(ajuste, newdata =tibble(x = x)), col ="blue", linewidth =1.2) +ggtitle("Ajuste") +labs(x ="x", y ="y")# Visualizando os EQM'sp_eqm <-tibble(p = 1L:grau_maximo, eqm = valores) %>%ggplot(aes(x = p, y = eqm)) +geom_line(linetype ="dotted", linewidth =1) +annotate("point", x = melhor_p, y = valores[melhor_p], col ="red", size =4, alpha =0.7) +theme_minimal() +ggtitle("EQM") +labs(x ="p", y ="EQM") +scale_y_log10()p + p_ajuste + p_eqm```Nota-se que o melhor modelo de regressão polinomial é o de grau 14. O gráfico acima mostra a regressão real (em vermelho) e o ajuste do modelo de regressão polinomial de grau 14 (em azul) sobre os dados de teste. Além disso, o gráfico de EQM mostra que o modelo de grau 14 é o que apresenta menor Erro Quadrático Médio.\