Skip to content

Commit

Permalink
regressao logistica
Browse files Browse the repository at this point in the history
  • Loading branch information
azeloc committed Nov 21, 2024
1 parent ea0906c commit 5e27565
Show file tree
Hide file tree
Showing 2 changed files with 203 additions and 0 deletions.
99 changes: 99 additions & 0 deletions exemplos_de_aula/08-logistic-reg.R
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
# objetivo: ajustar uma regressao logistica no R
# com regularizacao


# Pacotes -----------------------------------------------------------------

library(tidymodels)
library(ISLR)


# Base dados --------------------------------------------------------------

data(credit_data)

dados_numericos <- credit_data |>
select(
Status, Seniority, Time, Age, Expenses, Income,
Assets, Debt, Amount, Price
) |>
drop_na()
# isso aqui nao é muito legal! na proxima aula vamos ver como
# melhorar para nao precisar manipular desse jeito antes de
# modelar

# Analises iniciais -------------------------------------------------------

# nao vou fazer hoje


# split inicial -----------------------------------------------------------

credit_initial_split <- initial_split(dados_numericos)

treino <- training(credit_initial_split)
teste <- testing(credit_initial_split)

# receita -----------------------------------------------------------------

receita <- recipe(Status ~ ., data = treino) |>
step_normalize(all_numeric_predictors())

# modelo ------------------------------------------------------------------

modelo <- logistic_reg(
engine = "glmnet",
penalty = tune()
)

# workflow ----------------------------------------------------------------

meu_fluxo <- workflow() |>
add_recipe(receita) |>
add_model(modelo)


# cv ----------------------------------------------------------------------

reamostras <- vfold_cv(treino, v = 5)

# tunagem -----------------------------------------------------------------

metricas <- metric_set(mn_log_loss)

tunagem <- tune_grid(
meu_fluxo,
resamples = reamostras,
metrics = metricas,
grid =grid_regular(penalty(c(-12, 0)))
)


# graficos ----------------------------------------------------------------

autoplot(tunagem)


# finalizar workflow ------------------------------------------------------

workflow_final <- meu_fluxo |>
finalize_workflow(
select_best(tunagem)
)

# modelo final

# antes teria que fazer o de treino/teste pra ver se nao overfitou...

modelo_final <- fit(workflow_final, dados_numericos)

dados_com_previsao <- dados_numericos |>
bind_cols(
predict(modelo_final, new_data = dados_numericos, type = c("prob")),
predict(modelo_final, new_data = dados_numericos, type = c("class"))
)

dados_com_previsao |>
mutate(prob_grafico = ifelse(Status == "good", .pred_good, .pred_bad)) |>
ggplot(aes(x = .pred_good, fill = Status)) +
geom_density(alpha = 0.5)
104 changes: 104 additions & 0 deletions exemplos_de_aula/rascunho_exercicio.R
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
# Pacotes -----------------------------------------------------------------

library(tidymodels)

# Base de dados -----------------------------------------------------------

data(concrete, package = "modeldata")
nrow(concrete)
glimpse(concrete)

# initial split?

# exercício 0 -------------------------------------------------------------
# Defina uma 'recipe' que normalize todas as variáveis explicativas.
# Dicas: recipe(), step_normalize(), all_numeric_predictors().

receita <- recipe(compressive_strength ~ ., x = concrete)

# exercício 1 -------------------------------------------------------------
# Defina uma especificação de f que caracterize uma regressão linear
# (mode 'regression'). Especifique também que você deseja tunar a 'penalty' e
# a 'mixture'.
# Dicas: linear_reg(), set_engine(), set_mode(), tune().

modelo_arvore <- decision_tree(
mode = "regression",
tree_depth = tune()
# tune() indica que é um hiperparametro que deve ficar
# sem definição exata até irmos testar na base validação (ou bases no caso de
# cv/cross-validation)
)

# exercício 2 -------------------------------------------------------------
# Defina um 'workflow' que junte a receita do ex. 0 e o modelo do ex. 1.
# Dicas: workflow(), add_model(), add_recipe().

meu_fluxo <- workflow() |>
add_recipe(receita) |>
add_model(modelo_arvore)

# exercício 3 -------------------------------------------------------------
# Crie um objeto que represente a estratégia de reamostragem do tipo K-Fold cross
# validation com 5 folds.
# Dica: vfold_cv().

bases_validacao <- vfold_cv(concrete, v = 5)

# exercício 4 -------------------------------------------------------------
# Defina um grid de hiperparâmetros que você irá testar tanto de 'penalty' quanto
# de 'mixture'.
# Dica: grid_regular(), penalty(), mixture().

# exercício 5 -------------------------------------------------------------
# Execute a tunagem do modelo usando os objetos criados nos exercícios anteriores.
# Dica: tune_grid()

tunagem <- tune_grid(
meu_fluxo, resamples = bases_validacao
)

autoplot(tunagem)

show_best(tunagem) |> View()



# exercício 6 -------------------------------------------------------------
# Visualize os resultados dos modelos ajustados e atualize o workflow com os
# parâmetros do melhor modelo.
# Dica: autoplot(), collect_metrics(), show_best(), select_best(), finalize_workflow().


# desafio 1 ---------------------------------------------------------------
# Qual hiperparâmetro tem maior efeito no resultado do modelo? Justifique
# a sua afirmativa com um gráfico.


# exercício 7 -------------------------------------------------------------
# Ajuste o modelo na base de treino e verifique o desempenho na base de teste.
# Dica: last_fit(split = ______initial_split), collect_metrics()


# exercício 8 -------------------------------------------------------------
# Ajuste o modelo final para a base inteira salve-o em um arquivo .rds.
# Dica: fit(), saveRDS().

## final. o que saiu do modelo?

meu_fluxo_finalizado <- meu_fluxo |>
finalize_workflow(
select_best(tunagem)
)
# aqui o tune() deixa de ser tune()

modelo_final <- fit(meu_fluxo_finalizado, concrete)

base_original_com_previsoes <- concrete |>
mutate(
forca_proposta = predict(modelo_final, new_data = concrete)$.pred
)

base_original_com_previsoes |>
ggplot(aes(x = age, y = compressive_strength)) +
geom_point()

0 comments on commit 5e27565

Please sign in to comment.