J’ai récemment été amené à travailler sur un projet qui avait pour but d’étudier des données remontées par des capteurs. Il s’agissait d’un projet d’IoT et j’ai eu besoin de faire du clustering sur les valeurs remontées par les capteurs, qui sont en fait des séries temporelles. J’ai donc décidé d’appliquer un algorithme de clustering classique comme le k-means (algorithme des k-moyennes). Mais très vite la question de distance et d’aggrégation entre séries s’est posée. Quelle distance utilisée pour déterminer l’écart entre deux séries temporelles ?
Dans cet article, nous verrons quelles sont les possibilités en terme de distances entre séries temporelles. Et nous ferons un exemple d’application du k-means avec la bibliothèque Python tslearn.
Différents types de distances entre deux séries
La p-norme
Quand p=1
il s’agit d’une distance de Manhattan et quand p=2
il s’agit d’une distance euclidienne.
Dynamic Time Warping (DTW)
On peut calculer le DTW grâce à la formule suivante récursive :
Quelle distance choisir ?
Nous nous arrêterons à ces deux distances pour cet article. Cependant, il en existe beaucoup d’autres (on peut même en créer s’il y a un besoin particulier).
K-means avec tslearn
Dans cette section, je vous propose un exemple de clustering de séries temporelles que l’on va réaliser grâce à la bibliothèque tslearn. Cette bibliothèque propose une collection de modèles de machine learning applicables aux séries temporelles. Il est basé sur Scikit-Learn, Scipy et Numpy.
Vous pouvez voir les détails de l’algorithme k-means dans cet article. Pour les séries temporelles, l’algorithme reste le même sauf qu’il faut adapter la distance. Pour notre exemple, nous utiliserons le DTW.
import numpy as np
import matplotlib.pyplot as plt
# On génère des séries temporelles
a = np.random.rand(100)
b = 2*a + 0.2
a = 2*a
c = np.random.rand(100)
d = 1.1*c + 1
plt.plot(np.arange(100),a, c='blue')
plt.plot(np.arange(100),b, c='green')
plt.plot(np.arange(100),c, c='red')
plt.plot(np.arange(100),d, c='orange')
On va vérifier qu’on retrouve bien les clusters générés (a et b => cluster 0 et c et d => cluster 1) en appliquant k-means à nos séries.
from tslearn.clustering import TimeSeriesKMeans
# On choisit la distance DTW et on fixe 'k' à 2
model = TimeSeriesKMeans(n_clusters=2, metric="dtw")
prediction = model.fit_predict([a, b, c, d])
print(prediction)
array([0, 0, 1, 1])
On retrouve bien nos clusters!
Évidemment, dans la vraie vie les clusters ne sont pas si facile à déterminer. Mais vous avez compris le principe… Dans la pratique, il est important de passer le temps nécessaire sur l’exploration de vos séries notamment grâce à des éléments visuels. La bibliothèque tslearn facilite énormément la vie lorsqu’on travaille avec des séries temporelles.
Conclusion
Dans cet article, nous nous sommes intéressés au clustering des séries temporelles. Nous avons par la même occasion découvert le package tslearn avec un exemple d’application du k-means pour les séries temporelles.
J’espère que cet article vous a plu. N’hésitez pas à laisser des commentaires :-).
Merci 🙂