Univariates Zeitreihenmodell auf Millionen von Zeitreihen skalieren


In dieser Anleitung lernen Sie, wie Sie das Training einer Reihe von Zeitachsenmodellen erheblich beschleunigen können, um mehrere Zeitachsenvorhersagen mit einer einzigen Abfrage durchzuführen. Außerdem erfahren Sie, wie Sie die Prognosegenauigkeit bewerten.

In dieser Anleitung erfahren Sie, wie Sie das Training eines univariaten Zeitreihenmodells für die Prognose erheblich beschleunigen.

In dieser Anleitung werden Prognosen für mehrere Zeitreihen erstellt. Die prognostizierten Werte werden für jeden Zeitpunkt und für jeden Wert in einer oder mehreren angegebenen Spalten berechnet. Wenn Sie beispielsweise das Wetter vorhersagen möchten und eine Spalte mit Daten zu Städten angeben, enthalten die prognostizierten Daten Vorhersagen für alle Zeitpunkte für Stadt A, dann Vorhersagewerte für alle Zeitpunkte für Stadt B usw.

In dieser Anleitung werden Daten aus den öffentlichen Tabellen bigquery-public-data.new_york.citibike_trips und iowa_liquor_sales.sales verwendet. Die Daten zu Fahrradfahrten enthalten nur einige hundert Zeitreihen. Sie werden daher verwendet, um verschiedene Strategien zur Beschleunigung des Modelltrainings zu veranschaulichen. Die Daten zu Spirituosenverkäufen umfassen mehr als eine Million Zeitreihen. Daher werden sie verwendet, um Zeitreihenprognosen im großen Maßstab zu zeigen.

Bevor Sie diese Anleitung lesen, sollten Sie Prognosen für mehrere Zeitreihen mit einem univariaten Modell erstellen und Best Practices für umfangreiche Zeitachsenprognosen lesen.

Lernziele

In dieser Anleitung verwenden Sie Folgendes:

Der Einfachheit halber wird in dieser Anleitung nicht behandelt, wie Sie mit den Funktionen ML.FORECAST oder ML.EXPLAIN_FORECAST Prognosen erstellen. Weitere Informationen zur Verwendung dieser Funktionen finden Sie unter Prognosen für mehrere Zeitreihen mit einem univariaten Modell erstellen.

Kosten

In dieser Anleitung werden kostenpflichtige Komponenten von Google Cloud verwendet, darunter:

  • BigQuery
  • BigQuery ML

Weitere Informationen zu Kosten finden Sie auf den Seiten BigQuery-Preise und Preise für BigQuery ML.

Vorbereitung

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  5. Make sure that billing is enabled for your Google Cloud project.

  6. BigQuery ist in neuen Projekten automatisch aktiviert. Zum Aktivieren von BigQuery in einem vorhandenen Projekt wechseln Sie zu

    Enable the BigQuery API.

    Enable the API

    .

Erforderliche Berechtigungen

  • Sie benötigen die IAM-Berechtigung bigquery.datasets.create, um das Dataset zu erstellen.
  • Zum Erstellen der Verbindungsressource benötigen Sie die folgenden Berechtigungen:

    • bigquery.connections.create
    • bigquery.connections.get
  • Zum Erstellen des Modells benötigen Sie die folgenden Berechtigungen:

    • bigquery.jobs.create
    • bigquery.models.create
    • bigquery.models.getData
    • bigquery.models.updateData
    • bigquery.connections.delegate
  • Zum Ausführen von Inferenzen benötigen Sie die folgenden Berechtigungen:

    • bigquery.models.getData
    • bigquery.jobs.create

Weitere Informationen zu IAM-Rollen und Berechtigungen in BigQuery finden Sie unter Einführung in IAM.

Dataset erstellen

Erstellen Sie ein BigQuery-Dataset, um Ihr ML-Modell zu speichern:

  1. Rufen Sie in der Google Cloud Console die Seite „BigQuery“ auf.

    Zur Seite „BigQuery“

  2. Klicken Sie im Bereich Explorer auf den Namen Ihres Projekts.

  3. Klicken Sie auf Aktionen ansehen > Dataset erstellen.

    Dataset erstellen

  4. Führen Sie auf der Seite Dataset erstellen die folgenden Schritte aus:

    • Geben Sie unter Dataset-ID bqml_tutorial ein.

    • Wählen Sie als Standorttyp die Option Mehrere Regionen und dann USA (mehrere Regionen in den USA) aus.

      Die öffentlichen Datasets sind am multiregionalen Standort US gespeichert. Der Einfachheit halber sollten Sie Ihr Dataset am selben Standort speichern.

    • Übernehmen Sie die verbleibenden Standardeinstellungen unverändert und klicken Sie auf Dataset erstellen.

      Seite "Dataset erstellen"

Tabelle mit Eingabedaten erstellen

Die SELECT-Anweisung der folgenden Abfrage verwendet die EXTRACT-Funktion, um die Datumsinformationen aus der Spalte starttime zu extrahieren. Die Abfrage verwendet die COUNT(*)-Klausel, um die Gesamtzahl der Citi Bike-Touren pro Tag abzurufen.

table_1 hat 679 Zeitachsen. Die Abfrage verwendet eine zusätzliche INNER JOIN-Logik, um alle Zeitachsen auszuwählen, die mehr als 400 Zeitpunkte haben, was insgesamt 383 Zeitachsen ergibt.

So erstellen Sie die Tabelle mit den Eingabedaten:

  1. Öffnen Sie in der Google Cloud Console die Seite BigQuery.

    BigQuery aufrufen

  2. Fügen Sie die folgende Abfrage in den Abfrageeditor ein und klicken Sie auf Ausführen:

    CREATE OR REPLACE TABLE
      `bqml_tutorial.nyc_citibike_time_series` AS
    WITH input_time_series AS
    (
      SELECT
        start_station_name,
        EXTRACT(DATE FROM starttime) AS date,
        COUNT(*) AS num_trips
      FROM
        `bigquery-public-data.new_york.citibike_trips`
      GROUP BY
        start_station_name, date
    )
    SELECT table_1.*
    FROM input_time_series AS table_1
    INNER JOIN (
      SELECT start_station_name,  COUNT(*) AS num_points
      FROM input_time_series
      GROUP BY start_station_name) table_2
    ON
      table_1.start_station_name = table_2.start_station_name
    WHERE
      num_points > 400;

Modell mit Standardparametern für mehrere Zeitreihen erstellen

Sie möchten die Anzahl der Fahrradfahrten für jede Citi Bike-Station prognostizieren. Dazu sind viele Zeitreihenmodelle erforderlich, eines für jede Citi Bike-Station, die in den Eingabedaten enthalten ist. Sie können dazu mehrere CREATE MODEL-Abfragen schreiben. Dies kann jedoch mühsam und zeitaufwendig sein, insbesondere wenn Sie sehr viele Zeitreihen haben. Stattdessen können Sie mit einer einzigen Abfrage eine Reihe von Zeitreihenmodellen erstellen und anpassen, um mehrere Zeitreihen gleichzeitig vorherzusagen.

Die OPTIONS(model_type='ARIMA_PLUS', time_series_timestamp_col='date', ...)-Klausel gibt an, dass Sie eine Reihe von ARIMA-basierten Zeitachsenmodellen ARIMA_PLUS erstellen. Mit der Option time_series_timestamp_col wird die Spalte angegeben, die die Zeitreihe enthält. Mit der Option time_series_data_col wird die Spalte angegeben, für die eine Prognose erstellt werden soll. Mit time_series_id_col geben Sie eine oder mehrere Dimensionen an, für die Sie Zeitreihen erstellen möchten.

In diesem Beispiel werden die Zeitpunkte in der Zeitreihe nach dem 01. 06. 2016 weggelassen , damit diese Zeitpunkte später mithilfe der Funktion ML.EVALUATE zur Auswertung der Prognosegenauigkeit verwendet werden können.

So erstellen Sie das Modell:

  1. Öffnen Sie in der Google Cloud Console die Seite BigQuery.

    BigQuery aufrufen

  2. Fügen Sie die folgende Abfrage in den Abfrageeditor ein und klicken Sie auf Ausführen:

    CREATE OR REPLACE MODEL `bqml_tutorial.nyc_citibike_arima_model_default`
    OPTIONS
      (model_type = 'ARIMA_PLUS',
      time_series_timestamp_col = 'date',
      time_series_data_col = 'num_trips',
      time_series_id_col = 'start_station_name'
      ) AS
    SELECT *
    FROM bqml_tutorial.nyc_citibike_time_series
    WHERE date < '2016-06-01';

    Die Abfrage dauert etwa 15 Minuten.

Prognosegenauigkeit für jede Zeitreihe bewerten

Mit der Funktion ML.EVALUATE können Sie die Vorhersagegenauigkeit des Modells bewerten.

So bewerten Sie das Modell:

  1. Öffnen Sie in der Google Cloud Console die Seite BigQuery.

    BigQuery aufrufen

  2. Fügen Sie die folgende Abfrage in den Abfrageeditor ein und klicken Sie auf Ausführen:

    SELECT *
    FROM
      ML.EVALUATE(MODEL `bqml_tutorial.nyc_citibike_arima_model_default`,
      TABLE `bqml_tutorial.nyc_citibike_time_series`,
      STRUCT(7 AS horizon, TRUE AS perform_aggregation));

    Diese Abfrage meldet mehrere Prognosemesswerte, einschließlich:

    Die Ergebnisse sollten in etwa so aussehen: Bewertungsmesswerte für das Zeitreihenmodell.

    Die TABLE-Klausel in der ML.EVALUATE-Funktion gibt eine Tabelle an, die die Ground-Truth-Daten enthält. Die Prognoseergebnisse werden mit den Ground-Truth-Daten verglichen, um Genauigkeitsmesswerte zu berechnen. In diesem Fall enthält nyc_citibike_time_series sowohl die Zeitachsenpunkte, die vor dem 01. 06. 2016 und nach dem 01. 06. 2016 liegen. Die Punkte nach dem 1. Juni 2016 sind die Ground-Truth-Daten. Die Punkte vor dem 1. Juni 2016 werden verwendet, um das Modell so zu trainieren, dass es nach diesem Datum Prognosen erstellt. Nur die Punkte nach dem 1. Juni 2016 sind für die Berechnung der Messwerte erforderlich. Die Punkte vor dem 1. Juni 2016 werden bei der Berechnung der Messwerte ignoriert.

    In der STRUCT-Klausel der ML.EVALUATE-Funktion sind Parameter für die Funktion angegeben. Der Wert für horizon ist 7. Das bedeutet, dass die Prognosegenauigkeit auf der Grundlage einer 7-Punkte-Prognose berechnet wird. Wenn die Ground-Truth-Daten für den Vergleich weniger als sieben Punkte haben, werden Genauigkeitsmesswerte nur auf Grundlage der verfügbaren Punkte berechnet. Der Wert für perform_aggregation ist TRUE. Das bedeutet, dass die Messwerte der Prognosegenauigkeit über die Messwerte auf der Basis von Zeitpunkten aggregiert werden. Wenn Sie für perform_aggregation den Wert FALSE angeben, wird die Prognosegenauigkeit für jeden prognostizierten Zeitpunkt zurückgegeben.

    Weitere Informationen zu den Ausgabespalten finden Sie unter ML.EVALUATE-Funktion.

Gesamtprognosegenauigkeit bewerten

Bewerten Sie die Prognosegenauigkeit für alle 383 Zeitreihen.

Von den von ML.EVALUATE zurückgegebenen Prognosemetriken sind nur der mittlere absolute prozentuale Fehler und der symmetrische mittlere absolute prozentuale Fehler zeitachsenwertunabhängig. Für die Bewertung der gesamten Prognosegenauigkeit der Zeitreihe ist daher nur das Aggregat dieser beiden Messgrößen aussagekräftig.

So bewerten Sie das Modell:

  1. Öffnen Sie in der Google Cloud Console die Seite BigQuery.

    BigQuery aufrufen

  2. Fügen Sie die folgende Abfrage in den Abfrageeditor ein und klicken Sie auf Ausführen:

    SELECT
      AVG(mean_absolute_percentage_error) AS MAPE,
      AVG(symmetric_mean_absolute_percentage_error) AS sMAPE
    FROM
      ML.EVALUATE(MODEL `bqml_tutorial.nyc_citibike_arima_model_default`,
        TABLE `bqml_tutorial.nyc_citibike_time_series`,
        STRUCT(7 AS horizon, TRUE AS perform_aggregation));

Diese Abfrage gibt den Wert 0.3471 für MAPE und den Wert 0.2563 für sMAPE zurück.

Modell zum Prognostizieren mehrerer Zeitreihen mit einem kleineren Hyperparameter-Suchbereich erstellen

Im Abschnitt Modell für mehrere Zeitreihen mit Standardparametern erstellen haben Sie die Standardwerte für alle Trainingsoptionen verwendet, einschließlich der Option auto_arima_max_order. Diese Option steuert den Suchbereich für die Hyperparameter-Abstimmung im Algorithmus auto.ARIMA.

Im Modell, das durch die folgende Abfrage erstellt wird, verwenden Sie einen kleineren Suchraum für die Hyperparameter. Dazu ändern Sie den Optionswert auto_arima_max_order vom Standardwert 5 in 2.

So bewerten Sie das Modell:

  1. Öffnen Sie in der Google Cloud Console die Seite BigQuery.

    BigQuery aufrufen

  2. Fügen Sie die folgende Abfrage in den Abfrageeditor ein und klicken Sie auf Ausführen:

    CREATE OR REPLACE MODEL `bqml_tutorial.nyc_citibike_arima_model_max_order_2`
    OPTIONS
      (model_type = 'ARIMA_PLUS',
      time_series_timestamp_col = 'date',
      time_series_data_col = 'num_trips',
      time_series_id_col = 'start_station_name',
      auto_arima_max_order = 2
      ) AS
    SELECT *
    FROM `bqml_tutorial.nyc_citibike_time_series`
    WHERE date < '2016-06-01';

    Die Abfrage dauert etwa 2 Minuten. Denken Sie daran, dass das vorherige Modell etwa 15 Minuten gedauert hat, als der Wert für auto_arima_max_order 5 war. Mit dieser Änderung wird die Geschwindigkeit des Modelltrainings also um etwa das Siebenfache gesteigert. Wenn Sie sich fragen, warum die Geschwindigkeitssteigerung nicht 5/2=2.5x beträgt, so liegt das daran, dass mit der Erhöhung des auto_arima_max_order-Werts nicht nur die Anzahl der Modellkandidaten, sondern auch die Komplexität zunimmt. Dadurch verlängert sich die Trainingszeit des Modells.

Prognosegenauigkeit für ein Modell mit einem kleineren Hyperparameter-Suchbereich bewerten

So bewerten Sie das Modell:

  1. Öffnen Sie in der Google Cloud Console die Seite BigQuery.

    BigQuery aufrufen

  2. Fügen Sie die folgende Abfrage in den Abfrageeditor ein und klicken Sie auf Ausführen:

    SELECT
      AVG(mean_absolute_percentage_error) AS MAPE,
      AVG(symmetric_mean_absolute_percentage_error) AS sMAPE
    FROM
      ML.EVALUATE(MODEL `bqml_tutorial.nyc_citibike_arima_model_max_order_2`,
        TABLE `bqml_tutorial.nyc_citibike_time_series`,
        STRUCT(7 AS horizon, TRUE AS perform_aggregation));

Diese Abfrage gibt den Wert 0.3337 für MAPE und den Wert 0.2337 für sMAPE zurück.

Im Abschnitt Prognosegenauigkeit insgesamt bewerten haben Sie ein Modell mit einem größeren Hyperparameter-Suchbereich bewertet, bei dem der Optionswert für auto_arima_max_order 5 ist. Dies führte zu einem MAPE-Wert von 0.3471 und einem sMAPE-Wert von 0.2563. In diesem Fall sehen Sie, dass ein kleinerer Hyperparameter-Suchbereich tatsächlich eine höhere Prognosegenauigkeit bietet. Ein Grund dafür ist, dass der Algorithmus auto.ARIMA nur Hyperparameter-Abstimmung für das Trendmodul der gesamten Modellierungspipeline durchführt. Das beste ARIMA-Modell, das vom Algorithmus auto.ARIMA ausgewählt wurde, generiert möglicherweise nicht die besten Prognoseergebnisse für die gesamte Pipeline.

Modell zum Prognostizieren mehrerer Zeitreihen mit einem kleineren Hyperparameter-Suchbereich und intelligenten schnellen Trainingsstrategien erstellen

In diesem Schritt verwenden Sie sowohl einen kleineren Hyperparameter-Suchbereich als auch eine intelligente schnelle Trainingsstrategie mit einer oder mehreren der Trainingsoptionen max_time_series_length, max_time_series_length oder time_series_length_fraction.

Während regelmäßige Modelle wie Saisonabhängigkeit eine bestimmte Anzahl von Zeitpunkten erfordern, erfordert die Trendmodellierung weniger Zeitpunkte. In der Zwischenzeit ist die Trendmodellierung viel rechenintensiver als andere Zeitachsenkomponenten wie Saisonabhängigkeit. Wenn Sie die obigen Trainingsoptionen verwenden, können Sie die Trendkomponente effizient mit einer Teilmenge der Zeitreihen modellieren, während die anderen Zeitreihenkomponenten die gesamte Zeitreihe verwenden.

Im folgenden Beispiel wird die Option max_time_series_length verwendet, um ein schnelles Training zu ermöglichen. Wenn Sie den Optionswert max_time_series_length auf 30 festlegen, werden nur die 30 neuesten Zeitpunkte verwendet, um die Trendkomponente zu modellieren. Alle 383 Zeitreihen werden weiterhin zur Modellierung der Nicht-Trendkomponenten verwendet.

So erstellen Sie das Modell:

  1. Öffnen Sie in der Google Cloud Console die Seite BigQuery.

    BigQuery aufrufen

  2. Fügen Sie die folgende Abfrage in den Abfrageeditor ein und klicken Sie auf Ausführen:

    CREATE OR REPLACE MODEL `bqml_tutorial.nyc_citibike_arima_model_max_order_2_fast_training`
    OPTIONS
      (model_type = 'ARIMA_PLUS',
      time_series_timestamp_col = 'date',
      time_series_data_col = 'num_trips',
      time_series_id_col = 'start_station_name',
      auto_arima_max_order = 2,
      max_time_series_length = 30
      ) AS
    SELECT *
    FROM `bqml_tutorial.nyc_citibike_time_series`
    WHERE date < '2016-06-01';

    Die Abfrage dauert etwa 35 Sekunden. Das ist dreimal schneller als die Abfrage, die Sie im Abschnitt Modell erstellen, um mehrere Zeitreihen mit einem kleineren Hyperparameter-Suchbereich vorherzusagen verwendet haben. Aufgrund des konstanten Zeitaufwands für den nicht trainingsbezogenen Teil der Abfrage, wie z. B. die Datenvorverarbeitung, ist der Geschwindigkeitsgewinn viel höher, wenn die Zahl der Zeitreihen viel größer ist als in diesem Beispiel. Bei einer Million Zeitreihen nähert sich der Geschwindigkeitsfaktor dem Verhältnis der Zeitreihenlänge und dem Wert der Option max_time_series_length. In diesem Fall ist die Geschwindigkeitssteigerung größer als das 10-Fache.

Prognosegenauigkeit für ein Modell mit kleineren Hyperparameter-Suchbereichen und intelligenten schnellen Trainingsstrategien bewerten

So bewerten Sie das Modell:

  1. Öffnen Sie in der Google Cloud Console die Seite BigQuery.

    BigQuery aufrufen

  2. Fügen Sie die folgende Abfrage in den Abfrageeditor ein und klicken Sie auf Ausführen:

    SELECT
      AVG(mean_absolute_percentage_error) AS MAPE,
      AVG(symmetric_mean_absolute_percentage_error) AS sMAPE
    FROM
      ML.EVALUATE(MODEL `bqml_tutorial.nyc_citibike_arima_model_max_order_2_fast_training`,
        TABLE `bqml_tutorial.nyc_citibike_time_series`,
        STRUCT(7 AS horizon, TRUE AS perform_aggregation));

Diese Abfrage gibt den Wert 0.3515 für MAPE und den Wert 0.2473 für sMAPE zurück.

Ohne die Verwendung schneller Trainingsstrategien ergibt sich für die Prognosegenauigkeit ein MAPE-Wert von 0.3337 und ein sMAPE-Wert von 0.2337. Die Differenz zwischen den beiden Messwerten liegt innerhalb von 3%, was statistisch unbedeutend ist.

Mit anderen Worten: Sie haben einen kleineren Hyperparameter-Suchbereich und intelligente schnelle Trainingsstrategien verwendet, um Ihr Modelltraining mehr als 20-mal schneller zu machen, ohne die Genauigkeit der Prognose zu beeinträchtigen. Wie bereits erwähnt, kann bei mehr Zeitreihen die Geschwindigkeit der intelligenten schnellen Trainingsstrategien erheblich höher sein. Darüber hinaus wurde die ARIMA-Bibliothek, die ARIMA_PLUS-Modellen zugrunde liegt, so optimiert, dass sie nun 5x schneller läuft als zuvor. Zusammen ermöglichen diese Ergebnisse die Prognose von Millionen von Zeitachsen innerhalb von Stunden.

Modell zum Prognostizieren einer Million Zeitreihen erstellen

In diesem Schritt prognostizieren Sie den Alkoholabsatz für über eine Million Spirituosenprodukte in verschiedenen Geschäften anhand der öffentlichen Verkaufsdaten für Spirituosen in Iowa. Das Modelltraining verwendet einen kleinen Hyperparameter-Suchbereich sowie die intelligente schnelle Trainingsstrategie.

So bewerten Sie das Modell:

  1. Öffnen Sie in der Google Cloud Console die Seite BigQuery.

    BigQuery aufrufen

  2. Fügen Sie die folgende Abfrage in den Abfrageeditor ein und klicken Sie auf Ausführen:

    CREATE OR REPLACE MODEL
      `bqml_tutorial.liquor_forecast_by_product`
    OPTIONS(
      MODEL_TYPE = 'ARIMA_PLUS',
      TIME_SERIES_TIMESTAMP_COL = 'date',
      TIME_SERIES_DATA_COL = 'total_bottles_sold',
      TIME_SERIES_ID_COL = ['store_number', 'item_description'],
      HOLIDAY_REGION = 'US',
      AUTO_ARIMA_MAX_ORDER = 2,
      MAX_TIME_SERIES_LENGTH = 30
    ) AS
    SELECT
      store_number,
      item_description,
      date,
      SUM(bottles_sold) as total_bottles_sold
    FROM
      `bigquery-public-data.iowa_liquor_sales.sales`
    WHERE date BETWEEN DATE("2015-01-01") AND DATE("2021-12-31")
    GROUP BY store_number, item_description, date;

    Die Abfrage dauert etwa 1 Stunde und 16 Minuten.

Bereinigen

Damit Ihrem Google Cloud-Konto die in dieser Anleitung verwendeten Ressourcen nicht in Rechnung gestellt werden, löschen Sie entweder das Projekt, das die Ressourcen enthält, oder Sie behalten das Projekt und löschen die einzelnen Ressourcen.

  • Sie können das von Ihnen erstellte Projekt löschen.
  • Sie können das Projekt aber auch behalten und das Dataset löschen.

Dataset löschen

Wenn Sie Ihr Projekt löschen, werden alle Datasets und Tabellen entfernt. Wenn Sie das Projekt wieder verwenden möchten, können Sie das in dieser Anleitung erstellte Dataset löschen:

  1. Rufen Sie, falls erforderlich, die Seite "BigQuery" in der Google Cloud Console auf.

    Zur Seite "BigQuery"

  2. Wählen Sie im Navigationsbereich das Dataset bqml_tutorial aus, das Sie erstellt haben.

  3. Klicken Sie auf Dataset löschen, um das Dataset, die Tabelle und alle Daten zu löschen.

  4. Bestätigen Sie im Dialogfeld Dataset löschen den Löschbefehl. Geben Sie dazu den Namen des Datasets (bqml_tutorial) ein und klicken Sie auf Löschen.

Projekt löschen

So löschen Sie das Projekt:

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

Nächste Schritte