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 e 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!