Stazionarietà e stabilità

Machine Learning per dati di serie temporali in Python

Chris Holdgraf

Fellow, Berkeley Institute for Data Science

Stazionarietà

  • Le serie temporali stazionarie non cambiano le loro proprietà statistiche nel tempo
  • Es.: media, deviazione standard, trend
  • La maggior parte delle serie è in qualche misura non stazionaria
Machine Learning per dati di serie temporali in Python

Machine Learning per dati di serie temporali in Python

Stabilità del modello

  • Dati non stazionari portano a variabilità nel modello
  • Le proprietà statistiche trovate dal modello possono cambiare coi dati
  • Inoltre, avremo meno certezza sui valori corretti dei parametri
  • Come quantificarlo?
Machine Learning per dati di serie temporali in Python

Cross-validation per quantificare la stabilità dei parametri

  • Un approccio: usare la cross-validation
  • Calcola i parametri del modello a ogni iterazione
  • Valuta la stabilità dei parametri su tutti gli split di CV
Machine Learning per dati di serie temporali in Python

Bootstrapping della media

  • Il bootstrapping è un modo comune per valutare la variabilità
  • Il bootstrap:
    1. Prendi un campione casuale di dati con reinserimento
    2. Calcola la media del campione
    3. Ripeti molte volte (migliaia)
    4. Calcola i percentili del risultato (di solito 2,5 e 97,5)

Il risultato è un intervallo di confidenza al 95% della media di ciascun coefficiente.

Machine Learning per dati di serie temporali in Python

Bootstrapping della media

from sklearn.utils import resample

# cv_coefficients has shape (n_cv_folds, n_coefficients)
n_boots = 100
bootstrap_means = np.zeros(n_boots, n_coefficients)
for ii in range(n_boots):
    # Generate random indices for our data with replacement, 
    # then take the sample mean
    random_sample = resample(cv_coefficients)
    bootstrap_means[ii] = random_sample.mean(axis=0)

# Compute the percentiles of choice for the bootstrapped means
percentiles = np.percentile(bootstrap_means, (2.5, 97.5), axis=0)
Machine Learning per dati di serie temporali in Python

Grafico dei coefficienti bootstrappati

fig, ax = plt.subplots()
ax.scatter(many_shifts.columns, percentiles[0], marker='_', s=200)
ax.scatter(many_shifts.columns, percentiles[1], marker='_', s=200)

Machine Learning per dati di serie temporali in Python

Valutare la stabilità delle prestazioni del modello

  • Con TimeSeriesSplit puoi disegnare lo score del modello nel tempo
  • Utile per trovare periodi che peggiorano lo score
  • Utile anche per individuare segnali non stazionari
Machine Learning per dati di serie temporali in Python

Prestazioni del modello nel tempo

def my_corrcoef(est, X, y):
    """Return the correlation coefficient 
    between model predictions and a validation set."""
    return np.corrcoef(y, est.predict(X))[1, 0]

# Grab the date of the first index of each validation set
first_indices = [data.index[tt[0]] for tr, tt in cv.split(X, y)]

# Calculate the CV scores and convert to a Pandas Series
cv_scores = cross_val_score(model, X, y, cv=cv, scoring=my_corrcoef)
cv_scores = pd.Series(cv_scores, index=first_indices)
Machine Learning per dati di serie temporali in Python

Visualizzare gli score del modello come serie temporale

fig, axs = plt.subplots(2, 1, figsize=(10, 5), sharex=True)

# Calculate a rolling mean of scores over time
cv_scores_mean = cv_scores.rolling(10, min_periods=1).mean()
cv_scores.plot(ax=axs[0])
axs[0].set(title='Validation scores (correlation)', ylim=[0, 1])

# Plot the raw data
data.plot(ax=axs[1])
axs[1].set(title='Validation data')
Machine Learning per dati di serie temporali in Python

Visualizzare gli score del modello

Machine Learning per dati di serie temporali in Python

Finestre fisse con cross-validation per serie temporali

# Tieni solo gli ultimi 100 punti nei dati di training
window = 100

# Inizializza la CV con questa dimensione della finestra
cv = TimeSeriesSplit(n_splits=10, max_train_size=window)
Machine Learning per dati di serie temporali in Python

Segnali non stazionari

Machine Learning per dati di serie temporali in Python

Esercitiamoci!

Machine Learning per dati di serie temporali in Python

Preparing Video For Download...