Benutzerdefinierte Feiertage in einem ARIMA_PLUS-Zeitreihenprognosemodell verwenden

In dieser Anleitung werden die folgenden Aufgaben erläutert:

  • Ein ARIMA_PLUS-Zeitreihen-Vorhersagemodell erstellen, das nur integrierte Feiertage verwendet.
  • Ein Prognosemodell für die ARIMA_PLUS-Zeitreihe erstellen, das benutzerdefinierte Feiertage zusätzlich zu integrierten Feiertagen verwendet.
  • Die prognostizierten Ergebnisse aus diesen Modellen visualisieren.
  • Ein Modell überprüfen, um zu sehen, welche Feiertage es modelliert.
  • Die Auswirkungen benutzerdefinierter Feiertage auf die prognostizierten Ergebnisse bewerten.
  • Die Leistung des Modells, das nur integrierte Feiertage verwendet, mit der Leistung des Modells vergleichen, das zusätzlich zu den integrierten Feiertagen auch benutzerdefinierte Feiertage verwendet.

In dieser Anleitung werden die öffentlichen bigquery-public-data.wikipedia.pageviews_*-Tabellen verwendet.

Erforderliche Berechtigungen

  • Sie benötigen die IAM-Berechtigung bigquery.datasets.create, um das Dataset zu erstellen.

  • Zum Erstellen des Modells benötigen Sie die folgenden Berechtigungen:

    • bigquery.jobs.create
    • bigquery.models.create
    • bigquery.models.getData
    • bigquery.models.updateData
  • 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.

Kosten

In diesem Dokument verwenden Sie die folgenden kostenpflichtigen Komponenten von Google Cloud:

  • BigQuery: You incur costs for the data you process in BigQuery.

Mit dem Preisrechner können Sie eine Kostenschätzung für Ihre voraussichtliche Nutzung vornehmen.

Neuen Google Cloud Nutzern steht möglicherweise eine kostenlose Testversion zur Verfügung.

Weitere Informationen finden Sie unter BigQuery-Preise.

Hinweise

  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.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. Enable the BigQuery API.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the API

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

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  6. Verify that billing is enabled for your Google Cloud project.

  7. Enable the BigQuery API.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the API

  8. Dataset erstellen

    Erstellen Sie ein BigQuery-Dataset zum Speichern Ihres ML-Modells.

    Konsole

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

      Zur Seite "BigQuery"

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

    3. Klicken Sie auf  Aktionen ansehen > 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.

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

    bq

    Wenn Sie ein neues Dataset erstellen möchten, verwenden Sie den Befehl bq mk mit dem Flag --location. Eine vollständige Liste der möglichen Parameter finden Sie in der bq mk --dataset-Befehlsreferenz.

    1. Erstellen Sie ein Dataset mit dem Namen bqml_tutorial, wobei der Datenspeicherort auf US und die Beschreibung auf BigQuery ML tutorial dataset festgelegt ist:

      bq --location=US mk -d \
       --description "BigQuery ML tutorial dataset." \
       bqml_tutorial

      Anstelle des Flags --dataset verwendet der Befehl die verkürzte Form -d. Wenn Sie -d und --dataset auslassen, wird standardmäßig ein Dataset erstellt.

    2. Prüfen Sie, ob das Dataset erstellt wurde:

      bq ls

    API

    Rufen Sie die Methode datasets.insert mit einer definierten Dataset-Ressource auf.

    {
      "datasetReference": {
         "datasetId": "bqml_tutorial"
      }
    }

    BigQuery DataFrames

    Bevor Sie dieses Beispiel ausprobieren, folgen Sie den Schritten zur Einrichtung von BigQuery DataFrames in der BigQuery-Kurzanleitung: BigQuery DataFrames verwenden. Weitere Informationen finden Sie in der Referenzdokumentation zu BigQuery DataFrames.

    Richten Sie zur Authentifizierung bei BigQuery die Standardanmeldedaten für Anwendungen ein. Weitere Informationen finden Sie unter ADC für eine lokale Entwicklungsumgebung einrichten.

    import google.cloud.bigquery
    
    bqclient = google.cloud.bigquery.Client()
    bqclient.create_dataset("bqml_tutorial", exists_ok=True)

    Zeitreihendaten vorbereiten

    Aggregieren Sie die Wikipedia-Seitenansichtsdaten für die Seite Google I/O in einer einzigen Tabelle, gruppiert nach Tag:

    1. Rufen Sie die Seite BigQuery auf.

      BigQuery aufrufen

    2. Führen Sie im SQL-Editorbereich die folgende SQL-Anweisung aus:

      CREATE OR REPLACE TABLE `bqml_tutorial.googleio_page_views`
      AS
      SELECT
        DATETIME_TRUNC(datehour, DAY) AS date,
        SUM(views) AS views
      FROM
        `bigquery-public-data.wikipedia.pageviews_*`
      WHERE
        datehour >= '2017-01-01'
        AND datehour < '2023-01-01'
        AND title = 'Google_I/O'
      GROUP BY
        DATETIME_TRUNC(datehour, DAY)

    Ein Prognosemodell für eine Zeitreihe mit integrierten Feiertagen erstellen

    Erstellen Sie ein Modell, mit dem tägliche Seitenaufrufe für die Wikipedia-Seite „Google I/O“ basierend auf den Seitenaufrufdaten vor 2022 prognostiziert werden. Dabei werden integrierte Feiertage berücksichtigt.

    1. Rufen Sie die Seite BigQuery auf.

      BigQuery aufrufen

    2. Führen Sie im SQL-Editorbereich die folgende SQL-Anweisung aus:

      CREATE OR REPLACE MODEL `bqml_tutorial.forecast_googleio`
        OPTIONS (
          model_type = 'ARIMA_PLUS',
          holiday_region = 'US',
          time_series_timestamp_col = 'date',
          time_series_data_col = 'views',
          data_frequency = 'DAILY',
          horizon = 365)
      AS
      SELECT
        *
      FROM
        `bqml_tutorial.googleio_page_views`
      WHERE
        date < '2022-01-01';

    Prognostizierte Ergebnisse visualisieren

    Nachdem Sie das Modell mithilfe der integrierten Feiertage erstellt haben, verknüpfen Sie die Originaldaten aus der Tabelle bqml_tutorial.googleio_page_views mit dem prognostizierten Wert aus der Funktion ML.EXPLAIN_FORECAST und visualisieren Sie sie dann mit Looker Studio:

    1. Rufen Sie die Seite BigQuery auf.

      BigQuery aufrufen

    2. Führen Sie im SQL-Editorbereich die folgende SQL-Anweisung aus:

      SELECT
        original.date,
        original.views AS original_views,
        explain_forecast.time_series_adjusted_data
          AS adjusted_views_without_custom_holiday,
      FROM
        `bqml_tutorial.googleio_page_views` original
      INNER JOIN
        (
          SELECT
            *
          FROM
            ML.EXPLAIN_FORECAST(
              MODEL `bqml_tutorial.forecast_googleio`,
              STRUCT(365 AS horizon))
        ) explain_forecast
        ON
          TIMESTAMP(original.date)
          = explain_forecast.time_series_timestamp
      ORDER BY
        original.date;
    3. Klicken Sie im Bereich Abfrageergebnisse auf Daten auswerten und dann auf Mit Looker Studio auswerten. Looker Studio wird in einem neuen Tab geöffnet.

    4. Klicken Sie im Tab „Looker Studio“ auf Diagramm hinzufügen und dann auf das Zeitreihendiagramm:

      Ein Zeitreihendiagramm hinzufügen

      Platzieren Sie das Diagramm im Bericht.

    5. Klicken Sie im Tab Einrichtung des Bereichs Diagramm auf Messwert hinzufügen und wählen Sie adjusted_views_with_custom_holiday aus.

      Fügen Sie einen weiteren Messwert hinzu.

      Das Diagramm sieht dann ungefähr so aus:

      Zeitreihendiagramm der Prognoseergebnisse mit integrierten Feiertagen

      Wie Sie sehen, erfasst das Prognosemodell den allgemeinen Trend recht gut. Der erhöhte Traffic im Zusammenhang mit vorherigen Google I/O-Ereignissen wird jedoch nicht erfasst und es erstellt keine genaue Prognose für

      1. In den nächsten Abschnitten erfahren Sie, wie Sie mit einigen dieser Einschränkungen umgehen können.

    Ein Prognosemodell für eine Zeitreihe mit integrierten und benutzerdefinierten Feiertagen erstellen

    Wie Sie im Google I/O-Verlauf sehen können, fand die Google I/O zwischen 2017 und 2022 an unterschiedlichen Terminen statt. Um diese Variante zu berücksichtigen, erstellen Sie ein Modell, mit dem Seitenaufrufe für die Wikipedia-Seite „Google_I/O“ bis 2022 basierend auf den Seitenaufrufdaten vor 2022 prognostiziert werden. Außerdem werden benutzerdefinierte Feiertage verwendet, um die Google I/O-Ereignisse jedes Jahr darzustellen. In diesem Modell passen Sie das Fenster für den Feiertagseffekt so an, dass es drei Tage vor und nach dem Ereignisdatum umfasst, um potenziellen Seiten-Traffic vor und nach dem Ereignis besser zu erfassen.

    1. Rufen Sie die Seite BigQuery auf.

      BigQuery aufrufen

    2. Führen Sie im SQL-Editorbereich die folgende SQL-Anweisung aus:

      CREATE OR REPLACE MODEL `bqml_tutorial.forecast_googleio_with_custom_holiday`
        OPTIONS (
          model_type = 'ARIMA_PLUS',
          holiday_region = 'US',
          time_series_timestamp_col = 'date',
          time_series_data_col = 'views',
          data_frequency = 'DAILY',
          horizon = 365)
      AS (
        training_data AS (
            SELECT
              *
            FROM
              `bqml_tutorial.googleio_page_views`
            WHERE
              date < '2022-01-01'
          ),
        custom_holiday AS (
            SELECT
              'US' AS region,
              'GoogleIO' AS holiday_name,
              primary_date,
              1 AS preholiday_days,
              2 AS postholiday_days
            FROM
              UNNEST(
                [
                  DATE('2017-05-17'),
                  DATE('2018-05-08'),
                  DATE('2019-05-07'),
                  -- cancelled in 2020 due to pandemic
                  DATE('2021-05-18'),
                  DATE('2022-05-11')])
                AS primary_date
          )
      );

    Prognostizierte Ergebnisse visualisieren

    Nachdem Sie das Modell mithilfe der benutzerdefinierten Feiertage erstellt haben, verknüpfen Sie die Originaldaten aus der Tabelle bqml_tutorial.googleio_page_views mit dem prognostizierten Wert aus der Funktion ML.EXPLAIN_FORECAST und visualisieren Sie sie dann mit Looker Studio:

    1. Rufen Sie die Seite BigQuery auf.

      BigQuery aufrufen

    2. Führen Sie im SQL-Editorbereich die folgende SQL-Anweisung aus:

      SELECT
        original.date,
        original.views AS original_views,
        explain_forecast.time_series_adjusted_data
          AS adjusted_views_with_custom_holiday,
      FROM
        `bqml_tutorial.googleio_page_views` original
      INNER JOIN
        (
          SELECT
            *
          FROM
            ML.EXPLAIN_FORECAST(
              MODEL
                `bqml_tutorial.forecast_googleio_with_custom_holiday`,
              STRUCT(365 AS horizon))
        ) explain_forecast
        ON
          TIMESTAMP(original.date)
          = explain_forecast.time_series_timestamp
      ORDER BY
        original.date;
    3. Klicken Sie im Bereich Abfrageergebnisse auf Daten auswerten und dann auf Mit Looker Studio auswerten. Looker Studio wird in einem neuen Tab geöffnet.

    4. Klicken Sie im Tab „Looker Studio“ auf Diagramm hinzufügen, klicken Sie auf das Zeitreihendiagramm und platzieren Sie das Diagramm im Bericht.

    5. Klicken Sie im Tab Einrichtung des Bereichs Diagramm auf Messwert hinzufügen und wählen Sie adjusted_views_with_custom_holiday aus.

      Das Diagramm sieht dann ungefähr so aus:

      Zeitreihendiagramm der Prognoseergebnisse mit benutzerdefinierten Feiertagen

      Wie Sie sehen, haben die benutzerdefinierten Feiertage die Leistung des Prognosemodells erhöht. Damit wird jetzt die Anzahl der Seitenaufrufe erfasst, die durch Google I/O verursacht werden.

    Feiertagsinformationen überprüfen

    Prüfen Sie mit der Funktion ML.HOLIDAY_INFO die Liste der Feiertage, die während der Modellierung berücksichtigt wurden:

    1. Rufen Sie die Seite BigQuery auf.

      BigQuery aufrufen

    2. Führen Sie im SQL-Editorbereich die folgende SQL-Anweisung aus:

      SELECT *
      FROM
        ML.HOLIDAY_INFO(
          MODEL `bqml_tutorial.forecast_googleio_with_custom_holiday`);

      In den Ergebnissen werden Google I/O und die integrierten Feiertage in der Liste der Feiertage angezeigt:

      Ergebnisse der Funktion ML.HOLIDAY_INFO

    Auswirkungen der benutzerdefinierten Feiertage bewerten

    Die Auswirkungen der benutzerdefinierten Feiertage auf die prognostizierten Ergebnisse können Sie mit der Funktion ML.EXPLAIN_FORECAST bewerten:

    1. Rufen Sie die Seite BigQuery auf.

      BigQuery aufrufen

    2. Führen Sie im SQL-Editorbereich die folgende SQL-Anweisung aus:

      SELECT
        time_series_timestamp,
        holiday_effect_GoogleIO,
        holiday_effect_US_Juneteenth,
        holiday_effect_Christmas,
        holiday_effect_NewYear
      FROM
        ML.EXPLAIN_FORECAST(
          model
            `bqml_tutorial.forecast_googleio_with_custom_holiday`,
          STRUCT(365 AS horizon))
      WHERE holiday_effect != 0;

      Die Ergebnisse zeigen, dass Google I/O einen großen Teil der Feiertagseffekte zu den prognostizierten Ergebnissen beiträgt:

      Ergebnisse der Funktion ML.EXPLAIN_FORECAST

    Modellleistung vergleichen

    Mit der Funktion ML.EVALUATE können Sie die Leistung des ersten Modells, das ohne benutzerdefinierte Feiertage erstellt wurde, und des zweiten Modells, das mit benutzerdefinierten Feiertagen erstellt wurde, vergleichen. Legen Sie den Zeitraum auf die Woche der Google I/O im Jahr 2022 fest, um zu sehen, wie das zweite Modell bei der Prognose eines zukünftigen benutzerdefinierten Feiertages funktioniert:

    1. Rufen Sie die Seite BigQuery auf.

      BigQuery aufrufen

    2. Führen Sie im SQL-Editorbereich die folgende SQL-Anweisung aus:

      SELECT
        "original" AS model_type,
        *
      FROM
        ml.evaluate(
          MODEL `bqml_tutorial.forecast_googleio`,
          (
            SELECT
              *
            FROM
              `bqml_tutorial.googleio_page_views`
            WHERE
              date >= '2022-05-08'
              AND date < '2022-05-12'
          ),
          STRUCT(
            365 AS horizon,
            TRUE AS perform_aggregation))
      UNION ALL
      SELECT
        "with_custom_holiday" AS model_type,
        *
      FROM
        ml.evaluate(
          MODEL
            `bqml_tutorial.forecast_googleio_with_custom_holiday`,
          (
            SELECT
              *
            FROM
              `bqml_tutorial.googleio_page_views`
            WHERE
              date >= '2022-05-08'
              AND date < '2022-05-12'
          ),
          STRUCT(
            365 AS horizon,
            TRUE AS perform_aggregation));

      Die Ergebnisse zeigen, dass das zweite Modell eine erhebliche Leistungsverbesserung bietet:

      Ergebnisse der Funktion ML.EXPLAIN_FORECAST

    Bereinigen

    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.