Conteúdo do Curso
Pré-processamento de Dados
Pré-processamento de Dados
Divisão Treino/Teste & Validação Cruzada
O último tópico sobre séries temporais será a preparação de dados para treinar e testar modelos de aprendizado de máquina: divisão treino/teste e validação cruzada.
Ao dividir os dados de séries temporais em conjuntos de treino e teste, é importante considerar o aspecto temporal dos dados. Diferentemente de outros tipos de conjuntos de dados, a amostragem aleatória para divisão não é apropriada para dados de séries temporais, pois isso pode levar a vazamento de dados e avaliação tendenciosa do desempenho do modelo.
O método mais comum para dividir dados de séries temporais é usar um ponto fixo no tempo como o ponto de divisão entre os conjuntos de treino e teste. O conjunto de treino inclui todas as observações antes do ponto de divisão, enquanto o conjunto de teste inclui todas as observações após o ponto de divisão.
Por exemplo, pode parecer assim:
import statsmodels.api as sm import pandas as pd # Load the dataset df = sm.datasets.get_rdataset('weather', 'nycflights13').data df['observation_time'] = pd.to_datetime(df.time_hour) df.drop(columns=['year', 'month', 'day', 'hour', 'time_hour'], inplace=True) print(df.head(10)) # Split data into training and test sets based on time train = df.loc[df['observation_time'] < '2013-08-01'] test = df.loc[df['observation_time'] >= '2013-08-01']
A validação cruzada funciona com a mesma ideia - dividir o conjunto de treinamento em duas partes (como antes) em cada iteração, lembrando que o conjunto de validação está sempre à frente do conjunto de treinamento. Na primeira iteração, treina-se o modelo candidato com os dados meteorológicos de janeiro a março e valida-se com os dados de abril, na iteração seguinte, treina-se com os dados de janeiro a abril e valida-se com os dados de maio, e assim por diante até o final do conjunto de treinamento. Existem, no total, 5 dessas iterações.
Vamos analisar o validador cruzado de séries temporais da biblioteca scikit-learn
:
from sklearn.model_selection import TimeSeriesSplit import statsmodels.api as sm import pandas as pd # Load the dataset df = sm.datasets.get_rdataset('weather', 'nycflights13').data df['observation_time'] = pd.to_datetime(df.time_hour) df.drop(columns=['year', 'month', 'day', 'hour', 'time_hour'], inplace=True) df.head() # Create TimeSeriesSplit model tscv = TimeSeriesSplit(n_splits=5) # Split train and test sets for i, (train_index, test_index) in enumerate(tscv.split(df)): print(f'Fold {i}:') print(f' Train: index={train_index}') print(f' Test: index={test_index}')
Obrigado pelo seu feedback!