Je travaille sur un problème de classification de série chronologique où l'entrée est des données d'utilisation vocale de série chronologique (en secondes) pour les 21 premiers jours d'un compte de téléphone portable. La variable cible correspondante est de savoir si ce compte a été annulé dans la fourchette de 35 à 45 jours. C'est donc un problème de classification binaire.
J'obtiens de très mauvais résultats de toutes les méthodes que j'ai essayées jusqu'à présent (à des degrés divers). J'ai d'abord essayé la classification k-NN (avec diverses modifications) et j'ai obtenu des résultats extrêmement mauvais. Cela m'a amené à extraire des caractéristiques de la série chronologique - c'est-à-dire la moyenne, la variance, le maximum, le minimum, le nombre total de jours zéro, le total de zéro jour, la différence entre la moyenne de la première moitié et la moyenne de la deuxième moitié, etc. et les caractéristiques les plus prédictives semblaient être totales zéros jours et total des jours de fin zéro (en utilisant plusieurs algorithmes de classification). Cela a donné les meilleurs résultats, mais les performances n'étaient toujours pas très bonnes.
Ma prochaine stratégie consistait à suréchantillonner les instances négatives de mon ensemble d'entraînement car il y en avait si peu. Cela a abouti à une prédiction d'annulation plus correcte mais au détriment de plus de faux positifs.
Je commence à penser que les données d'utilisation des séries temporelles elles-mêmes ne sont peut-être tout simplement pas très prédictives (bien que le bon sens dise qu'elles devraient l'être). Il y a peut-être une variable latente que je ne considère pas. L'examen des données montre également un comportement étrange. c'est-à-dire que certains exemples montrent une utilisation très faible ou décroissante (ou parfois aucune) et n'annulent pas, et certains montrent une augmentation de l'utilisation qui annule. Ce comportement contradictoire ne génère peut-être pas une frontière de décision très claire pour un classificateur.
Une autre source d'erreur possible est le fait que de nombreux exemples de formation sont très rares (c'est-à-dire de nombreux jours avec 0 utilisation). Une idée que je n'ai pas encore essayée est de diviser la série chronologique en segments et de générer certaines fonctionnalités de cette façon, mais je n'ai pas de grands espoirs.
la source
Réponses:
J'ai eu un assez bon succès en appliquant KNN avec la déformation Dynamic Time comme métrique de distance.
Ma recherche (pdf) suggère que cette approche est très difficile à battre. Le schéma ci-dessous provient de mon implémentation python de KNN et DTW sur github . Ou afficher dans le bloc-notes IPython
Si vous vous entraînez, l'ensemble de données est très volumineux, je suggère d'effectuer un regroupement hiérarchique de la matrice de distance. Puis échantillonnez à partir des grappes souhaitées pour produire votre plus petit ensemble de données de formation. Le
hclust
veillera à ce que vous avez des séries chronologiques qui représentent un large éventail de caractéristiques de séries temporelles dans vos données.la source
Les deux approches de la classification des séries chronologiques
Il existe deux façons de gérer les entrées structurées temporelles pour les tâches de classification:
J'ai également réussi à déployer KNN avec DTW avec succès dans le passé. Cependant, j'ai presque toujours réussi à battre sa précision avec un modèle qui utilise des fonctionnalités bien conçues. De plus, KNN avec DTW pour les classifications binaires échelles avec O (n_t · m_ {train} · m_ {test}) avec n_t étant la longueur de la série chronologique, mtrain et mtest étant le nombre d'appareils dans le train et l'ensemble de test, respectivement . Cela signifie que les calculs prennent assez de temps ..
Par conséquent, je recommanderais de poursuivre une approche basée sur les fonctionnalités.
tsfresh calcule un grand nombre de fonctionnalités
Le package python tsfresh calcule un grand nombre de ces fonctionnalités à partir d'un pandas.DataFrame contenant la série temporelle. Vous pouvez trouver sa documentation sur http://tsfresh.readthedocs.io .
Vous pouvez l'essayer pour calculer une énorme quantité de fonctionnalités. Plus tard, vous pouvez filtrer les caractéristiques selon leur importance et identifier les candidats prometteurs.
Avertissement: je suis l'un des auteurs de tsfresh.
la source