Aula 7
Grupo Alliance
Programa de Pós-Graduação em Psiquiatria e Ciências do Comportamento
Universidade Federal do Rio Grande do Sul
12 de junho de 2023
Vamos trabalhar com um exemplo em aprendizado supervisionado!
Hoje vamos trabalhar com classificação.
Pergunta de pesquisa: Podemos prever o sexo de um pinguim baseado em sua espécie, comprimento do bico e da nadadeira, profundidade do bico e massa corporal?
Uma “extensão” da regressão linear para problemas de classificação
Usa a função logística para transformar saída da regressão linear em uma probabilidade1
Coeficientes: efeito logarítmico do \(X\) sobre a razão de chances (odds ratio). Ou seja, não devemos interpretar os coeficientes diretamente
Em geral, usamos um limiar para decidir em qual classe o dado pertence (geralmente 0,5)
Para calcular o odds ratio no R, podemos exponenciar o coeficiente da regressão com a função exp()
tidymodels
tidymodels
── Attaching packages ────────────────────────────────────── tidymodels 1.1.0 ──
✔ broom 1.0.5 ✔ rsample 1.1.1
✔ dials 1.2.0 ✔ tibble 3.2.1
✔ infer 1.0.4 ✔ tidyr 1.3.0
✔ modeldata 1.1.0 ✔ tune 1.1.1
✔ parsnip 1.1.0 ✔ workflows 1.1.3
✔ purrr 1.0.1 ✔ workflowsets 1.0.1
✔ recipes 1.0.6 ✔ yardstick 1.2.0
── Conflicts ───────────────────────────────────────── tidymodels_conflicts() ──
✖ purrr::discard() masks scales::discard()
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag() masks stats::lag()
✖ dials::prune() masks rpart::prune()
✖ recipes::step() masks stats::step()
• Search for functions across packages at https://www.tidymodels.org/find/
Limpar os dados
Dividir os dados em treino e teste
Criar reamostragens com bootstrapping
Especificar o algoritmo a ser usado
Especificar o fluxo de modelagem com a pergunta de pesquisa
Ajustar modelos nas reamostragens
Verificar como o modelo performou
Ajustar o modelo final no conjunto de treino e testar no conjunto de teste
Checar os coeficientes
Nesta etapa, vamos remover pinguins com valor ausente no desfecho
E também remover as variáveis de ano e ilha que não usaremos
# A tibble: 333 × 6
especie comprimento_bico profundidade_bico comprimento_nadadeira
<fct> <dbl> <dbl> <int>
1 Pinguim-de-adélia 39.1 18.7 181
2 Pinguim-de-adélia 39.5 17.4 186
3 Pinguim-de-adélia 40.3 18 195
4 Pinguim-de-adélia 36.7 19.3 193
5 Pinguim-de-adélia 39.3 20.6 190
6 Pinguim-de-adélia 38.9 17.8 181
7 Pinguim-de-adélia 39.2 19.6 195
8 Pinguim-de-adélia 41.1 17.6 182
9 Pinguim-de-adélia 38.6 21.2 191
10 Pinguim-de-adélia 34.6 21.1 198
# ℹ 323 more rows
# ℹ 2 more variables: massa_corporal <int>, sexo <fct>
Bootstrapping: técnica que nos permite estimar a variabilidade do desempenho do modelo de classificação a partir de uma única amostra de treinamento
Como funciona: criamos várias amostras de treinamento adicionais, sorteando aleatoriamente observações do conjunto de treino original
# Bootstrap sampling
# A tibble: 25 × 2
splits id
<list> <chr>
1 <split [249/93]> Bootstrap01
2 <split [249/93]> Bootstrap02
3 <split [249/97]> Bootstrap03
4 <split [249/95]> Bootstrap04
5 <split [249/103]> Bootstrap05
6 <split [249/86]> Bootstrap06
7 <split [249/92]> Bootstrap07
8 <split [249/83]> Bootstrap08
9 <split [249/89]> Bootstrap09
10 <split [249/95]> Bootstrap10
# ℹ 15 more rows
Especificamos que queremos usar uma regressão logística binomial
Dizemos para o R que o motor (engine) usado é a função glm()
sexo
do pinguim a partir de todas as outras variáveis do conjunto de dadosrs_pinguins <- wf_pinguins |>
add_model(mod_log) |>
fit_resamples(
resamples = boot_pinguins,
control = control_resamples(
save_pred = TRUE,
verbose = TRUE
)
)
rs_pinguins
# Resampling results
# Bootstrap sampling
# A tibble: 25 × 5
splits id .metrics .notes .predictions
<list> <chr> <list> <list> <list>
1 <split [249/93]> Bootstrap01 <tibble [2 × 4]> <tibble [0 × 3]> <tibble>
2 <split [249/93]> Bootstrap02 <tibble [2 × 4]> <tibble [0 × 3]> <tibble>
3 <split [249/97]> Bootstrap03 <tibble [2 × 4]> <tibble [0 × 3]> <tibble>
4 <split [249/95]> Bootstrap04 <tibble [2 × 4]> <tibble [0 × 3]> <tibble>
5 <split [249/103]> Bootstrap05 <tibble [2 × 4]> <tibble [0 × 3]> <tibble>
6 <split [249/86]> Bootstrap06 <tibble [2 × 4]> <tibble [0 × 3]> <tibble>
7 <split [249/92]> Bootstrap07 <tibble [2 × 4]> <tibble [0 × 3]> <tibble>
8 <split [249/83]> Bootstrap08 <tibble [2 × 4]> <tibble [0 × 3]> <tibble>
9 <split [249/89]> Bootstrap09 <tibble [2 × 4]> <tibble [0 × 3]> <tibble>
10 <split [249/95]> Bootstrap10 <tibble [2 × 4]> <tibble [0 × 3]> <tibble>
# ℹ 15 more rows
A curva ROC nos permite visualizar o desempenho do modelo em diferentes pontos de corte
Quanto mais próximo a curva estiver do canto superior esquerdo, melhor será o desempenho do modelo
Acurácia é a proporção de predições corretas em relação ao total de predições
final_pinguins <- wf_pinguins |>
add_model(mod_log) |>
last_fit(divisao_pinguins)
collect_metrics(final_pinguins)
# A tibble: 2 × 4
.metric .estimator .estimate .config
<chr> <chr> <dbl> <chr>
1 accuracy binary 0.905 Preprocessor1_Model1
2 roc_auc binary 0.966 Preprocessor1_Model1
Truth
Prediction fêmea macho
fêmea 39 5
macho 3 37
# A tibble: 7 × 5
term estimate std.error statistic p.value
<chr> <dbl> <dbl> <dbl> <dbl>
1 profundidade_bico 7.50e+ 0 0.455 4.43 0.00000940
2 comprimento_bico 1.88e+ 0 0.159 4.00 0.0000639
3 comprimento_nadadeira 1.06e+ 0 0.0653 0.863 0.388
4 massa_corporal 1.01e+ 0 0.00138 4.63 0.00000374
5 `especiePinguim-de-barbicha` 9.76e- 4 1.91 -3.62 0.000295
6 `especiePinguim-gentoo` 1.96e- 4 3.25 -2.63 0.00866
7 (Intercept) 2.35e-42 18.1 -5.30 0.000000115
Dica de leitura: An Introduction to Statistical Learning
Rodar os códigos dos slides para tentar reproduzir o exemplo
tidymodels
caso não o tenha