Maschinelles Lernen - Features Engineering aus Datums- / Zeitdaten


45

Was sind die gängigen / bewährten Methoden für den Umgang mit Zeitdaten für maschinelles Lernen?

Wenn sich beispielsweise in einem Datensatz eine Spalte mit einem Zeitstempel des Ereignisses befindet, z. B. "2014-05-05", wie können Sie nützliche Funktionen aus dieser Spalte extrahieren, falls vorhanden?

Danke im Voraus!

Antworten:


44

Ich würde damit beginnen, die Zeitvariable gegenüber anderen Variablen grafisch darzustellen und nach Trends zu suchen.

Zum Beispiel

Bildbeschreibung hier eingeben

In diesem Fall gibt es einen periodischen wöchentlichen Trend und einen langfristigen Aufwärtstrend. Sie möchten also zwei Zeitvariablen codieren:

  • day_of_week
  • absolute_time

Im Allgemeinen

Es gibt mehrere übliche Zeitrahmen, über die Trends auftreten:

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

Suchen Sie nach Trends in all diesen.

Seltsame Trends

Suchen Sie auch nach seltsamen Trends. Beispielsweise können Sie seltene, aber anhaltende zeitbasierte Trends sehen:

  • is_easter
  • is_superbowl
  • is_national_emergency
  • etc.

Diese erfordern häufig, dass Sie Ihre Daten mit einer externen Quelle in Querverweis setzen, die Ereignisse der Zeit zuordnet.

Warum Graph?

Ich halte Grafiken aus zwei Gründen für so wichtig.

  • Sonderbare Trends
    Während die allgemeinen Trends ziemlich einfach automatisiert werden können (fügen Sie sie einfach jedes Mal hinzu), erfordern seltsame Trends oft ein menschliches Auge und Wissen über die Welt, um sie zu finden. Dies ist ein Grund, warum die grafische Darstellung so wichtig ist.

  • Datenfehler
    Nur allzu oft weisen Daten schwerwiegende Fehler auf. Beispielsweise stellen Sie möglicherweise fest, dass die Daten in zwei Formaten codiert wurden und nur eins von ihnen korrekt in Ihrem Programm geladen worden ist. Es gibt eine Vielzahl solcher Probleme und sie sind überraschend häufig. Dies ist der andere Grund, warum ich die grafische Darstellung für wichtig halte, nicht nur für Zeitreihen, sondern für alle Daten.


7

Teilen Sie die Daten in Fenster auf und suchen Sie nach Merkmalen für diese Fenster wie Autokorrelationskoeffizienten, Wavelets usw. und verwenden Sie diese Merkmale zum Lernen.

Wenn Sie beispielsweise Temperatur- und Druckdaten haben, zerlegen Sie diese in einzelne Parameter und berechnen Sie Features wie die Anzahl der lokalen Minima in diesem und anderen Fenstern. Verwenden Sie diese Features für Ihr Modell.


7

Über alles hinaus, was Ben Haley gesagt hat, ist die Umstellung auf die Ortszeit des Benutzers zu berücksichtigen . Wenn Sie beispielsweise versuchen, etwas vorherzusagen, das für alle Benutzer gegen 20:00 Uhr auftritt, ist es schwieriger, eine Vorhersage für die UTC-Zeit zu treffen.


6

In einigen Fällen sind Daten und Ereignisse innerhalb einer Zeitreihe saisonabhängig. In solchen Fällen sind der Monat und das Jahr des Ereignisses von großer Bedeutung. Daher können Sie in solchen Szenarien binäre Variablen verwenden, um darzustellen, ob das Ereignis in einem bestimmten Monat / Jahr liegt oder nicht.

Hoffe das beantwortet deine Frage. Wenn nicht, geben Sie bitte etwas genauer an, was genau Sie erreichen möchten


4

Wie Ben und Nar ausführlich erklärt haben, würde das Aufteilen des Datums- / Uhrzeitobjekts in Bereiche aus Datums- und Uhrzeitteilen dazu beitragen, saisonale Trends zu erkennen, bei denen das vollständige (und in der Regel noch schlimmere - eindeutige) Datums- / Uhrzeitobjekt nicht erkannt wird

Sie erwähnen keine spezifischen Maschinenlernalgorithmus Sie daran interessiert sind, aber im Falle sind Sie auch mit abstandsbasierte Clustering, wie k-Mittel interessiert, würde ich verallgemeinern in die das Datum Zeitobjekt Unix-Zeitformat . Dies würde einen einfachen numerischen Entfernungsvergleich für den Algorithmus ermöglichen, der lediglich angibt, wie weit 2 Datumswerte sind.

In Ihrem Beispiel verallgemeinere ich den Wert 2014-05-05 auf 1399248000 (die Unix-Zeit, die den Beginn des 5. Mai 2014, UTC, darstellt).

[Man könnte argumentieren, dass Sie dies erreichen können, indem Sie die Datums- und Uhrzeitangaben in alle möglichen Datums- und Uhrzeitbereiche einfügen. Dies würde jedoch die Größe Ihres Datensatzes erheblich erhöhen. Daher würde ich vorschlagen, die Unix-Zeit für die Entfernungsmessung und einige der Datums- / Zeitbereiche zu kombinieren.]


3

Ben spricht über die statischen Funktionen und nutzt die Timestamp-Funktionen.

Als Erweiterung werde ich die Lag-Funktionen vorstellen , ich spreche nicht die rohen Zeitreihen, sondern die Aggregate darauf.

Der mystischste Teil ist, dass der zukünftige Wert für uns unsichtbar ist. Wie können wir diese aggregierten Merkmale in den Trainingsdaten verwenden?

Ein kleines Beispiel: Es gibt jährliche Stromverbrauchsdaten von 1991 bis 2015, ich möchte den Stromverbrauch in den kommenden 5 Jahren, 2016 bis 2020, vorhersagen. Ich werde den gleitenden Durchschnitt des Stromverbrauchs der letzten 5 Jahre als 2020-Merkmalswerte berechnen, aber Die Zeitspanne von 2016 bis 2020 ist für uns unbekannt. Daher führen wir (entgegengesetzt zur Verzögerung) die Zeitreihe 5 Jahre lang durch, lassen den gleitenden Durchschnitt von 2010 bis 2015 berechnen und verwenden diesen Wert dann als 2020-Merkmalswerte. So können wir die zukünftigen 5-Jahres-Feature-Daten erstellen.

Im nächsten Schritt müssen Sie nur die Verschiebefunktion (count \ mean \ median \ min \ max.etc) verwenden und verschiedene Fenster ausprobieren. Dann werden Sie viele Funktionen erstellen!


2

Je nachdem, woran Sie mit den Datums- / Uhrzeitinformationen interessiert sind, möchten Sie diese möglicherweise einfach ablegen. Wenn Sie z. B. an einer Entfernung von einem Startpunkt interessiert sind (z. B. 1. Januar 2015) und diese in Monaten messen möchten, würde ich sie einfach als Monat 1 (für den 1. bis 31. Januar 2015), 2 codieren (1-28.02.2015), 3, 4, 5, 6 usw. Da der Abstand zwischen den Startdaten ungefähr gleich ist, entspricht dies dem zeitlichen Abstand in einem unkomplizierten fortlaufenden Format. Und ich sage stetig, weil Sie Monat 6,5 sagen können und wissen, dass es Mitte Juni 2015 ist. Dann müssen Sie sich nicht um die tatsächliche Datumskodierung kümmern und können alle Ihre typischen Klassifizierungsmethoden anwenden.

Wenn Sie in Tagen messen möchten, weiß ich, dass MySql eine 'to_days'-Funktion hat, wenn Sie diese verwenden, um Daten vor der Klassifizierung abzurufen. Python hat wahrscheinlich etwas Ähnliches oder verwendet das von mork vorgeschlagene Unix-Zeitformat.

Hoffe das hilft!


1

Zeichnen Sie Diagramme mit unterschiedlichen Zeitvariationen in Abhängigkeit von der Ergebnisvariablen, um deren Auswirkungen zu ermitteln. Sie können Monat, Tag und Jahr als separate Funktionen verwenden. Da Monat eine kategoriale Variable ist, können Sie einen Box- / Whisker-Plot ausführen und feststellen, ob Muster vorhanden sind. Für numerische Variablen können Sie ein Streudiagramm verwenden.


1

Ich weiß nicht, ob dies eine gängige / bewährte Vorgehensweise ist, aber es ist eine andere Sichtweise der Sache.

Wenn Sie beispielsweise ein Datum haben, können Sie jedes Feld als "Kategorievariable" anstatt als "kontinuierliche Variable" behandeln. Der Tag hätte einen Wert in der Menge {1, 2 ..., 31}, der Monat hätte einen Wert in {1, ..., 12} und für das Jahr wählen Sie einen minimalen und einen maximalen Wert und baue ein Set.

Da die spezifischen numerischen Werte von Tagen, Monaten und Jahren möglicherweise nicht zum Auffinden von Trends in den Daten nützlich sind, verwenden Sie eine binäre Darstellung, um die numerischen Werte zu codieren, da jedes Bit ein Merkmal ist. Zum Beispiel wäre Monat 5 0 0 0 0 1 0 0 0 0 0 0 0(11 0 ist eine 1 an fünfter Stelle, wobei jedes Bit ein Merkmal ist).

Wenn also beispielsweise 10 Jahre im "Jahressatz" liegen, wird ein Datum in einen Vektor mit 43 Merkmalen (= 31 + 12 + 10) umgewandelt. Bei Verwendung von "spärlichen Vektoren" sollte die Anzahl der Features kein Problem darstellen.

Ähnliches könnte für Zeitdaten, Wochentag, Tag des Monats geschehen ...

Es hängt alles von der Frage ab, die Ihr maschinelles Lernmodell beantworten soll.


Dies erfasst keine Beziehungen, die wahrscheinlich existieren, wie zum Beispiel, dass der 14. und 15. des Monats "ähnlich" sind. In dem Maße, wie Sie glauben, dass jeder Tag buchstäblich anders ist, glauben Sie auch, dass eine Vorhersage über morgen nicht möglich ist. Es ist auch nicht erforderlich, Kategorials per Tastendruck zu codieren, nicht unbedingt.
Sean Owen

Ich kann nicht verstehen, warum es fehlschlägt, die "Nähe" von nahen Daten zu erfassen. Wenn Sie beispielsweise einen NN mit dem Binärvektor versorgen, wird dieser nach dem richtigen Training von selbst ermittelt. Die Verwendung von binären Vektoren ist nur eine Möglichkeit, Kategorien darzustellen.
Paco Barter

In diesem Fall verfügen Sie effektiv über Spalten wie "is_12th" und "is_13th", die im Eingaberaum nicht mit "is_1st" usw. in Beziehung stehen. Als fortlaufende Funktion wird korrekt erfasst, dass es sich um die Spalten 12th und 13th handelt in gewissem Sinne näher als 1. und 12. sind. Sie sprechen an, worauf ein Modell schließen könnte, aber ich spreche davon, was die Eingabefunktionen codieren.
Sean Owen

OK, ich verstehe. Sie haben Recht, ein Continuos-Feature erfasst die "Nähe" -Qualität von Daten besser. Mein Punkt ist, dass es möglicherweise Trends in den Daten gibt, für die die numerischen Werte von Daten irrelevant sind (zum Beispiel ein bestimmtes Muster des Kundeneinkaufs nur an Samstagen). Daraus ergibt sich eine andere Sichtweise für den Umgang mit Daten.
Paco Barter

Wie @PacoBarter bereits sagte, ignoriert One-Hot-Codierung den unterschiedlichen Abstand zwischen den Kategorien. Dies ist nicht so einfach zu handhaben, da diese Funktionen an sich Phaseninformationen sind, während die meisten Modelle für maschinelles Lernen keinen Phasentyp-Eingang haben. Einige DIY auf Distanz-Metriken könnten dies jedoch tun.
Plpopk

0

Kontext meiner Antwort : Bisher gab es großartige Antworten. Aber ich möchte das Gespräch erweitern, indem ich annehme, dass Sie über eine maschinelle Lernanwendung sprechen, um zukünftige Werte dieser bestimmten Zeitreihe vorherzusagen. In diesem Zusammenhang ist mein Rat unten.

Hinweis : Sehen Sie sich zunächst die herkömmlichen statistischen Prognosestrategien (z. B. Exponential Smoothing, SARIMAX oder Dynamic Regression) als Grundlage für die Prognoseleistung an. Obwohl maschinelles Lernen für eine Vielzahl von Anwendungen vielversprechend ist, gibt es für Zeitreihen bewährte statistische Methoden, die für Ihre Anwendung möglicherweise bessere Dienste leisten. Ich möchte Ihre Aufmerksamkeit auf zwei neue Artikel lenken:

  1. Prognosemethoden für Statistik und maschinelles Lernen: Bedenken und Möglichkeiten von Spyros Makridakis et al. In dem Artikel wird darauf hingewiesen, dass die traditionelle statistische Zeitreihenanalyse für viele Zeitreihen die Leistung von ML-Modellen (Machine Learning) übertrifft. Im Wesentlichen neigt ML zur Überanpassung, und alle Annahmen des ML-Modells in Bezug auf unabhängige Einträge werden verletzt.
  2. Einfache versus komplexe Vorhersage: Der Beweis von Kesten C Green et al. Der Artikel vergleicht und untersucht die Zeitreihenausgabe von Zeitreihenanalysen in begutachteten Zeitschriftenartikeln mit und ohne Vergleich mit einer Vielzahl von Modellen. Zusammenfassend lässt sich festhalten, dass Forscher ihre Analyse durch Modelle erschweren, die schwieriger zu interpretieren sind und eine schlechtere Leistung aufweisen. In der Regel liegt dies an schlechten Anreizstrukturen.

Wenn Sie nach einer guten Leistung suchen, wählen Sie eine Metrik, die mit mehreren Modellen verglichen werden soll (z. B. MASE), und durchsuchen Sie verschiedene statistische Modelle (siehe unten) und Modelle für maschinelles Lernen (mit den oben genannten Strategien zur Funktionsentwicklung).

Prost,

Ressourcen für das Erlernen statistischer Prognosen : Ich würde zunächst das kostenlose Lehrbuch von Rob J. Hyndman hier lesen: https://otexts.org/fpp2/ . Der Text basiert auf einem R-Paket, das Sie problemlos in Ihre Analyse einbinden können : https://otexts.org/fpp2/appendix-using-r.html . Beachten Sie abschließend den Unterschied zwischen der Querschnittsvalidierung und der Zeitreihenvalidierung, wie hier erläutert: https://robjhyndman.com/hyndsight/tscv/ .

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.