diff --git a/exemplos_de_aula/08-logistic-reg.R b/exemplos_de_aula/08-logistic-reg.R new file mode 100644 index 0000000..5b826a0 --- /dev/null +++ b/exemplos_de_aula/08-logistic-reg.R @@ -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) diff --git a/exemplos_de_aula/rascunho_exercicio.R b/exemplos_de_aula/rascunho_exercicio.R new file mode 100644 index 0000000..4da33e1 --- /dev/null +++ b/exemplos_de_aula/rascunho_exercicio.R @@ -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()