Processing math: 100%
+ - 0:00:00
Notes for current slide
Notes for next slide

Statistical Learning:

Resampling Methods I: Cross-Validation

Prof. Carlos Trucíos
FACC/UFRJ

  ctruciosm.github.io
  carlos.trucios@facc.ufrj.br

Grupo de Estudos CIA,
– Causal Inference and Analytics –

2021-07-29

1

ctruciosm.github.io — Carlos Trucíos (FACC/UFRJ)

Motivação

  • No mundo ideal, gostaríamos treinar nosso modelo utilizando todo nosso conjunto de dados e avaliar sua performance com um novo dataset.
2

ctruciosm.github.io — Carlos Trucíos (FACC/UFRJ)

Motivação

  • No mundo ideal, gostaríamos treinar nosso modelo utilizando todo nosso conjunto de dados e avaliar sua performance com um novo dataset.

  • Na prática, não temos esse outro (novo) conjunto de dados e precisamos de algumas técnicas para estimar a performance do modelo antes de colocá-lo em produção.

3

ctruciosm.github.io — Carlos Trucíos (FACC/UFRJ)

Motivação

  • No mundo ideal, gostaríamos treinar nosso modelo utilizando todo nosso conjunto de dados e avaliar sua performance com um novo dataset.

  • Na prática, não temos esse outro (novo) conjunto de dados e precisamos de algumas técnicas para estimar a performance do modelo antes de colocá-lo em produção.

  • Para lidar com este problema, utilizamos métodos de reamostragem ( resampling methods ).

4

ctruciosm.github.io — Carlos Trucíos (FACC/UFRJ)

Motivação

  • No mundo ideal, gostaríamos treinar nosso modelo utilizando todo nosso conjunto de dados e avaliar sua performance com um novo dataset.

  • Na prática, não temos esse outro (novo) conjunto de dados e precisamos de algumas técnicas para estimar a performance do modelo antes de colocá-lo em produção.

  • Para lidar com este problema, utilizamos métodos de reamostragem ( resampling methods ).

  • Esses métodos podem ser classificados em: Cross-Validation e Bootstrap.

5

ctruciosm.github.io — Carlos Trucíos (FACC/UFRJ)

Motivação

  • No mundo ideal, gostaríamos treinar nosso modelo utilizando todo nosso conjunto de dados e avaliar sua performance com um novo dataset.

  • Na prática, não temos esse outro (novo) conjunto de dados e precisamos de algumas técnicas para estimar a performance do modelo antes de colocá-lo em produção.

  • Para lidar com este problema, utilizamos métodos de reamostragem ( resampling methods ).

  • Esses métodos podem ser classificados em: Cross-Validation e Bootstrap.

  • Entre as técnicas de Cross-Validation, temos:

    • Validation Set Approach
    • Leave-One-Out Cross-Validation
    • k-fold Cross-Validation
6

ctruciosm.github.io — Carlos Trucíos (FACC/UFRJ)

Validation Set Approach

  • Dividimos aleatoriamente o conjunto de dados em dois parte: dados de treinamento e dados de validação (também chamados dados de teste).
8

ctruciosm.github.io — Carlos Trucíos (FACC/UFRJ)

Validation Set Approach

  • Dividimos aleatoriamente o conjunto de dados em dois parte: dados de treinamento e dados de validação (também chamados dados de teste).

  • Ajustamos (treinamos) o modelo utilizando os dados de treinamento e avaliamos seu desempenho nos dados de teste (que são dados que o modelo treinado não conhece)

9

ctruciosm.github.io — Carlos Trucíos (FACC/UFRJ)

Validation Set Approach

  • Dividimos aleatoriamente o conjunto de dados em dois parte: dados de treinamento e dados de validação (também chamados dados de teste).

  • Ajustamos (treinamos) o modelo utilizando os dados de treinamento e avaliamos seu desempenho nos dados de teste (que são dados que o modelo treinado não conhece)

  • O desempenho obtido com os dados de teste, fornece uma estimativa do desempenho que o modelo terá em um novo dataset

10

ctruciosm.github.io — Carlos Trucíos (FACC/UFRJ)

Validation Set Approach

  • Dividimos aleatoriamente o conjunto de dados em dois parte: dados de treinamento e dados de validação (também chamados dados de teste).

  • Ajustamos (treinamos) o modelo utilizando os dados de treinamento e avaliamos seu desempenho nos dados de teste (que são dados que o modelo treinado não conhece)

  • O desempenho obtido com os dados de teste, fornece uma estimativa do desempenho que o modelo terá em um novo dataset

  • Isto é feito facilmente utilizando as funções initial_split(), training() and testing() do pacote rsample

11

ctruciosm.github.io — Carlos Trucíos (FACC/UFRJ)

Validation Set Approach

  • Dividimos aleatoriamente o conjunto de dados em dois parte: dados de treinamento e dados de validação (também chamados dados de teste).

  • Ajustamos (treinamos) o modelo utilizando os dados de treinamento e avaliamos seu desempenho nos dados de teste (que são dados que o modelo treinado não conhece)

  • O desempenho obtido com os dados de teste, fornece uma estimativa do desempenho que o modelo terá em um novo dataset

  • Isto é feito facilmente utilizando as funções initial_split(), training() and testing() do pacote rsample

Exemplo:

library(rsample)
split_data <- initial_split(data = full_dataset, prop = 3/4, strata = variavel_y)
train_data <- training(split_data)
test_data <- testing(split_data)
12

ctruciosm.github.io — Carlos Trucíos (FACC/UFRJ)

Validation Set Approach

Case:

O conjunto de dados credit_data do pacote modeldata contém 4454 informações sobre clientes de um determinado banco, incluindo a variável Status que nos diz se o cliente é um bom (good) ou mau (bad) pagador.

Fazer um modelo preditivo que nos ajude a classificar se um novo cliente será um bom ou mau pagador.

Qual é a performance estimada (taxa de observações corretamente classificadas) do modelo quando tivermos um dataset com novas observações?

13

ctruciosm.github.io — Carlos Trucíos (FACC/UFRJ)

Validation Set Approach

Case:

O conjunto de dados credit_data do pacote modeldata contém 4454 informações sobre clientes de um determinado banco, incluindo a variável Status que nos diz se o cliente é um bom (good) ou mau (bad) pagador.

Fazer um modelo preditivo que nos ajude a classificar se um novo cliente será um bom ou mau pagador.

Qual é a performance estimada (taxa de observações corretamente classificadas) do modelo quando tivermos um dataset com novas observações?

library(dplyr)
library(rsample)
data("credit_data", package = "modeldata")
credit_data <- credit_data %>% na.omit()
split_data <- initial_split(data = credit_data, prop = 3/4, strata = Status)
train_data <- training(split_data)
test_data <- testing(split_data)
14

ctruciosm.github.io — Carlos Trucíos (FACC/UFRJ)

Validation Set Approach

library(tidymodels)
library(kknn)
model_spec <- nearest_neighbor(neighbors = 5) %>%
set_engine("kknn") %>%
set_mode("classification")
model_fit <- model_spec %>%
fit(Status ~ ., data = train_data)
yhat <- predict(model_fit, new_data = test_data)
accuracy_vec(yhat$.pred_class, test_data$Status)
## [1] 0.7556874
library(tidymodels)
model_spec <- logistic_reg() %>%
set_engine("glm") %>%
set_mode("classification")
model_fit <- model_spec %>%
fit(Status ~ ., data = train_data)
yhat <- predict(model_fit, new_data = test_data)
accuracy_vec(yhat$.pred_class, test_data$Status)
## [1] 0.8041543
library(tidymodels)
library(discrim)
model_spec <- discrim_linear() %>%
set_engine("MASS") %>%
set_mode("classification")
model_fit <- model_spec %>%
fit(Status ~ ., data = train_data)
yhat <- predict(model_fit, new_data = test_data)
accuracy_vec(yhat$.pred_class, test_data$Status)
## [1] 0.7942631
library(tidymodels)
library(discrim)
model_spec <- discrim_quad() %>%
set_engine("MASS") %>%
set_mode("classification")
model_fit <- model_spec %>%
fit(Status ~ ., data = train_data)
yhat <- predict(model_fit, new_data = test_data)
accuracy_vec(yhat$.pred_class, test_data$Status)
## [1] 0.760633
15

ctruciosm.github.io — Carlos Trucíos (FACC/UFRJ)

Validation Set Approach

Fraquezas do método:

  • O valor estimado da performance do modelo (neste caso, a taxa de observações corretamente classificadas) pode variar muito dependendo de qusis observações estão no treinamento e quais no teste.
16

ctruciosm.github.io — Carlos Trucíos (FACC/UFRJ)

Validation Set Approach

Fraquezas do método:

  • O valor estimado da performance do modelo (neste caso, a taxa de observações corretamente classificadas) pode variar muito dependendo de qusis observações estão no treinamento e quais no teste.

  • Se tivermos poucas observações, utilizaremos muito poucas observações para treinar o modelo (ou seja, o modelo aprenderá com um subconjunto menor de observações) o que pode subestimar o desempenho estimado do modelo (taxa de observações corretamente classificadas).

17

ctruciosm.github.io — Carlos Trucíos (FACC/UFRJ)

Validation Set Approach

Fraquezas do método:

  • O valor estimado da performance do modelo (neste caso, a taxa de observações corretamente classificadas) pode variar muito dependendo de qusis observações estão no treinamento e quais no teste.

  • Se tivermos poucas observações, utilizaremos muito poucas observações para treinar o modelo (ou seja, o modelo aprenderá com um subconjunto menor de observações) o que pode subestimar o desempenho estimado do modelo (taxa de observações corretamente classificadas).

  • Uma alternativa a este método é o Leave-One-Out Cross-Validation.

18

ctruciosm.github.io — Carlos Trucíos (FACC/UFRJ)

Leave-One-Out Cross-Validation

  • O método é muito parecido com o anterior, mas tenta superar as fraquezas observadas pelo Validation Set Approach.
20

ctruciosm.github.io — Carlos Trucíos (FACC/UFRJ)

Leave-One-Out Cross-Validation

  • O método é muito parecido com o anterior, mas tenta superar as fraquezas observadas pelo Validation Set Approach.

  • Dividimos o dataset em dois partes: treinamento (com n1 observações) e teste (com apenas 1 observação).

21

ctruciosm.github.io — Carlos Trucíos (FACC/UFRJ)

Leave-One-Out Cross-Validation

  • O método é muito parecido com o anterior, mas tenta superar as fraquezas observadas pelo Validation Set Approach.

  • Dividimos o dataset em dois partes: treinamento (com n1 observações) e teste (com apenas 1 observação).

  • O método é aplicado n-vezes (em cada vez, o modelo é treinado utilizando n1 observações e avaliado utilizando uma única observação).

22

ctruciosm.github.io — Carlos Trucíos (FACC/UFRJ)

Leave-One-Out Cross-Validation

  • O método é muito parecido com o anterior, mas tenta superar as fraquezas observadas pelo Validation Set Approach.

  • Dividimos o dataset em dois partes: treinamento (com n1 observações) e teste (com apenas 1 observação).

  • O método é aplicado n-vezes (em cada vez, o modelo é treinado utilizando n1 observações e avaliado utilizando uma única observação).

  • A performance estimada do modelo é calculada como a média das performances obtidas em cada uma das n-vezes.

23

ctruciosm.github.io — Carlos Trucíos (FACC/UFRJ)

Leave-One-Out Cross-Validation

  • O método é muito parecido com o anterior, mas tenta superar as fraquezas observadas pelo Validation Set Approach.

  • Dividimos o dataset em dois partes: treinamento (com n1 observações) e teste (com apenas 1 observação).

  • O método é aplicado n-vezes (em cada vez, o modelo é treinado utilizando n1 observações e avaliado utilizando uma única observação).

  • A performance estimada do modelo é calculada como a média das performances obtidas em cada uma das n-vezes.

CV(n)=1nni=1Medida de Performancei

24

ctruciosm.github.io — Carlos Trucíos (FACC/UFRJ)

Leave-One-Out Cross-Validation

  • O método é muito parecido com o anterior, mas tenta superar as fraquezas observadas pelo Validation Set Approach.

  • Dividimos o dataset em dois partes: treinamento (com n1 observações) e teste (com apenas 1 observação).

  • O método é aplicado n-vezes (em cada vez, o modelo é treinado utilizando n1 observações e avaliado utilizando uma única observação).

  • A performance estimada do modelo é calculada como a média das performances obtidas em cada uma das n-vezes.

CV(n)=1nni=1Medida de Performancei

  • Isto é feito com a função loo_cv() do pacote rsample
25

ctruciosm.github.io — Carlos Trucíos (FACC/UFRJ)

Leave-One-Out Cross-Validation

Voltando ao case do dataset credit_data do pacote modeldata.

Por enquanto, não existe uma forma direta (se alguém souber, eu agradeço) de fazer isto com tidymodels mas podemos utilizar um for e resolver o problema de forma fácil.

n = nrow(credit_data)
salvar_performance = c()
model_spec <- logistic_reg() %>%
set_engine("glm") %>%
set_mode("classification")
for (i in 1:n){
model_fit <- model_spec %>%
fit(Status ~ ., data = credit_data[-i,])
yhat <- predict(model_fit, new_data = credit_data[i,])
salvar_performance[i] = accuracy_vec(yhat$.pred_class, credit_data$Status[i])
}
mean(salvar_performance)
# 0.808616

O grande problema do método Leave-One-Out é que demora MUITO.

26

ctruciosm.github.io — Carlos Trucíos (FACC/UFRJ)

k-Fold Cross-Validation

  • Nasce como uma alternativa ao Leave-One-Out Cross-Validation.
28

ctruciosm.github.io — Carlos Trucíos (FACC/UFRJ)

k-Fold Cross-Validation

  • Nasce como uma alternativa ao Leave-One-Out Cross-Validation.

  • É computacionalmente menos caro.

29

ctruciosm.github.io — Carlos Trucíos (FACC/UFRJ)

k-Fold Cross-Validation

  • Nasce como uma alternativa ao Leave-One-Out Cross-Validation.

  • É computacionalmente menos caro.

  • É o método de validação cruzada mais utilizado

30

ctruciosm.github.io — Carlos Trucíos (FACC/UFRJ)

k-Fold Cross-Validation

  • Nasce como uma alternativa ao Leave-One-Out Cross-Validation.

  • É computacionalmente menos caro.

  • É o método de validação cruzada mais utilizado

Como funciona?

  • Dividimos o dataset em k-grupos (folds) do mesmo tamanho.
31

ctruciosm.github.io — Carlos Trucíos (FACC/UFRJ)

k-Fold Cross-Validation

  • Nasce como uma alternativa ao Leave-One-Out Cross-Validation.

  • É computacionalmente menos caro.

  • É o método de validação cruzada mais utilizado

Como funciona?

  • Dividimos o dataset em k-grupos (folds) do mesmo tamanho.

  • Ajustamos (treinamos) o modelo k-vezes. Em cada vez, escolhemos um grupo para ser utilizado como dados de teste, e treinamos o modelo com os restantes k1 grupos.

32

ctruciosm.github.io — Carlos Trucíos (FACC/UFRJ)

k-Fold Cross-Validation

  • Nasce como uma alternativa ao Leave-One-Out Cross-Validation.

  • É computacionalmente menos caro.

  • É o método de validação cruzada mais utilizado

Como funciona?

  • Dividimos o dataset em k-grupos (folds) do mesmo tamanho.

  • Ajustamos (treinamos) o modelo k-vezes. Em cada vez, escolhemos um grupo para ser utilizado como dados de teste, e treinamos o modelo com os restantes k1 grupos.

  • A performance estimada do modelo é calculada como a média das performances obtidas em cada uma das k-vezes.

33

ctruciosm.github.io — Carlos Trucíos (FACC/UFRJ)

k-Fold Cross-Validation

  • Nasce como uma alternativa ao Leave-One-Out Cross-Validation.

  • É computacionalmente menos caro.

  • É o método de validação cruzada mais utilizado

Como funciona?

  • Dividimos o dataset em k-grupos (folds) do mesmo tamanho.

  • Ajustamos (treinamos) o modelo k-vezes. Em cada vez, escolhemos um grupo para ser utilizado como dados de teste, e treinamos o modelo com os restantes k1 grupos.

  • A performance estimada do modelo é calculada como a média das performances obtidas em cada uma das k-vezes.

CV(k)=1kki=1Medida de Performancei

34

ctruciosm.github.io — Carlos Trucíos (FACC/UFRJ)

k-Fold Cross-Validation

k-fold Cross-Validation é feito utilizando as funções vfold_cv(), fit_resamples entre outras do pacote tidymodels

35

ctruciosm.github.io — Carlos Trucíos (FACC/UFRJ)

k-Fold Cross-Validation

k-fold Cross-Validation é feito utilizando as funções vfold_cv(), fit_resamples entre outras do pacote tidymodels

library(tidymodels)
folds <- vfold_cv(credit_data, v = 10)
folds
## # 10-fold cross-validation
## # A tibble: 10 × 2
## splits id
## <list> <chr>
## 1 <split [3635/404]> Fold01
## 2 <split [3635/404]> Fold02
## 3 <split [3635/404]> Fold03
## 4 <split [3635/404]> Fold04
## 5 <split [3635/404]> Fold05
## 6 <split [3635/404]> Fold06
## 7 <split [3635/404]> Fold07
## 8 <split [3635/404]> Fold08
## 9 <split [3635/404]> Fold09
## 10 <split [3636/403]> Fold10
36

ctruciosm.github.io — Carlos Trucíos (FACC/UFRJ)

k-Fold Cross-Validation

library(tidymodels)
library(kknn)
folds <- vfold_cv(credit_data, v = 10)
model_spec <- nearest_neighbor(neighbors = 5) %>%
set_engine("kknn") %>%
set_mode("classification")
model_wf <- workflow() %>%
add_model(model_spec) %>%
add_formula(Status ~ .)
model_fit_rs <- model_wf %>%
fit_resamples(folds)
collect_metrics(model_fit_rs)
## # A tibble: 2 × 6
## .metric .estimator mean n std_err .config
## <chr> <chr> <dbl> <int> <dbl> <chr>
## 1 accuracy binary 0.754 10 0.00522 Preprocessor1_Model1
## 2 roc_auc binary 0.734 10 0.00921 Preprocessor1_Model1
library(tidymodels)
folds <- vfold_cv(credit_data, v = 10)
model_spec <- logistic_reg() %>%
set_engine("glm") %>%
set_mode("classification")
model_wf <- workflow() %>%
add_model(model_spec) %>%
add_formula(Status ~ .)
model_fit_rs <- model_wf %>%
fit_resamples(folds)
collect_metrics(model_fit_rs)
## # A tibble: 2 × 6
## .metric .estimator mean n std_err .config
## <chr> <chr> <dbl> <int> <dbl> <chr>
## 1 accuracy binary 0.809 10 0.00659 Preprocessor1_Model1
## 2 roc_auc binary 0.833 10 0.00796 Preprocessor1_Model1
library(tidymodels)
library(discrim)
folds <- vfold_cv(credit_data, v = 10)
model_spec <- discrim_linear() %>%
set_engine("MASS") %>%
set_mode("classification")
model_wf <- workflow() %>%
add_model(model_spec) %>%
add_formula(Status ~ .)
model_fit_rs <- model_wf %>%
fit_resamples(folds)
collect_metrics(model_fit_rs)
## # A tibble: 2 × 6
## .metric .estimator mean n std_err .config
## <chr> <chr> <dbl> <int> <dbl> <chr>
## 1 accuracy binary 0.803 10 0.00855 Preprocessor1_Model1
## 2 roc_auc binary 0.829 10 0.00871 Preprocessor1_Model1
library(tidymodels)
library(discrim)
folds <- vfold_cv(credit_data, v = 10)
model_spec <- discrim_quad() %>%
set_engine("MASS") %>%
set_mode("classification")
model_wf <- workflow() %>%
add_model(model_spec) %>%
add_formula(Status ~ .)
model_fit_rs <- model_wf %>%
fit_resamples(folds)
collect_metrics(model_fit_rs)
## # A tibble: 2 × 6
## .metric .estimator mean n std_err .config
## <chr> <chr> <dbl> <int> <dbl> <chr>
## 1 accuracy binary 0.759 10 0.00724 Preprocessor1_Model1
## 2 roc_auc binary 0.774 10 0.0122 Preprocessor1_Model1
37

ctruciosm.github.io — Carlos Trucíos (FACC/UFRJ)

Validation Set vs. Leave-One-Out vs. k-fold

38

ctruciosm.github.io — Carlos Trucíos (FACC/UFRJ)

Data-Tips:

  • Aqui temos focado em um exemplo de classificação, mas as mesmas ideias são utilizadas em problemas de regressão.
  • Existem várias métricas para avaliar a performance do modelo. Alguns post que achei interessantes são este e este outro
  • O pacote tidymodels fornece muitas opções interessantes para machine/statistical learning, vale a pena estudar mais um pouco.

Aprendam mais sobre como utilizar o tidymodels aqui

39

ctruciosm.github.io — Carlos Trucíos (FACC/UFRJ)

Motivação

  • No mundo ideal, gostaríamos treinar nosso modelo utilizando todo nosso conjunto de dados e avaliar sua performance com um novo dataset.
2
Paused

Help

Keyboard shortcuts

, , Pg Up, k Go to previous slide
, , Pg Dn, Space, j Go to next slide
Home Go to first slide
End Go to last slide
Number + Return Go to specific slide
b / m / f Toggle blackout / mirrored / fullscreen mode
c Clone slideshow
p Toggle presenter mode
t Restart the presentation timer
?, h Toggle this help
oTile View: Overview of Slides
sToggle scribble toolbox
Esc Back to slideshow