Classifier les séries chronologiques en utilisant l’extraction des fonctionnalités

 Classifier les séries chronologiques en utilisant l’extraction des fonctionnalités

Lorsque vous souhaitez classer une série chronologique, il existe deux options. L’une consiste à utiliser une méthode spécifique à la série chronologique. Un exemple serait LSTM, ou un réseau de neurones récurrents en général. L’autre consiste à extraire des fonctionnalités de la série et à les utiliser avec un apprentissage supervisé normal. Dans cet article, nous examinons comment extraire automatiquement les fonctionnalités pertinentes avec un package Python appelé TSFresh.

Les ensembles de données que nous utilisons proviennent du Référentiel de classification des séries chronologiques. Le site fournit des informations sur la meilleure précision obtenue pour chaque ensemble de données. Il semble que nous obtenons des résultats proches de l’état de l’art, ou mieux, avec chaque ensemble de données que nous essayons.

Les séries chronologiques sont plus difficiles que les tâches standard, car par définition, les exemples ne sont pas indépendants (plus ils sont plus proches les uns des autres, plus ils sont codépendants). Pensez à la température. S’il fait 20 degrés Celsius aujourd’hui, il peut être 15 ou 25 demain, mais probablement pas 5 ou 35, même si ces températures peuvent se produire une autre période de l’année.

Cela signifie que nous ne pouvons pas utiliser un classificateur normal, car un classificateur normal suppose des exemples indépendants. De plus, la structure des données est plus profonde. En classification, un exemple n’est pas un seul point, c’est une série temporelle composée de plusieurs points (étapes). Chaque étape peut être composée de plusieurs attributs, par exemple la température, l’humidité et la vitesse du vent.

Cependant, nous pouvons réduire une série à un seul point en extrait les fonctionnalités. Par exemple, si nous avons affaire à une série chronologique de temps quotidien sur un mois, nous pourrions utiliser les fonctionnalités suivantes:

  • température minimale
  • température maximale
  • température moyenne
  • température médiane
  • variance des températures
  • humidité minimale
  • humidité maximale

Et, en fait, bien d’autres. Comme vous pouvez le deviner, les inventer et les implémenter peut être fastidieux. Heureusement, il y a un package Python appelé tsfreshqui extrait un caractéristiques de caractéristiques automatiquement.

On peut s’attendre à ce que la plupart d’entre eux ne soient pas pertinents, il est donc bon de sélectionner ceux qui ont un pouvoir prédictif. TSFRESH le fait également. Notez que cette étape utilise des étiquettes de classification, donc pour éviter la fuite d’étiquette, vous devez d’abord diviser l’ensemble de données en formation et validation et utiliser uniquement la partie de formation pour la sélection des fonctionnalités. Sinon, vos résultats de validation seraient trop optimistes.


Extraction et sélection des caractéristiques. Le serpent symbolise les données de séries chronologiques. Art par Michaelangelo inhoogleable.

Pour autant que nous comprenons, TSFresh utilise le test de signification par paire (fonctionnalité) pour la sélection. Cela pourrait poser un problème si la cible se trouve être déterminée uniquement par interaction des fonctionnalités et non par une fonction distincte.

En pratique

Nous avons attrapé trois des plus grands ensembles de données: Forda, Fordb et Wafer. Les séries chronologiques du référentiel semblent être unidimensionnelles (par exemple, la température ou l’humidité, mais pas les deux). Dans cette configuration, chaque série est une ligne dans le fichier CSV et les colonnes représentent les étapes de temps:

In (9): d.head()
Out(9):
       0       1        2        3
0  1.01430  1.0143  1.01430  1.01430
1 -0.88485 -1.0375 -0.97771 -1.01690
2  0.58040  0.5804  0.59777  0.59777
3 -0.88390 -1.0371 -0.97998 -1.01210
4  1.10500  1.2856  1.19630  1.25610

Par conséquent, nous devons remodeler les données:

d = d.stack()
d.index.rename(( 'id', 'time' ), inplace = True )
d = d.reset_index()

Pour obtenir le format Tsfresh:

In (11): d.head()
Out(11):
   id  time       0
0   0     0  1.0143
1   0     1  1.0143
2   0     2  1.0143
3   0     3  1.0143
4   0     4  1.0143

L’extraction et la sélection des caractéristiques sont assez à forte intensité de calcul, donc Tsfresh les fait dans parallèle. Le sous-produit de cela est qu’il faut écrire des programmes if __name__ == '__main__': Le style, sinon le multiprocesse, se détraque. Alternativement, on peut définir le n_jobs paramètre à 1.

Surtout l’étape d’extraction des fonctionnalités prend un long moment.

f = extract_features( d, column_id = "id", column_sort = "time" )
# Feature Extraction: 20it (22:33, 67.67s/it)

Certains des constructeurs de fonctionnalités sortent Nulls. Pour les traiter, TSFresh fournit la fonction Impute ().

impute( f )
assert f.isnull().sum().sum() == 0

Lors de la sélection, il y a un hyperparamètre à régler: fdr_level. Il est le pourcentage théorique attendu de fonctionnalités non pertinentes parmi toutes les fonctionnalités créées. Par défaut, il est réglé assez bas, à 5%. Tant que notre classificateur en aval est en mesure de gérer des fonctionnalités non informatives (et ce qui n’est pas?), Nous voulons peut-être augmenter le fdr_levelselon un certain nombre de fonctionnalités que nous obtenons de la sélection, à 0,5, ou 0,9 même. D’un autre côté, nous voulons que le rapport des exemples de fonctionnalités aussi élevé que possible pour obtenir la meilleure généralisation et éviter la malédiction de la dimensionnalité.

In (2): run select_features.py
loading data/wafer/features.csv
selecting features...
selected 247 features.
saving data/wafer/train.csv
saving data/wafer/test.csv


Caractéristiques sélectionnées, divisées en ensembles de train et de tests. Art de Nikolai Bartram.

Ensuite, nous sommes libres de s’entraîner et d’évaluer quelques classificateurs. La régression logistique exécutée sur les fonctionnalités à l’échelle fonctionne bien généralement.

Le code complet est disponible chez GitHub. Cela devrait fonctionner avec tous les ensembles de données (classification binaire) du référentiel de séries chronologiques, car ils sont tous dans le même format. Il suffit de supprimer les en-têtes ARFF des fichiers CSV après le téléchargement.



Source link

Related post