Apprentissage automatique - fonctions d'ingénierie à partir de données de date / heure

45

Quelles sont les pratiques courantes / meilleures pour gérer les données de temps pour une application d'apprentissage automatique?

Par exemple, si dans le jeu de données, il existe une colonne avec l'horodatage de l'événement, telle que "2014-05-05", comment extraire des fonctionnalités utiles de cette colonne, le cas échéant?

Merci d'avance!

Igor Bobriakov
la source

Réponses:

44

Je commencerais par représenter graphiquement la variable de temps par rapport aux autres variables et en recherchant les tendances.

Par exemple

entrez la description de l'image ici

Dans ce cas, il existe une tendance hebdomadaire périodique et une tendance à la hausse à long terme. Donc, vous voudriez encoder deux variables de temps:

  • day_of_week
  • absolute_time

En général

Les tendances se dégagent de plusieurs temps courants:

  • absolute_time
  • day_of_year
  • day_of_week
  • month_of_year
  • hour_of_day
  • minute_of_hour

Recherchez les tendances dans tout cela.

Tendances étranges

Rechercher des tendances étranges aussi. Par exemple, vous pouvez voir des tendances temporelles rares mais persistantes:

  • is_easter
  • is_superbowl
  • is_national_emergency
  • etc.

Celles-ci exigent souvent que vous référenciez vos données avec une source externe qui mappe les événements dans le temps.

Pourquoi graphique?

Je pense que le graphisme est si important pour deux raisons.

  • Tendances étranges
    Si les tendances générales peuvent être automatisées assez facilement (il suffit de les ajouter à chaque fois), les tendances étranges nécessiteront souvent un œil humain et une connaissance du monde à découvrir. C'est l'une des raisons pour lesquelles le graphique est si important.

  • Erreurs de données
    Trop souvent, les données contiennent de graves erreurs. Par exemple, vous pouvez constater que les dates ont été codées dans deux formats et qu'un seul d'entre eux a été correctement chargé dans votre programme. Il existe une myriade de problèmes de ce type et ils sont étonnamment courants. C’est l’autre raison pour laquelle je pense que les graphiques sont importants, pas seulement pour les séries chronologiques, mais pour toutes les données.

Ben Haley
la source
7

Divisez les données en fenêtres et recherchez des fonctionnalités pour ces fenêtres telles que des coefficients d'autocorrélation, des ondelettes, etc., et utilisez-les pour apprendre.

Par exemple, si vous avez des données de température et de pression, décomposez-les en paramètres individuels, calculez des caractéristiques telles que le nombre de minimums locaux dans cette fenêtre et autres, et utilisez-les pour votre modèle.

Gurpreet Mohaar
la source
7

Une dernière chose à considérer, au-delà de tout ce que Ben Haley a dit, est de convertir en heure locale d'utilisateur . Par exemple, si vous essayez de prédire quelque chose qui se produit vers 20 heures pour tous les utilisateurs, si vous regardez l'heure UTC, il sera plus difficile de prévoir.

Amir
la source
6

Dans plusieurs cas, les données et les événements d'une série chronologique sont saisonniers. Dans ce cas, le mois et l'année de l'événement comptent beaucoup. Par conséquent, dans de tels scénarios, vous pouvez utiliser des variables binaires pour représenter si l'événement se produit au cours d'un mois / année donné ou non.

J'espère que ça répond à ta question. Si ce n’est pas avec bonté, soyez un peu plus précis sur ce que vous essayez exactement de réaliser

show_stopper
la source
4

Comme Ben et Nar l'ont bien expliqué, diviser l'objet date-heure en plusieurs parties permettrait de détecter les tendances saisonnières, où l'objet date-heure complet (et même pire - unique) le manquerait.

Vous n'avez pas mentionné d'algorithme d'apprentissage machine spécifique qui vous intéresse, mais au cas où vous seriez également intéressé par la mise en cluster basée sur la distance, telle que k-means, généraliserait l'objet date-heure au format unix-time. . Cela permettrait une comparaison numérique simple de distance pour l'algorithme, indiquant simplement jusqu'à quel point 2 valeurs de date sont.

Dans votre exemple, je généraliserais la valeur du jour uniquement 2014-05-05 à 1399248000 (l'heure unix représentant le début du 5 mai 2014, UTC).

[On pourrait soutenir que vous pouvez atteindre cet objectif en répartissant la date-heure dans chaque partie date-heure possible .. mais cela augmenterait considérablement les dimensions de votre jeu de données. Donc, je suggérerais de combiner le temps unix, pour la mesure de la distance, et certains des compartiments date-heure]

mork
la source
3

Ben parle des fonctionnalités statiques et utilise les fonctionnalités d'horodatage.

En guise de prolongement, je présenterai les caractéristiques de décalage , je ne parle pas de la série chronologique brute, mais des agrégats qu'elle contient .

La partie la plus mystique est que la valeur future est invisible pour nous, comment pouvons-nous utiliser ces fonctionnalités agrégées dans les données de formation?

Un petit exemple: il existe des données sur la consommation électrique annuelle de 1991 à 2015; je veux prédire la consommation électrique dans les 5 années à venir, de 2016 à 2020. Je vais calculer la moyenne mobile de la consommation électrique des 5 dernières années en tant que valeurs caractéristiques de 2020, mais Nous ne connaissons pas la période 2016 à 2020, nous avons donc dirigé (de manière décalée) la série chronologique sur 5 ans, passons à la moyenne mobile de 2010 à 2015, puis utilisons cette valeur comme valeur de caractéristique de 2020. Nous pouvons donc construire les données sur les caractéristiques des 5 années à venir.

La prochaine étape consiste simplement à utiliser la fonction de déplacement (compter \ mean \ median \ min \ max.etc) et à essayer différentes fenêtres, puis vous construirez de nombreuses fonctionnalités!

loup
la source
2

En fonction de ce qui vous intéresse avec les informations de date / heure, vous voudrez peut-être simplement les supprimer. Par exemple, si vous êtes intéressé par la distance par rapport à un point de départ (par exemple, le 1er janvier 2015) et que vous souhaitez le mesurer en mois, je le coderais comme le premier mois (du 1er au 31 janvier 2015), 2 (1er au 28 février 2015), 3, 4, 5, 6, etc. Comme la distance entre les dates de début est approximativement la même, cela représente la distance de temps dans un format continu simple. Et je dis continu parce que vous pouvez dire le mois 6,5 et savoir que nous sommes au milieu de juin 2015. Vous n'avez donc pas à vous soucier du codage de date réel et vous pouvez utiliser toutes vos méthodes de classification habituelles.

Si vous voulez mesurer en jours, je sais que MySql a une fonction 'to_days', si vous l'utilisez pour extraire des données avant la classification. Python a probablement quelque chose de similaire, ou utilisez le format unix suggéré par mork.

J'espère que cela t'aides!

pmp
la source
1

Tracez des graphiques avec différentes variations de temps par rapport à la variable de résultat pour voir son impact. Vous pouvez utiliser mois, jour, année en tant que fonctions distinctes et, puisque le mois est une variable catégorique, vous pouvez essayer un diagramme boîte / moustaches et voir s’il existe des modèles. Pour les variables numériques, vous pouvez utiliser un nuage de points.

RAM
la source
1

Je ne sais pas s'il s'agit d'une pratique courante ou d'une meilleure pratique, mais c'est un autre point de vue.

Si vous avez, par exemple, une date, vous pouvez traiter chaque champ comme une "variable de catégorie" au lieu de "variable continue". Le jour aurait une valeur dans l'ensemble {1, 2 ..., 31}, le mois aurait une valeur dans {1, ..., 12} et, pour l'année, vous choisiriez une valeur minimale et une valeur maximale. et construire un ensemble.

Ensuite, comme les valeurs numériques spécifiques des jours, des mois et des années peuvent ne pas être utiles pour rechercher des tendances dans les données, utilisez une représentation binaire pour coder les valeurs numériques, chaque bit constituant une entité. Par exemple, le mois 5 serait 0 0 0 0 1 0 0 0 0 0 0 0(11 0 un 1 en 5ème position, chaque bit étant une caractéristique).

Ainsi, ayant, par exemple, 10 ans dans "l'ensemble de l'année", une date serait transformée en un vecteur de 43 caractéristiques (= 31 + 12 + 10). En utilisant des "vecteurs clairsemés", la quantité de fonctionnalités ne devrait pas être un problème.

Quelque chose de similaire pourrait être fait pour les données temporelles, le jour de la semaine, le jour du mois ...

Tout dépend de la question à laquelle votre modèle d’apprentissage automatique doit répondre.

Paco Barter
la source
Cela ne permet pas de capturer les relations qui existent probablement, par exemple que le 14 et le 15 du mois sont «similaires». Dans la mesure où vous croyez que chaque jour est littéralement différent, vous estimez également qu'il est impossible de prédire l'avenir. Il n'est pas non plus nécessaire de coder à chaud, pas nécessairement.
Sean Owen
Je ne vois pas pourquoi cela échouait à capturer la "proximité" de dates proches. Si, par exemple, vous transmettez le vecteur binaire à un NN, il le détectera lui-même après une formation appropriée. L'utilisation de vecteurs binaires n'est qu'un moyen de représenter des catégories.
Paco Barter
Dans ce cas, vous avez effectivement des colonnes telles que "is_12th" et "is_13th" qui sont, dans l'espace d'entrée, sans relation et sans relation avec "is_1st", etc. dans un sens plus proche que 1er et 12ème sont. Vous faites appel à ce qu'un modèle pourrait déduire, mais je parle de ce que les entités en entrée codent.
Sean Owen
OK je vois. Vous avez raison, une fonctionnalité continue reflète mieux la qualité de la "proximité" des dates. Mon point est qu'il peut y avoir des tendances dans les données pour lesquelles les valeurs numériques des dates ne sont pas pertinentes (par exemple, un certain modèle d'achat de clients uniquement le samedi). D'où un autre point de vue pour traiter les dates.
Paco Barter
Comme @PacoBarter l’a dit, le codage à une seule étape ne tient pas compte de la différence de distance entre les catégories. Cela n’est pas aussi facile à résoudre car ces fonctionnalités sont intrinsèquement des informations de phase, alors que la plupart des modèles d’apprentissage automatique n’ont pas d’entrée de type phase. Certains bricolages sur les métriques de distance pourraient faire cependant.
Plpopk
0

Contexte de ma réponse : Il y a eu d'excellentes réponses jusqu'à présent. Mais je veux prolonger la conversation en supposant que vous parlez d'une application d'apprentissage automatique pour prédire les valeurs futures de cette série temporelle particulière. Dans ce contexte, mon conseil est le suivant.

Conseil : Commencez par examiner les stratégies de prévision statistique traditionnelles (à savoir, le lissage exponentiel, SARIMAX ou la régression dynamique) comme base de référence pour la performance de prévision. Bien que l’apprentissage automatique ait été très prometteur pour une variété d’applications, il existe, pour les séries chronologiques, des méthodes statistiques éprouvées qui peuvent mieux vous servir. Je voudrais attirer votre attention sur deux articles récents:

  1. Méthodes de prévision statistique et d'apprentissage automatique: préoccupations et pistes à suivre par Spyros Makridakis et al. L'article souligne que, pour de nombreuses séries chronologiques, les analyses chronologiques statistiques traditionnelles sont plus performantes que les modèles d'apprentissage automatique (ML). Essentiellement, le BC a tendance à surajuster et toutes les hypothèses du modèle de ML concernant les entrées indépendantes sont violées.
  2. Prévision simple ou complexe: les preuves de Kesten C Green et al. L'article compare et examine les résultats des séries chronologiques des analyses de séries chronologiques d'articles de revues à comité de lecture avec et sans comparaisons avec divers modèles. En conclusion, les chercheurs compliquent leur analyse avec des modèles plus difficiles à interpréter et moins performants. Cela se produit généralement à cause de mauvaises structures d'incitation.

Si vous recherchez de bonnes performances, choisissez une métrique à comparer à plusieurs modèles (comme MASE) et parcourez plusieurs modèles statistiques (références ci-dessous) et d’apprentissage automatique (avec les stratégies de développement d’éléments mentionnées ci-dessus).

À votre santé,

Ressources pour l'apprentissage de la prévision statistique : Je commencerais par passer en revue le manuel gratuit de Rob J Hyndman ici: https://otexts.org/fpp2/ . Le texte est basé sur un package R que vous pouvez facilement intégrer à votre analyse: https://otexts.org/fpp2/appendix-using-r.html . Enfin, veuillez noter la différence entre la validation transversale transversale et la validation transversale des séries chronologiques, comme expliqué ici: https://robjhyndman.com/hyndsight/tscv/ .

Jranisau
la source