Validação cruzada em dados de séries temporais

Machine Learning para dados de séries temporais em Python

Chris Holdgraf

Fellow, Berkeley Institute for Data Science

Validação cruzada com scikit-learn

# Iterar sobre o método "split" gera índices de treino/teste
for tr, tt in cv.split(X, y):
    model.fit(X[tr], y[tr])
    model.score(X[tt], y[tt])
Machine Learning para dados de séries temporais em Python

Tipos de validação cruzada: KFold

  • A validação cruzada KFold divide seus dados em vários "folds" de mesmo tamanho
  • É uma das rotinas de validação cruzada mais comuns

      from sklearn.model_selection import KFold
      cv = KFold(n_splits=5)
      for tr, tt in cv.split(X, y):
          ...
    
Machine Learning para dados de séries temporais em Python

Visualizando previsões do modelo

fig, axs = plt.subplots(2, 1)

# Plotar os índices escolhidos para validação em cada loop
axs[0].scatter(tt, [0] * len(tt), marker='_', s=2, lw=40)
axs[0].set(ylim=[-.1, .1], title='Índices do conjunto de teste (cor=loop da CV)', 
           xlabel='Índice dos dados brutos')

# Plotar as previsões do modelo em cada iteração
axs[1].plot(model.predict(X[tt]))
axs[1].set(title='Previsões no conjunto de teste em cada loop da CV', 
           xlabel='Índice da previsão')
Machine Learning para dados de séries temporais em Python

Visualizando o comportamento do KFold

Machine Learning para dados de séries temporais em Python

Um lembrete sobre embaralhar seus dados

  • Muitos iteradores de CV permitem embaralhar os dados como parte do processo.
  • Isso só funciona se os dados forem i.i.d., o que séries temporais geralmente não são.
  • Você não deve embaralhar dados ao fazer previsões com séries temporais.

      from sklearn.model_selection import ShuffleSplit
    
      cv = ShuffleSplit(n_splits=3)
      for tr, tt in cv.split(X, y):
          ...
    
Machine Learning para dados de séries temporais em Python

Visualizando o comportamento com embaralhamento

Machine Learning para dados de séries temporais em Python

Usando o iterador de CV para séries temporais

  • Até aqui, quebramos a passagem linear do tempo na validação cruzada
  • Porém, em geral não se deve usar pontos do futuro para prever o passado
  • Uma abordagem: sempre usar dados de treino do passado para prever o futuro
Machine Learning para dados de séries temporais em Python

Visualizando iteradores de validação cruzada para séries temporais

# Importar e inicializar o iterador de validação cruzada
from sklearn.model_selection import TimeSeriesSplit
cv = TimeSeriesSplit(n_splits=10)

fig, ax = plt.subplots(figsize=(10, 5))
for ii, (tr, tt) in enumerate(cv.split(X, y)):
    # Plotar índices de treino e teste
    l1 = ax.scatter(tr, [ii] * len(tr), c=[plt.cm.coolwarm(.1)], 
                    marker='_', lw=6)
    l2 = ax.scatter(tt, [ii] * len(tt), c=[plt.cm.coolwarm(.9)], 
                    marker='_', lw=6)
    ax.set(ylim=[10, -1], title='Comportamento do TimeSeriesSplit', 
           xlabel='índice dos dados', ylabel='iteração da CV')
    ax.legend([l1, l2], ['Treino', 'Validação'])
Machine Learning para dados de séries temporais em Python

Visualizando o iterador TimeSeriesSplit

Machine Learning para dados de séries temporais em Python

Funções de pontuação personalizadas no scikit-learn

def myfunction(estimator, X, y):
    y_pred = estimator.predict(X)
    my_custom_score = my_custom_function(y_pred, y)
    return my_custom_score
Machine Learning para dados de séries temporais em Python

Uma função de correlação personalizada para scikit-learn

def my_pearsonr(est, X, y):
    # Gerar previsões e converter para vetor 
    y_pred = est.predict(X).squeeze()

    # Usar a função "corrcoef" do numpy para calcular a matriz de correlação
    my_corrcoef_matrix = np.corrcoef(y_pred, y.squeeze())

    # Retornar um único valor de correlação da matriz
    my_corrcoef = my_corrcoef[1, 0]
    return my_corrcoef
Machine Learning para dados de séries temporais em Python

Vamos praticar!

Machine Learning para dados de séries temporais em Python

Preparing Video For Download...