Convalidare dati di serie temporali

Machine Learning per dati di serie temporali in Python

Chris Holdgraf

Fellow, Berkeley Institute for Data Science

Cross validation con scikit-learn

# L'iterazione sul metodo "split" produce indici train/test
for tr, tt in cv.split(X, y):
    model.fit(X[tr], y[tr])
    model.score(X[tt], y[tt])
Machine Learning per dati di serie temporali in Python

Tipi di cross validation: KFold

  • La cross-validation KFold divide i dati in più "fold" di uguale dimensione
  • È una delle procedure di cross-validation più comuni

      from sklearn.model_selection import KFold
      cv = KFold(n_splits=5)
      for tr, tt in cv.split(X, y):
          ...
    
Machine Learning per dati di serie temporali in Python

Visualizzare le previsioni del modello

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

# Traccia gli indici scelti per la validazione in ogni ciclo
axs[0].scatter(tt, [0] * len(tt), marker='_', s=2, lw=40)
axs[0].set(ylim=[-.1, .1], title='Indici del test set (color=loop CV)', 
           xlabel='Indice dei dati grezzi')

# Traccia le previsioni del modello a ogni iterazione
axs[1].plot(model.predict(X[tt]))
axs[1].set(title='Previsioni sul test set in ogni loop di CV', 
           xlabel='Indice della previsione')
Machine Learning per dati di serie temporali in Python

Visualizzare il comportamento di KFold CV

Machine Learning per dati di serie temporali in Python

Una nota sullo shuffling dei dati

  • Molti iteratori di CV permettono di mescolare i dati durante la cross-validation.
  • Funziona solo se i dati sono i.i.d., cosa che le serie temporali di solito non sono.
  • Non dovresti mescolare i dati quando fai previsioni con serie temporali.

      from sklearn.model_selection import ShuffleSplit
    
      cv = ShuffleSplit(n_splits=3)
      for tr, tt in cv.split(X, y):
          ...
    
Machine Learning per dati di serie temporali in Python

Visualizzare il comportamento con shuffling

Machine Learning per dati di serie temporali in Python

Usare l'iteratore di CV per serie temporali

  • Finora abbiamo interrotto il passaggio lineare del tempo nella cross validation
  • In generale però non dovresti usare punti dati futuri per predire il passato
  • Un approccio: usa sempre dati di passato per predire il futuro
Machine Learning per dati di serie temporali in Python

Visualizzare gli iteratori di cross validation per serie temporali

# Importa e inizializza l'iteratore di cross-validation
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)):
    # Traccia indici di training e test
    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 di TimeSeriesSplit', 
           xlabel='indice dei dati', ylabel='iterazione CV')
    ax.legend([l1, l2], ['Training', 'Validazione'])
Machine Learning per dati di serie temporali in Python

Visualizzare l'iteratore TimeSeriesSplit per la cross validation

Machine Learning per dati di serie temporali in Python

Funzioni di scoring personalizzate in 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 per dati di serie temporali in Python

Una funzione di correlazione personalizzata per scikit-learn

def my_pearsonr(est, X, y):
    # Genera le previsioni e convertile in un vettore 
    y_pred = est.predict(X).squeeze()

    # Usa la funzione numpy "corrcoef" per calcolare una matrice di correlazione
    my_corrcoef_matrix = np.corrcoef(y_pred, y.squeeze())

    # Restituisci un singolo valore di correlazione dalla matrice
    my_corrcoef = my_corrcoef[1, 0]
    return my_corrcoef
Machine Learning per dati di serie temporali in Python

Esercitiamoci!

Machine Learning per dati di serie temporali in Python

Preparing Video For Download...