Carregando as bibliotecas
library(tidymodels)
library(tidyverse)
library(GGally)
library(skimr)
library(readxl)
library(dplyr)
library(kknn)
library(kernlab)
library(VIM)
library(corrplot)
1. Importando a base de dados
tidymodels::tidymodels_prefer()
dados<-read.csv("C:/Users/Elton.F/Downloads/beer (1).csv")
2. Exploratória dos dados
visdat::vis_dat(dados)

3.Imputando knn
dadosimput<- kNN(dados)
dadosimput
4.Exploratório com os dados imputado
cerveja<- dadosimput |> select(c(custo,quantidade,alcool,reputacao,cor, aroma,sabor))
cerveja
visdat::vis_dat(cerveja)

cerveja |> dplyr::glimpse()
Rows: 231
Columns: 7
$ custo <int> 90, 75, 10, 100, 20, 50, 5, 65, 95, 85, 0, 10, 80, 25, 5, 20, 7…
$ quantidade <int> 80, 95, 15, 70, 10, 100, 15, 30, 95, 80, 0, 25, 70, 35, 10, 5, …
$ alcool <int> 70, 100, 20, 50, 25, 100, 15, 35, 100, 70, 20, 10, 50, 30, 15, …
$ reputacao <int> 20, 50, 85, 30, 35, 30, 75, 80, 0, 40, 30, 100, 50, 40, 65, 40,…
$ cor <int> 50, 55, 40, 75, 30, 90, 20, 80, 80, 60, 80, 50, 40, 45, 50, 60,…
$ aroma <int> 70, 40, 30, 60, 35, 75, 10, 60, 70, 50, 90, 40, 20, 30, 65, 50,…
$ sabor <int> 60, 65, 50, 80, 45, 100, 25, 90, 95, 65, 100, 60, 50, 65, 85, 9…
skim(cerveja)
── Data Summary ────────────────────────
Values
Name cerveja
Number of rows 231
Number of columns 7
_______________________
Column type frequency:
numeric 7
________________________
Group variables None
rho_hat <- cor(cerveja)
corrplot(rho_hat, method = "number")

cerveja |>
GGally::ggscatmat()

cerveja |>
GGally::ggpairs()

5. Construindo os workflows dos modelos
5.1 Divisão dos dados
set.seed(0) # Fixando uma semente
divisao_inicial <- rsample::initial_split(cerveja, prop = 0.8, strata = "reputacao")
treinamento <- rsample::training(divisao_inicial) # Conjunto de treinamento
teste <- rsample::testing(divisao_inicial) # Conjunto de teste
teste
5.2 Tratamento dos dados (pré-processamento)
receita_1 <-
treinamento |>
recipe(formula = reputacao ~ .) |>
step_YeoJohnson(all_predictors()) |>
step_normalize(all_predictors()) |>
step_zv(all_predictors()) |>
step_corr(all_predictors())
receita_2 <-
treinamento |>
recipe(formula = reputacao ~ .) |>
step_YeoJohnson(all_predictors()) |>
step_normalize(all_predictors())
receita_1 |>
prep() |>
juice()
receita_1 |>
prep() |>
bake(new_data = treinamento)
NA
6. Definindo os modelos
modelo_elastic <-
parsnip::linear_reg(penalty = tune::tune(), mixture = tune::tune()) |>
parsnip::set_mode("regression") |>
parsnip::set_engine("glmnet")
modelo_knn <-
parsnip::nearest_neighbor(
neighbors = tune::tune(),
dist_power = tune::tune(),
weight_func = "gaussian"
) |>
parsnip::set_mode("regression") |>
parsnip::set_engine("kknn")
modelo_svm <-
parsnip::svm_rbf(
cost = tune::tune(),
rbf_sigma = tune::tune(),
margin = tune::tune()
) |>
parsnip::set_mode("regression") |>
parsnip::set_engine("kernlab")
7. Criando o conjunto de validação
validacao_cruzada <-
treinamento |>
rsample::vfold_cv(v = 8L, strata = reputacao)
8. Criando um workflow completo
wf_todos <-
workflow_set(
preproc = list(receita_1, receita_2),
models = list(
knn_fit = modelo_knn,
elastic_fit = modelo_elastic,
svm_fit = modelo_svm
),
cross = TRUE
)
controle_grid <- control_grid(
save_pred = TRUE,
save_workflow = TRUE,
parallel_over = "resamples"
)
9. Treinando o modelo
treino <-
wf_todos |>
workflow_map(
resamples = validacao_cruzada,
grid = 20L,
control = controle_grid
)
autoplot(treino, metric = "rmse") +
labs(
title = "Avaliação dos modelos de regressão",
subtitle = "Utilizando a métrica do EQM"
) +
xlab("Rank dos Workflows") +
ylab("Erro Quadrático Médio - EQM")

10. Melhores Modelos
melhores <-
treino |>
rank_results(select_best = TRUE, rank_metric = "rmse")
autoplot(treino, select_best = TRUE)

treino |>
rank_results()
11. Melhor Modelo
melhor_modelo <-
treino |>
extract_workflow_set_result(id = "recipe_1_knn_fit") |>
select_best(metric = "rmse")
melhor_modelo
12. Avaliação final do melhor modelo
wf_final <-
treino |>
extract_workflow(id = "recipe_1_knn_fit") |>
finalize_workflow(melhor_modelo)
teste <-
wf_final |>
last_fit(split = divisao_inicial)
teste$.metrics
[[1]]
modelo_final <-
wf_final |>
fit(dados)
modelo_final
══ Workflow [trained] ══════════════════════════════════════════════════════════════
Preprocessor: Recipe
Model: nearest_neighbor()
── Preprocessor ────────────────────────────────────────────────────────────────────
4 Recipe Steps
• step_YeoJohnson()
• step_normalize()
• step_zv()
• step_corr()
── Model ───────────────────────────────────────────────────────────────────────────
Call:
kknn::train.kknn(formula = ..y ~ ., data = data, ks = min_rows(1L, data, 5), distance = ~0.751370396780549, kernel = ~"gaussian")
Type of response variable: continuous
minimal mean absolute error: 0
Minimal mean squared error: 0
Best kernel: gaussian
Best k: 1
LS0tDQp0aXRsZTogIkFwcmVuZGl6YWdlbSBkYXMgTcOhcXVpbmFzIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KIyBDYXJyZWdhbmRvIGFzIGJpYmxpb3RlY2FzDQoNCj4NCg0KYGBge3IsbWVzc2FnZT1GQUxTRSx3YXJuaW5nPUZBTFNFfQ0KbGlicmFyeSh0aWR5bW9kZWxzKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KEdHYWxseSkNCmxpYnJhcnkoc2tpbXIpDQpsaWJyYXJ5KHJlYWR4bCkNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGtrbm4pDQpsaWJyYXJ5KGtlcm5sYWIpDQpsaWJyYXJ5KFZJTSkNCmxpYnJhcnkoY29ycnBsb3QpDQoNCmBgYA0KDQoNCj4NCg0KIyAxLiBJbXBvcnRhbmRvIGEgYmFzZSBkZSBkYWRvcw0KDQo+DQoNCmBgYHtyLG1lc3NhZ2U9RkFMU0Usd2FybmluZz1GQUxTRX0NCnRpZHltb2RlbHM6OnRpZHltb2RlbHNfcHJlZmVyKCkNCmRhZG9zPC1yZWFkLmNzdigiQzovVXNlcnMvRWx0b24uRi9Eb3dubG9hZHMvYmVlciAoMSkuY3N2IikNCmBgYA0KDQo+DQoNCiMgMi4gRXhwbG9yYXTDs3JpYSBkb3MgZGFkb3MNCg0KPg0KDQpgYGB7cixtZXNzYWdlPUZBTFNFLHdhcm5pbmc9RkFMU0V9DQp2aXNkYXQ6OnZpc19kYXQoZGFkb3MpDQpgYGANCg0KIyAzLkltcHV0YW5kbyBrbm4NCg0KPg0KDQpgYGB7cixtZXNzYWdlPUZBTFNFLHdhcm5pbmc9RkFMU0V9DQpkYWRvc2ltcHV0PC0ga05OKGRhZG9zKQ0KZGFkb3NpbXB1dA0KYGBgDQoNCj4NCg0KIyA0LkV4cGxvcmF0w7NyaW8gY29tIG9zIGRhZG9zIGltcHV0YWRvDQoNCj4NCg0KYGBge3IsbWVzc2FnZT1GQUxTRSx3YXJuaW5nPUZBTFNFfQ0KY2VydmVqYTwtIGRhZG9zaW1wdXQgfD4gc2VsZWN0KGMoY3VzdG8scXVhbnRpZGFkZSxhbGNvb2wscmVwdXRhY2FvLGNvciwgICAgICAgICAgICAgICAgIGFyb21hLHNhYm9yKSkNCg0KY2VydmVqYQ0KdmlzZGF0Ojp2aXNfZGF0KGNlcnZlamEpDQpjZXJ2ZWphIHw+IGRwbHlyOjpnbGltcHNlKCkNCg0Kc2tpbShjZXJ2ZWphKQ0KYGBgDQo+DQoNCmBgYHtyLG1lc3NhZ2U9RkFMU0Usd2FybmluZz1GQUxTRX0NCnJob19oYXQgPC0gY29yKGNlcnZlamEpDQpjb3JycGxvdChyaG9faGF0LCBtZXRob2QgPSAibnVtYmVyIikNCmBgYA0KDQo+DQoNCmBgYHtyLG1lc3NhZ2U9RkFMU0Usd2FybmluZz1GQUxTRX0NCmNlcnZlamEgfD4gDQogIEdHYWxseTo6Z2dzY2F0bWF0KCkNCmNlcnZlamEgfD4gDQogIEdHYWxseTo6Z2dwYWlycygpDQpgYGANCj4NCg0KIyA1LiBDb25zdHJ1aW5kbyBvcyB3b3JrZmxvd3MgZG9zIG1vZGVsb3MNCg0KPg0KDQojIyA1LjEgRGl2aXPDo28gZG9zIGRhZG9zDQoNCj4NCg0KYGBge3IsbWVzc2FnZT1GQUxTRSx3YXJuaW5nPUZBTFNFfQ0Kc2V0LnNlZWQoMCkgIyBGaXhhbmRvIHVtYSBzZW1lbnRlDQpkaXZpc2FvX2luaWNpYWwgPC0gcnNhbXBsZTo6aW5pdGlhbF9zcGxpdChjZXJ2ZWphLCBwcm9wID0gMC44LCBzdHJhdGEgPSAicmVwdXRhY2FvIikNCnRyZWluYW1lbnRvIDwtIHJzYW1wbGU6OnRyYWluaW5nKGRpdmlzYW9faW5pY2lhbCkgIyBDb25qdW50byBkZSB0cmVpbmFtZW50bw0KdGVzdGUgPC0gcnNhbXBsZTo6dGVzdGluZyhkaXZpc2FvX2luaWNpYWwpICMgQ29uanVudG8gZGUgdGVzdGUNCnRlc3RlDQpgYGANCg0KPg0KDQojIyA1LjIgVHJhdGFtZW50byBkb3MgZGFkb3MgKHByw6ktcHJvY2Vzc2FtZW50bykNCg0KPg0KDQpgYGB7cixtZXNzYWdlPUZBTFNFLHdhcm5pbmc9RkFMU0V9DQpyZWNlaXRhXzEgPC0gDQogIHRyZWluYW1lbnRvIHw+IA0KICByZWNpcGUoZm9ybXVsYSA9IHJlcHV0YWNhbyB+IC4pIHw+DQogIHN0ZXBfWWVvSm9obnNvbihhbGxfcHJlZGljdG9ycygpKSB8Pg0KICBzdGVwX25vcm1hbGl6ZShhbGxfcHJlZGljdG9ycygpKSB8Pg0KICBzdGVwX3p2KGFsbF9wcmVkaWN0b3JzKCkpIHw+DQogIHN0ZXBfY29ycihhbGxfcHJlZGljdG9ycygpKQ0KDQpyZWNlaXRhXzIgPC0gDQogIHRyZWluYW1lbnRvIHw+IA0KICByZWNpcGUoZm9ybXVsYSA9IHJlcHV0YWNhbyB+IC4pIHw+DQogIHN0ZXBfWWVvSm9obnNvbihhbGxfcHJlZGljdG9ycygpKSB8Pg0KICBzdGVwX25vcm1hbGl6ZShhbGxfcHJlZGljdG9ycygpKQ0KcmVjZWl0YV8xIHw+IA0KICBwcmVwKCkgfD4gDQogIGp1aWNlKCkNCnJlY2VpdGFfMSB8PiANCiAgcHJlcCgpIHw+IA0KICBiYWtlKG5ld19kYXRhID0gdHJlaW5hbWVudG8pDQoNCmBgYA0KDQo+DQoNCiMgNi4gRGVmaW5pbmRvIG9zIG1vZGVsb3MNCg0KPg0KDQpgYGB7cixtZXNzYWdlPUZBTFNFLHdhcm5pbmc9RkFMU0V9DQptb2RlbG9fZWxhc3RpYyA8LSANCiAgcGFyc25pcDo6bGluZWFyX3JlZyhwZW5hbHR5ID0gdHVuZTo6dHVuZSgpLCBtaXh0dXJlID0gdHVuZTo6dHVuZSgpKSB8PiANCiAgcGFyc25pcDo6c2V0X21vZGUoInJlZ3Jlc3Npb24iKSB8PiANCiAgcGFyc25pcDo6c2V0X2VuZ2luZSgiZ2xtbmV0IikNCg0KbW9kZWxvX2tubiA8LQ0KICBwYXJzbmlwOjpuZWFyZXN0X25laWdoYm9yKA0KICAgIG5laWdoYm9ycyA9IHR1bmU6OnR1bmUoKSwNCiAgICBkaXN0X3Bvd2VyID0gdHVuZTo6dHVuZSgpLCANCiAgICB3ZWlnaHRfZnVuYyA9ICJnYXVzc2lhbiIgDQogICkgfD4gDQogIHBhcnNuaXA6OnNldF9tb2RlKCJyZWdyZXNzaW9uIikgfD4gDQogIHBhcnNuaXA6OnNldF9lbmdpbmUoImtrbm4iKQ0KDQptb2RlbG9fc3ZtIDwtIA0KICBwYXJzbmlwOjpzdm1fcmJmKA0KICAgIGNvc3QgPSB0dW5lOjp0dW5lKCksDQogICAgcmJmX3NpZ21hID0gdHVuZTo6dHVuZSgpLA0KICAgIG1hcmdpbiA9IHR1bmU6OnR1bmUoKQ0KICApIHw+IA0KICBwYXJzbmlwOjpzZXRfbW9kZSgicmVncmVzc2lvbiIpIHw+IA0KICBwYXJzbmlwOjpzZXRfZW5naW5lKCJrZXJubGFiIikNCg0KYGBgDQoNCj4NCg0KIyA3LiBDcmlhbmRvIG8gY29uanVudG8gZGUgdmFsaWRhw6fDo28NCg0KPg0KDQpgYGB7cixtZXNzYWdlPUZBTFNFLHdhcm5pbmc9RkFMU0V9DQp2YWxpZGFjYW9fY3J1emFkYSA8LSANCiAgdHJlaW5hbWVudG8gfD4gDQogIHJzYW1wbGU6OnZmb2xkX2N2KHYgPSA4TCwgc3RyYXRhID0gcmVwdXRhY2FvKQ0KDQpgYGANCg0KPg0KDQojIDguIENyaWFuZG8gdW0gd29ya2Zsb3cgY29tcGxldG8NCg0KPg0KDQpgYGB7cixtZXNzYWdlPUZBTFNFLHdhcm5pbmc9RkFMU0V9DQp3Zl90b2RvcyA8LQ0KICB3b3JrZmxvd19zZXQoDQogICAgcHJlcHJvYyA9IGxpc3QocmVjZWl0YV8xLCByZWNlaXRhXzIpLA0KICAgIG1vZGVscyA9IGxpc3QoDQogICAgICBrbm5fZml0ID0gbW9kZWxvX2tubiwNCiAgICAgIGVsYXN0aWNfZml0ID0gbW9kZWxvX2VsYXN0aWMsDQogICAgICBzdm1fZml0ID0gbW9kZWxvX3N2bQ0KICAgICksDQogICAgY3Jvc3MgPSBUUlVFDQogICkNCmNvbnRyb2xlX2dyaWQgPC0gY29udHJvbF9ncmlkKA0KICBzYXZlX3ByZWQgPSBUUlVFLA0KICBzYXZlX3dvcmtmbG93ID0gVFJVRSwNCiAgcGFyYWxsZWxfb3ZlciA9ICJyZXNhbXBsZXMiDQopDQpgYGANCg0KPg0KDQojIDkuIFRyZWluYW5kbyBvIG1vZGVsbw0KDQo+DQoNCmBgYHtyLG1lc3NhZ2U9RkFMU0Usd2FybmluZz1GQUxTRX0NCnRyZWlubyA8LQ0KICB3Zl90b2RvcyB8PiANCiAgd29ya2Zsb3dfbWFwKA0KICAgIHJlc2FtcGxlcyA9IHZhbGlkYWNhb19jcnV6YWRhLA0KICAgIGdyaWQgPSAyMEwsDQogICAgY29udHJvbCA9IGNvbnRyb2xlX2dyaWQNCiAgKQ0KDQoNCg0KYXV0b3Bsb3QodHJlaW5vLCBtZXRyaWMgPSAicm1zZSIpICsgDQogIGxhYnMoDQogICAgdGl0bGUgPSAiQXZhbGlhw6fDo28gZG9zIG1vZGVsb3MgZGUgcmVncmVzc8OjbyIsDQogICAgc3VidGl0bGUgPSAiVXRpbGl6YW5kbyBhIG3DqXRyaWNhIGRvIEVRTSINCiAgKSArIA0KICB4bGFiKCJSYW5rIGRvcyBXb3JrZmxvd3MiKSArDQogIHlsYWIoIkVycm8gUXVhZHLDoXRpY28gTcOpZGlvIC0gRVFNIikNCg0KYGBgDQo+DQoNCiMgMTAuIE1lbGhvcmVzIE1vZGVsb3MNCg0KPg0KDQpgYGB7cixtZXNzYWdlPUZBTFNFLHdhcm5pbmc9RkFMU0V9DQptZWxob3JlcyA8LSANCiAgdHJlaW5vIHw+IA0KICByYW5rX3Jlc3VsdHMoc2VsZWN0X2Jlc3QgPSBUUlVFLCByYW5rX21ldHJpYyA9ICJybXNlIikNCg0KYXV0b3Bsb3QodHJlaW5vLCBzZWxlY3RfYmVzdCA9IFRSVUUpDQoNCg0KdHJlaW5vIHw+IA0KICByYW5rX3Jlc3VsdHMoKQ0KYGBgDQoNCj4NCg0KIyAxMS4gTWVsaG9yIE1vZGVsbw0KDQo+DQoNCmBgYHtyLG1lc3NhZ2U9RkFMU0Usd2FybmluZz1GQUxTRX0NCm1lbGhvcl9tb2RlbG8gPC0gDQogIHRyZWlubyB8PiANCiAgZXh0cmFjdF93b3JrZmxvd19zZXRfcmVzdWx0KGlkID0gInJlY2lwZV8xX2tubl9maXQiKSB8PiANCiAgc2VsZWN0X2Jlc3QobWV0cmljID0gInJtc2UiKQ0KbWVsaG9yX21vZGVsbw0KYGBgDQoNCj4NCg0KIyAxMi4gQXZhbGlhw6fDo28gZmluYWwgZG8gbWVsaG9yIG1vZGVsbw0KDQo+DQoNCmBgYHtyLG1lc3NhZ2U9RkFMU0Usd2FybmluZz1GQUxTRX0NCndmX2ZpbmFsIDwtIA0KICB0cmVpbm8gfD4gDQogIGV4dHJhY3Rfd29ya2Zsb3coaWQgPSAicmVjaXBlXzFfa25uX2ZpdCIpIHw+IA0KICBmaW5hbGl6ZV93b3JrZmxvdyhtZWxob3JfbW9kZWxvKQ0KDQp0ZXN0ZSA8LSANCiAgd2ZfZmluYWwgfD4gDQogIGxhc3RfZml0KHNwbGl0ID0gZGl2aXNhb19pbmljaWFsKQ0KDQp0ZXN0ZSQubWV0cmljcw0KDQoNCm1vZGVsb19maW5hbCA8LSANCiAgd2ZfZmluYWwgfD4gDQogIGZpdChkYWRvcykNCm1vZGVsb19maW5hbA0KYGBgDQoNCg0KDQo=