Introdução a Validação-Cruzada: K-Fold

Rodrigo Leite
5 min readOct 6, 2020

Conteúdo

  • 01 — Introdução a divisão de dados
  • 02 — O problema da divisão dos dados
  • 03 — Validação Cruzada: K-Fold
  • 04 — KFold na Prática

01 — Introdução a divisão de dados

Bem, é muito comum quando estamos iniciando com Data Science e Machine Learning dividirmos nosso conjunto de dados em dados de treino e teste.

A porcentagem mais comum é essa:

Vale lembrar que:

  • Os dados de treino são usado para treinar nosso modelo: Por exemplo, em uma Regressão Linear nós podemos criar uma reta de melhor ajuste para ver relação entre os dados.
  • E os dados de teste são utilizados para testar quão bom está aprendendo nosso modelo: Por exemplo, na Regressão Linear, ver quão bom está nossa reta de melhor ajuste e depois testar as relações.

NOTE:
Vale dar enfâse que os dados de treino e teste são escolhidos aleatóriamente. Por exemplo, se tivermos 100mil amostra para o nosso dataset:

  • 30mil vão ser escolhidas aleatóriamente para teste;
  • 70mil vão ser escolhidas aleatóriamente para treino.

02 — O problema da divisão dos dados

Agora pensem comigo… Se eu dividir o mesmo modelo novamente com a mesma porcentagem (%) para treino e teste e depois executar o meu modelo (com os dados de treino é claro), vou ter o mesmo resultado?

Claro que não!!!
Os dados são divididos aleatóriamente para treino e teste. Ou seja, os dados que antes eram utilizados para teste agora podem está sendo utilizados para treino e vice-versa.

Então, temos um probleminha… Como podemos resolver isso?

03 — Validação Cruzada: K-Fold

Bem, agora vamos aprender uma ténica bem básica de Validação-Cruzada conhecida por K-Fold.

Veja a imagem abaixo:

Essa técnica de Validação-Cruzada é conhecida de K-Fold pelo o seguinte fato:

  • K — Significa o número de subdivisões (iguais) que nós fizemos: No nosso caso K = 5;
  • Fold — Significa cada um dos blocos de cada K.

Veja essa outra imagem abaixo para ficar mais claro:

Ok, mas o que muda essa abordagem da que nós utilizavamos antes?
Bem, pensem comigo… Para cada subdivisão vamos utilizar dados diferentes para treino e teste. Ou seja, vamos ter resultados diferentes de acordo com cada iteração K do nosso modelo.

Veja uma abstração de resultados de para cada subdivisão:

Agora é só escolher o que melhor representa o nosso modelo.

NOTE:
Mas se pensarmos bem, uma maneira mais inteligente seria tirar a média de todos os nossos , algo parecido com isso:

Ótimo, então essa abordagem é perfeita não é?
Pensando bem, nós devemos ter sempre muita cuatela quando aplicarmos essa abordagem. Isso, porque dependendo do nosso dataset o custo computacional pode ser muito grande já que nós vamos treinar o mesmo modelo em várias subdivisões.

NOTE:
Outra observação muito importante é que a Validação-Cruzada: K-Fold não retorma um modelo (Por exemplo, Regressão Linear) pronto para nós utilizarmos. Ele retorna os scores de cada subdivisão, ou seja, quão performático cada uma é.

Isso é interessante para comparar a performance de vários modelos e ver qual é mais performático.

04 — KFold na Prática

Agora vamos praticar isso com Python e Scikit-Learn. Para isso vamos utilizar o dataset Graduate Admission 2:

OUTPUT:

K-Fold (R^2) Scores: [0.75872602 0.84426748 0.67785048 0.82651749 0.82568233]
Mean R^2 for Cross-Validation K-Fold: 0.7866087616458846

Ótimo, agora temos o nosso para K iterações com dados de treinos e teste aleatórios… Agora vem a pergunta:

Como eu posso criar uma função que veja a performance (R²) de vários modelos (Ex: Regressão) e escolha o melhor?

Será que isso é uma tarefa complexa? Vamos ver isso na prática:

OUTPUT:

Linear Regression Mean (R^2): 0.7897084153867848
Elastic Net Mean (R^2): 0.5203451094489794
Ridge Mean (R^2): 0.7771667506690682
Lasso Mean (R^2): 0.2569904339264844
The best model is: LinearRegression with value: 0.7897084153867848
Linear Regression Mean (R^2): 0.7866950600812153
Elastic Net Mean (R^2): 0.532657928647275
Ridge Mean (R^2): 0.7876746996784943
Lasso Mean (R^2): 0.25087272330850907
The best model is: Ridge with value: 0.7876746996784943
Linear Regression Mean (R^2): 0.7881860034693391
Elastic Net Mean (R^2): 0.5316122498998679
Ridge Mean (R^2): 0.7855190176462508
Lasso Mean (R^2): 0.2549741277785563
The best model is: LinearRegression with value: 0.788186003469339

NOTE:
Vejam que eu rodei a função 3 vezes e como os dados de treino são aleatórios o modelo mais perfomático acaba mudando de acordo com os dados que estão sendo utilizados.

Rodrigo Leite — Software Engineer

--

--

Rodrigo Leite

Machine Learning Engineer | Creating Things and Solving Problems