Validation croisée de données temporelles

Machine Learning pour les données chronologiques en Python

Chris Holdgraf

Fellow, Berkeley Institute for Data Science

Validation croisée avec scikit-learn

# Itérer sur la méthode "split" retourne les indices entraînement/test
for tr, tt in cv.split(X, y):
    model.fit(X[tr], y[tr])
    model.score(X[tt], y[tt])
Machine Learning pour les données chronologiques en Python

Types de validation croisée : KFold

  • La validation croisée KFold divise vos données en plusieurs « plis » de taille égale
  • C'est l'une des méthodes de validation croisée les plus courantes

      from sklearn.model_selection import KFold
      cv = KFold(n_splits=5)
      for tr, tt in cv.split(X, y):
          ...
    
Machine Learning pour les données chronologiques en Python

Visualiser les prédictions du modèle

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

# Tracer les indices choisis pour la validation à chaque boucle
axs[0].scatter(tt, [0] * len(tt), marker='_', s=2, lw=40)
axs[0].set(ylim=[-.1, .1], title='Indices de l'ensemble de test (couleur=boucle de VC)', 
           xlabel='Indice des données brutes')

# Tracer les prédictions du modèle à chaque itération
axs[1].plot(model.predict(X[tt]))
axs[1].set(title='Prédictions de test à chaque boucle de VC', 
           xlabel='Indice de prédiction')
Machine Learning pour les données chronologiques en Python

Visualiser le comportement de KFold

Machine Learning pour les données chronologiques en Python

À propos du mélange des données

  • Plusieurs itérateurs de VC permettent de mélanger les données pendant la validation croisée.
  • Cela fonctionne seulement si les données sont i.i.d., ce qui est généralement faux pour les séries chronologiques.
  • Il ne faut pas mélanger vos données pour prédire avec des séries chronologiques.

      from sklearn.model_selection import ShuffleSplit
    
      cv = ShuffleSplit(n_splits=3)
      for tr, tt in cv.split(X, y):
          ...
    
Machine Learning pour les données chronologiques en Python

Visualiser le comportement avec mélange

Machine Learning pour les données chronologiques en Python

Utiliser l'itérateur de VC pour séries chronologiques

  • Jusqu'ici, nous avons brisé la progression linéaire du temps dans la validation croisée
  • En général, vous ne devez pas utiliser des points futurs pour prédire le passé
  • Approche : toujours entraîner sur le passé et prédire le futur
Machine Learning pour les données chronologiques en Python

Visualiser les itérateurs de VC pour séries chronologiques

# Importer et initialiser l'itérateur de validation croisée
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)):
    # Tracer les indices d'entraînement et de 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='Comportement de TimeSeriesSplit', 
           xlabel='indice des données', ylabel='Itération de VC')
    ax.legend([l1, l2], ['Entraînement', 'Validation'])
Machine Learning pour les données chronologiques en Python

Visualiser l'itérateur TimeSeriesSplit

Machine Learning pour les données chronologiques en Python

Fonctions d'évaluation personnalisées dans 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 pour les données chronologiques en Python

Une fonction de corrélation personnalisée pour scikit-learn

def my_pearsonr(est, X, y):
    # Générer des prédictions et convertir en vecteur 
    y_pred = est.predict(X).squeeze()

    # Utiliser la fonction numpy "corrcoef" pour calculer une matrice de corrélation
    my_corrcoef_matrix = np.corrcoef(y_pred, y.squeeze())

    # Retourner une seule valeur de corrélation de la matrice
    my_corrcoef = my_corrcoef[1, 0]
    return my_corrcoef
Machine Learning pour les données chronologiques en Python

Passons à la pratique !

Machine Learning pour les données chronologiques en Python

Preparing Video For Download...