Skalierbare Prognose mit Millionen von Zeitachsen in BigQuery

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.

Für alle Schritte außer dem letzten verwenden Sie die Daten von new_york.citibike_trips. Diese Daten enthalten Informationen zu Citi Bike-Fahrten in New York City. Dieses Dataset enthält nur einige hundert Zeitachsen. Sie wird verwendet, um verschiedene Strategien zur Beschleunigung des Modelltrainings zu veranschaulichen. Im letzten Schritt verwenden Sie iowa_liquor_sales.sales-Daten, um mehr als eine Million Zeitachsen zu prognostizieren.

Bevor Sie diese Anleitung lesen, sollten Sie Prognosen für mehrere Zeitachsen mit einer einzigen Abfrage für "NYC Citi Bike"-Fahrten durchführen lesen. Sie sollten auch Best Practices für umfangreiche Zeitachsenprognosen lesen.

Ziele

In dieser Anleitung verwenden Sie Folgendes:

Der Einfachheit halber wird in dieser Anleitung nicht behandelt, wie Sie mit ML.FORECAST oder ML.EXPLAIN_FORECAST (erklärbare) Prognosen erstellen. Weitere Informationen zur Verwendung dieser Funktionen finden Sie unter Prognosen für mehrere Zeitachsen mit einer einzigen Abfrage für "NYC Citi Bike"-Fahrten durchführen.

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. Melden Sie sich bei Ihrem Google Cloud-Konto an. Wenn Sie mit Google Cloud noch nicht vertraut sind, erstellen Sie ein Konto, um die Leistungsfähigkeit unserer Produkte in der Praxis sehen und bewerten zu können. Neukunden erhalten außerdem ein Guthaben von 300 $, um Arbeitslasten auszuführen, zu testen und bereitzustellen.
  2. Wählen Sie in der Google Cloud Console auf der Seite der Projektauswahl ein Google Cloud-Projekt aus oder erstellen Sie eines.

    Zur Projektauswahl

  3. Die Abrechnung für das Cloud-Projekt muss aktiviert sein. So prüfen Sie, ob die Abrechnung für ein Projekt aktiviert ist.

  4. Wählen Sie in der Google Cloud Console auf der Seite der Projektauswahl ein Google Cloud-Projekt aus oder erstellen Sie eines.

    Zur Projektauswahl

  5. Die Abrechnung für das Cloud-Projekt muss aktiviert sein. So prüfen Sie, ob die Abrechnung für ein Projekt aktiviert ist.

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

    BigQuery API aktivieren.

    Aktivieren Sie die API

    .

Schritt 1: Dataset erstellen

Führen Sie die folgenden Schritte aus, um ein BigQuery-Dataset zum Speichern Ihres Modells für maschinelles Lernen zu erstellen.

  1. Rufen Sie in der Cloud Console die BigQuery-Seite auf.

    Zur Seite "BigQuery"

  2. Klicken Sie im Abschnitt Ressourcen auf Ihren Projektnamen.

  3. Klicken Sie im Detailbereich auf 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 unter Speicherort der Daten die Option USA aus. Öffentliche Datasets sind am multiregionalen Standort US gespeichert. Der Einfachheit halber sollten Sie Ihr Dataset am selben Speicherort ablegen.

      Seite "Dataset erstellen"

  5. Übernehmen Sie für alle anderen Einstellungen den Standardwert und klicken Sie auf Dataset erstellen.

Schritt 2: Zeitachse für die Prognose erstellen

In der folgenden Abfrage gibt die FROM bigquery-public-data.new_york.citibike_trips-Klausel an, dass Sie die Tabelle citibike_trips im Dataset new_york abfragen.

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

Die Abfrage führen Sie so aus:

  1. Klicken Sie in der Cloud Console auf die Schaltfläche Neue Abfrage erstellen.

  2. Geben Sie in den Textbereich im Abfrageeditor die oben Standard-SQL-Abfrage von oben ein.

  3. Klicken Sie auf Ausführen.

Die Anweisung SELECT in der Abfrage verwendet die Funktion EXTRACT, 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.

Schritt 3: Mehrere Zeitachsen mit Standardparametern gleichzeitig prognostizieren

In diesem Schritt prognostiziert Sie die tägliche Gesamtzahl der Fahrten, die an verschiedenen Citi Bike-Haltestellen beginnen. Dazu müssen Sie viele Zeitachsen prognostizieren. Sie können mehrere CREATE MODEL-Abfragen schreiben. Dies kann jedoch mühsam und zeitaufwendig sein, insbesondere wenn Sie sehr viele Zeitachsen haben.

Zur Erleichterung können Sie in BigQuery ML eine Reihe von Zeitachsenmodellen erstellen, um mehrere Zeitachsen mit einer einzigen Abfrage vorherzusagen. Außerdem werden alle Zeitachsenmodelle gleichzeitig angepasst.

In der folgenden Standard-SQL-Abfrage erstellt und trainiert die CREATE MODEL-Klausel eine Reihe von Modellen mit dem Namen bqml_tutorial.nyc_citibike_arima_model_default.

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'

Führen Sie die folgenden Schritte aus, um die CREATE MODEL-Abfrage zum Erstellen und Trainieren Ihres Modells auszuführen:

  1. Klicken Sie in der Cloud Console auf die Schaltfläche Neue Abfrage erstellen.

  2. Geben Sie in den Textbereich im Abfrageeditor die oben Standard-SQL-Abfrage von oben ein.

  3. Klicken Sie auf Ausführen.

    Die Abfrage dauert etwa 14 Minuten und 25 Sekunden.

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. Zusätzlich zu time_series_timestamp_col und time_series_data_col müssen Sie time_series_id_col angeben, mit dem verschiedene Eingabezeitachsen annotiert werden.

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

Schritt 4: Prognosegenauigkeit für jede Zeitachse bewerten

In diesem Schritt bewerten Sie die Prognosegenauigkeit für jede Zeitachse mithilfe der folgenden ML.EVALUATE-Abfrage.

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))

Führen Sie die folgenden Schritte aus, um die obige Abfrage auszuführen:

  1. Klicken Sie in der Cloud Console auf die Schaltfläche Neue Abfrage erstellen.

  2. Geben Sie in den Textbereich im Abfrageeditor die oben Standard-SQL-Abfrage von oben ein.

  3. Klicken Sie auf Ausführen. Diese Abfrage meldet mehrere Prognosemesswerte, einschließlich:

    Die Ergebnisse sollten so aussehen:ML.EVALUATE output1.

ML.EVALUATE verwendet das ARIMA_PLUS-Modell, das im vorherigen Schritt als erstes Argument trainiert wurde.

Das zweite Argument ist eine Datentabelle, die Ground-Truth-Daten enthält. Diese 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 01. 06. 2016 sind die Ground-Truth-Daten. Die Punkte vor dem 01. 06. 2016 werden verwendet, um das Modell so zu trainieren, dass es nach diesem Datum Prognosen erstellt. Nur die Punkte nach dem 01. 06. 2016 sind für die Berechnung der Messwerte erforderlich. Die Punkte vor dem 01. 06. 2016 werden in der Messwertberechnung ignoriert.

Das dritte Argument ist ein STRUCT, das zwei Parameter enthält. Der Horizont ist 7, d. h. die Abfrage berechnet die Prognosegenauigkeit auf der Grundlage einer 7-Punkte-Prognose. Wenn die Ground-Truth-Daten für den Vergleich weniger als 7 Punkte haben, werden Genauigkeitsmesswerte nur auf Grundlage der verfügbaren Punkte berechnet. perform_aggregation hat den Wert TRUE, was bedeutet, dass die Messwerte der Prognosegenauigkeit über die Messwerte auf der Basis von Zeitpunkten aggregiert werden. Wenn Sie perform_aggregation als FALSE angeben, wird die Prognosegenauigkeit für jeden prognostizierten Zeitpunkt zurückgegeben.

Schritt 5: Gesamtprognosegenauigkeit für alle Zeitachsen bewerten

In diesem Schritt bewerten Sie die Vorhersagegenauigkeit für die alle 383 Zeitachsen anhand der folgenden Abfrage:

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))

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 Zeitachse ist daher nur das Aggregat dieser beiden Messgrößen aussagekräftig.

Diese Abfrage gibt folgende Ergebnisse zurück: MAPE ist 0,3471, sMAPE ist 0,2563.

Schritt 6: Viele Zeitachsen gleichzeitig mit einem kleineren Hyperparameter-Suchbereich prognostizieren

In Schritt 3 haben wir die Standardwerte für alle Trainingsoptionen verwendet, einschließlich der auto_arima_max_order. Diese Option steuert den Suchbereich für die Hyperparameter-Abstimmung im Algorithmus auto.ARIMA.

In diesem Schritt verwenden Sie einen kleineren Suchbereich für die Hyperparameter.

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'

Diese Abfrage reduziert auto_arima_max_order von 5 (Standardwert) auf 2.

Die Abfrage führen Sie so aus:

  1. Klicken Sie in der Cloud Console auf die Schaltfläche Neue Abfrage erstellen.

  2. Geben Sie in den Textbereich im Abfrageeditor die oben Standard-SQL-Abfrage von oben ein.

  3. Klicken Sie auf Ausführen.

    Die Abfrage dauert etwa 1 Minute und 45 Sekunden. Wie bereits erwähnt, dauert die Abfrage 14 Min. und 25 Sek., wenn auto_arima_max_order 5 ist. Die Geschwindigkeitssteigerung beträgt also etwa das 7-fache, wenn auto_arima_max_order auf 2 gesetzt wird. Wenn Sie sich fragen, warum die Geschwindigkeitssteigerung nicht 5 / 2 = 2,5x beträgt, so liegt das daran, dass mit der Erhöhung der Reihenfolge von auto_arima_max_order nicht nur die Anzahl der Modellkandidaten, sondern auch die Komplexität und damit die Trainingszeit der Modelle zunimmt.

Schritt 7: Prognosegenauigkeit anhand eines kleineren Hyperparameter-Suchbereichs auswerten

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 die folgenden Ergebnisse zurück: MAPE ist 0,3337 und sMAPE ist 0,2337.

In Schritt 5 führten unter Verwendung eines größeren Hyperparameter-Suchbereichs, auto_arima_max_order = 5, zu MAPE von 0,3471 und sMAPE von 0,2563. In diesem Fall bietet ein kleinerer Hyperparameter-Suchbereich tatsächlich eine höhere Prognosegenauigkeit. Ein Grund 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.

Schritt 8: Viele Zeitachsen gleichzeitig mit einem kleineren Hyperparameter-Suchbereich und intelligenten schnellen Trainingsstrategien prognostizieren

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 Zeitachsen modellieren, während die anderen Zeitachsenkomponenten die gesamte Zeitachse verwenden.

In diesem Beispiel wird max_time_series_length für ein schnelles Training verwendet.

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 Option max_time_series_length hat einen Wert von 30. Für jede der 383 Zeitachsen werden also nur die 30 neuesten Zeitpunkte verwendet, um die Trendkomponente zu modellieren. Alle Zeitachsen werden weiterhin zur Modellierung der Nicht-Trendkomponenten verwendet.

Die Abfrage führen Sie so aus:

  1. Klicken Sie in der Cloud Console auf die Schaltfläche Neue Abfrage erstellen.

  2. Geben Sie in den Textbereich im Abfrageeditor die oben Standard-SQL-Abfrage von oben ein.

  3. Klicken Sie auf Ausführen.

    Die Abfrage dauert etwa 35 Sekunden. Dies ist dreimal schneller als die Trainingsabfrage, die keine Schnelltrainingsstrategie verwendet (d. h. sie dauert 1 Minute und 45 Sekunden). Beachten Sie, dass aufgrund des konstanten Zeitaufwands für den nicht trainingsbezogenen Teil der Abfrage, wie z. B. die Datenvorverarbeitung usw., der Geschwindigkeitsgewinn viel höher ist, wenn die Zahl der Zeitachsen viel größer ist als in diesem Fall. Bei einer Million Zeitachsen nähert sich der Geschwindigkeitsfaktor dem Verhältnis der Zeitachsenlänge und dem Wert von max_time_series_length. In diesem Fall ist die Geschwindigkeitssteigerung größer als das 10-Fache.

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

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 die folgenden Ergebnisse zurück: MAPE ist 0,3515 und sMAPE ist 0,2473.

Beachten Sie, dass ohne die Verwendung schneller Trainingsstrategien die Ergebnisse der Prognosegenauigkeit 0,3337 und sMAPE 0,2337 ist. 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 schnelleren Zeitachsen die Geschwindigkeit der intelligenten schnellen Trainingsstrategien erheblich höher sein. Darüber hinaus wurde die ARIMA-Bibliothek, die ARIMA_PLUS 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.

Schritt 10: Prognose für eine Million Zeitachsen

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.

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

Das Modelltraining verwendet weiterhin einen kleinen Hyperparameter-Suchbereich sowie die intelligente schnelle Trainingsstrategie. 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 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. Wechseln Sie in der Cloud Console zur Seite Ressourcen verwalten.

    Zur Seite „Ressourcen verwalten“

  2. Wählen Sie in der Projektliste das Projekt aus, das Sie löschen möchten, und klicken Sie dann auf Löschen.
  3. Geben Sie im Dialogfeld die Projekt-ID ein und klicken Sie auf Shut down (Beenden), um das Projekt zu löschen.

Nächste Schritte