Separando a base treino e teste no R

Como a maioria aqui já sabe, quando temos um conjunto de dados para utilizar na construção de um modelo, precisamos fazer uma separação entre o que chamamos de treino teste. O que costumamos chamar de base treino, é o conjunto de dados que utilizaremos na construção do modelo. Isso vai desde as análises exploratórias iniciais até a regressão. Porém, para sabermos se o modelo não problemas como overfitting (ler Overfitting e Cross Validation e Explicando overfitting com uma anedota), precisamos testar o que foi rodado com a base treino, utilizando o que costumamos chamar de base teste.

No R, fazer essa separação é muito simples. Principalmente quando utilizamos o pacote CARET, provavelmente o mais utilizado em modelagem estatística. Vamos ver um exemplo de separação entre uma base teste contendo uma amostra que representa 70% da base total, e uma base treino contendo 30% da base total. Para praticar, vamos carregar os dados de WAGE do pacote ISLR. Veja no código abaixo como fazemos utilizando uma função chamada createDataPartition:

## carrega ISLR
install.packages("ISLR", dependencies = TRUE)
library("ISLR")

## visualizando dados de WAGE
head(Wage)

Como você pode ver, os dados são simples. Temos algumas informações dos indivíduos e seus respectivos salários. Um modelo bem usual para uma base dessas utilizaria as informações dos indivíduos para tentar predizer o salário. Portanto, nossa variável resposta será salário. O código abaixo, utiliza a função createDataPartition() para marcar quais linhas da base serão utilizadas na base treino. Feita esta marcação, pegamos a base original salário e chamamos de treino todas as linhas que foram “sorteadas” com a função createDataPartition(). As linhas não selecionadas, serão, obviamente, as da base treino:

## carregando o pacote CARET
install.packages("caret", dependencies = TRUE)
library(caret)

indice_treino = createDataPartition(y=Wage$wage, p=0.7, list=FALSE)
treino = Wage[indice_treino, ]
teste = Wage[-indice_treino, ]

Veja que a sintaxe é simples, você precisa se preocupar somente em inserir o campo de referência (a variável resposta do modelo) e a proporção da base que será utilizada como treino. É bom você saber que algumas pessoas costumam separar as bases numa proporção diferente, como 75-25 ou até mesmo 80-20. Há ganhos e perdas para cada situação. Para mim, 70-30 sempre atendeu às expectativas.

Tome cuidado com o que foi ensinado acima, pois isso não se aplica a séries temporais. Quando lidamos com tempo, a ordem vai importar. Sendo assim, você também pode utilizar uma função do CARET, a createTimeSlices(). A sintaxe é bem semelhante à do createDataPartition(), porém, vou exemplificar criando uma sequência de números de 1 a 10000:

serie_tempo = 1:1000
bases = createTimeSlices(y=serie_tempo, initialWindow = 20, horizon=10)

As poucas diferenças encontradas estão nos argumentos initialWindow, que indica o tamanho da sequência utilizada no treino e horizon, que indica o tamanho da sequência utilizada no teste. O legal deste exemplo, é que ele já cria bases treino e teste:

# verifica primeira base treino
bases$treino[[1]]

# verifica primeira base teste
bases$teste[[1]]

Note que a numeração do treino é seguida pela do teste. Como eu disse, para bases em que o tempo importa, a separação deve ser feita de forma ordenada.

Agora você já pode ficar mais aliviado ao fazer os modelos, pois o risco de overfitting será muito menor. Dúvidas, elogios ou sugestões, basta comentar o post ou me escrever.

Bons estudos!

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *