Validarea încrucișată a datelor de tip serie temporală

Machine Learning pentru Date de Tip Șir de Timp în Python

Chris Holdgraf

Fellow, Berkeley Institute for Data Science

Validarea încrucișată cu scikit-learn

# Iterating over the "split" method yields train/test indices
for tr, tt in cv.split(X, y):
    model.fit(X[tr], y[tr])
    model.score(X[tt], y[tt])
Machine Learning pentru Date de Tip Șir de Timp în Python

Tipuri de CV: KFold

  • KFold împarte datele în mai multe "fold-uri" de dimensiuni egale
  • Este una dintre cele mai frecvente metode de validare încrucișată

      from sklearn.model_selection import KFold
      cv = KFold(n_splits=5)
      for tr, tt in cv.split(X, y):
          ...
    
Machine Learning pentru Date de Tip Șir de Timp în Python

Vizualizarea predicțiilor modelului

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

# Plot the indices chosen for validation on each loop
axs[0].scatter(tt, [0] * len(tt), marker='_', s=2, lw=40)
axs[0].set(ylim=[-.1, .1], title='Test set indices (color=CV loop)', 
           xlabel='Index of raw data')

# Plot the model predictions on each iteration
axs[1].plot(model.predict(X[tt]))
axs[1].set(title='Test set predictions on each CV loop', 
           xlabel='Prediction index')
Machine Learning pentru Date de Tip Șir de Timp în Python

Vizualizarea comportamentului CV KFold

Machine Learning pentru Date de Tip Șir de Timp în Python

Observație privind amestecarea datelor

  • Mulți iteratori CV permit amestecarea datelor în cadrul procesului de validare încrucișată.
  • Aceasta funcționează doar dacă datele sunt i.i.d., ceea ce seriile temporale de obicei nu sunt.
  • Nu ar trebui să amestecați datele când faceți predicții pe serii temporale.

      from sklearn.model_selection import ShuffleSplit
    
      cv = ShuffleSplit(n_splits=3)
      for tr, tt in cv.split(X, y):
          ...
    
Machine Learning pentru Date de Tip Șir de Timp în Python

Vizualizarea comportamentului CV cu amestecare

Machine Learning pentru Date de Tip Șir de Timp în Python

Utilizarea iteratorului CV pentru serii temporale

  • Până acum, am ignorat ordinea temporală în validarea încrucișată
  • În general, nu ar trebui să folosiți date din viitor pentru a prezice trecutul
  • O abordare: utilizați date de antrenament din trecut pentru a prezice viitorul
Machine Learning pentru Date de Tip Șir de Timp în Python

Vizualizarea iteratorilor CV pentru serii temporale

# Import and initialize the cross-validation iterator
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)):
    # Plot training and test indices
    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='TimeSeriesSplit behavior', 
           xlabel='data index', ylabel='CV iteration')
    ax.legend([l1, l2], ['Training', 'Validation'])
Machine Learning pentru Date de Tip Șir de Timp în Python

Vizualizarea iteratorului CV TimeSeriesSplit

Machine Learning pentru Date de Tip Șir de Timp în Python

Funcții de scoring personalizate în 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 pentru Date de Tip Șir de Timp în Python

O funcție de corelație personalizată pentru scikit-learn

def my_pearsonr(est, X, y):
    # Generate predictions and convert to a vector 
    y_pred = est.predict(X).squeeze()

    # Use the numpy "corrcoef" function to calculate a correlation matrix
    my_corrcoef_matrix = np.corrcoef(y_pred, y.squeeze())

    # Return a single correlation value from the matrix
    my_corrcoef = my_corrcoef[1, 0]
    return my_corrcoef
Machine Learning pentru Date de Tip Șir de Timp în Python

Să exersăm!

Machine Learning pentru Date de Tip Șir de Timp în Python

Preparing Video For Download...