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 ausführen lesen. Sie sollten auch Best Practices für umfangreiche Zeitachsenprognosen lesen.
Ziele
In dieser Anleitung verwenden Sie Folgendes:
- Mit der Anweisung
CREATE MODEL
wird ein Zeitachsenmodell oder eine Reihe von Zeitachsenmodellen erstellt. - Die Funktion
ML.EVALUATE
bewertet die Prognosegenauigkeit. - Die Trainingsoptionen
AUTO_ARIMA_MAX_ORDER
,TIME_SERIES_LENGTH_FRACTION
,MIN_TIME_SERIES_LENGTH
undMAX_TIME_SERIES_LENGTH
: Die Modelltrainingszeit wird deutlich reduziert.
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
- 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.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
- BigQuery ist in neuen Projekten automatisch aktiviert.
Zum Aktivieren von BigQuery in einem vorhandenen Projekt wechseln Sie zu
Enable the BigQuery API.
.
Schritt 1: Dataset erstellen
Erstellen Sie ein BigQuery-Dataset, um Ihr ML-Modell zu speichern:
Rufen Sie in der Google Cloud Console die Seite „BigQuery“ auf.
Klicken Sie im Bereich Explorer auf den Namen Ihres Projekts.
Klicken Sie auf
Aktionen ansehen > Dataset erstellen.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.
Schritt 2: Zeitreihe 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:
Klicken Sie in der Google Cloud Console auf Neue Abfrage erstellen.
Geben Sie im obigen Textfeld des Abfrageeditors die folgende GoogleSQL-Abfrage ein.
Klicken Sie auf Ausführen.
Die Anweisung SELECT
in der Abfrage verwendet die Funktion EXTRACTEXTRACT
, 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 GoogleSQL-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:
Klicken Sie in der Google Cloud Console auf Neue Abfrage erstellen.
Geben Sie im obigen Textfeld des Abfrageeditors die folgende GoogleSQL-Abfrage ein.
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 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.
Schritt 4: Prognosegenauigkeit für jede Zeitreihe bewerten
In diesem Schritt bewerten Sie die Prognosegenauigkeit für jede Zeitreihe 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:
Klicken Sie in der Google Cloud Console auf Neue Abfrage erstellen.
Geben Sie im obigen Textfeld des Abfrageeditors die folgende GoogleSQL-Abfrage ein.
Klicken Sie auf Ausführen. Diese Abfrage meldet mehrere Prognosemesswerte, einschließlich:
- Mittlerer absoluter Fehler
- Mittlere quadratische Abweichung
- Mittlerer absoluter prozentualer Fehler
- Symmetrischer mittlerer absoluter prozentualer Fehler
Die Ergebnisse sollten so aussehen:
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 Zeitreihen bewerten
In diesem Schritt bewerten Sie die Vorhersagegenauigkeit für die alle 383 Zeitreihen 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 Zeitreihe 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 MODELbqml_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 * FROMbqml_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:
Klicken Sie in der Google Cloud Console auf Neue Abfrage erstellen.
Geben Sie im obigen Textfeld des Abfrageeditors die folgende GoogleSQL-Abfrage ein.
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, wennauto_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 vonauto_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 Zeitreihen modellieren, während die anderen Zeitreihenkomponenten die gesamte Zeitreihe 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:
Klicken Sie in der Google Cloud Console auf Neue Abfrage erstellen.
Geben Sie im obigen Textfeld des Abfrageeditors die folgende GoogleSQL-Abfrage ein.
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:
Rufen Sie, falls erforderlich, die Seite "BigQuery" in der Google Cloud Console auf.
Wählen Sie im Navigationsbereich das Dataset bqml_tutorial aus, das Sie erstellt haben.
Klicken Sie auf Dataset löschen, um das Dataset, die Tabelle und alle Daten zu löschen.
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:
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
Nächste Schritte
- Mehr über maschinelles Lernen im Machine Learning Crash Course erfahren
- Einführung in BigQuery ML
- Weitere Informationen zur Google Cloud Console finden Sie unter Google Cloud Console verwenden.