Stationnarité et stabilité

Machine Learning for Time Series Data in Python

Chris Holdgraf

Fellow, Berkeley Institute for Data Science

Stationnarité

  • Une série temporelle stationnaire ne change pas de propriétés statistiques dans le temps
  • Ex. : moyenne, écart-type, tendances
  • La plupart des séries sont plus ou moins non stationnaires
Machine Learning for Time Series Data in Python

Machine Learning for Time Series Data in Python

Stabilité du modèle

  • Des données non stationnaires génèrent de la variabilité dans le modèle
  • Les propriétés statistiques trouvées peuvent changer avec les données
  • Nous serons aussi moins sûrs des bonnes valeurs des paramètres
  • Comment quantifier cela ?
Machine Learning for Time Series Data in Python

Validation croisée pour quantifier la stabilité des paramètres

  • Une approche : utiliser la validation croisée
  • Calculer les paramètres du modèle à chaque itération
  • Évaluer la stabilité des paramètres sur tous les plis de VC
Machine Learning for Time Series Data in Python

Bootstrap de la moyenne

  • Le bootstrap est une méthode courante pour évaluer la variabilité
  • Le bootstrap :
    1. Prendre un échantillon aléatoire avec remise
    2. Calculer la moyenne de l'échantillon
    3. Répéter de nombreuses fois (milliers)
    4. Calculer les percentiles du résultat (généralement 2,5 et 97,5)

Le résultat est un intervalle de confiance à 95 % de la moyenne de chaque coefficient.

Machine Learning for Time Series Data in Python

Bootstrap de la moyenne

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 for Time Series Data in Python

Tracer les coefficients bootstrapés

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 for Time Series Data in Python

Évaluer la stabilité des performances du modèle

  • Avec TimeSeriesSplit, vous pouvez tracer le score du modèle dans le temps
  • Utile pour repérer des périodes qui dégradent le score
  • Utile aussi pour détecter des signaux non stationnaires
Machine Learning for Time Series Data in Python

Performances du modèle dans le temps

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 for Time Series Data in Python

Visualiser les scores du modèle en série temporelle

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 for Time Series Data in Python

Visualiser les scores du modèle

Machine Learning for Time Series Data in Python

Fenêtres fixes avec validation croisée en série temporelle

# Only keep the last 100 datapoints in the training data
window = 100

# Initialize the CV with this window size
cv = TimeSeriesSplit(n_splits=10, max_train_size=window)
Machine Learning for Time Series Data in Python

Signaux non stationnaires

Machine Learning for Time Series Data in Python

Passons à la pratique !

Machine Learning for Time Series Data in Python

Preparing Video For Download...