在 ARIMA_PLUS 時間序列預測模型中使用自訂假日

本教學課程將說明如何執行下列工作:

  • 建立只使用內建假日的ARIMA_PLUS 時間序列預測模型
  • 建立 ARIMA_PLUS 時間序列預測模型,除了使用內建假日,還可使用自訂假日。
  • 以視覺化方式呈現這些模型的預測結果。
  • 檢查模型,查看模型模擬哪些節日。
  • 評估自訂節日對預測結果的影響。
  • 比較只使用內建假日的模型與使用內建假日和自訂假日的模型,看看哪個模型的成效較佳。

本教學課程使用 bigquery-public-data.wikipedia.pageviews_* 公開資料表。

所需權限

  • 如要建立資料集,您必須具備 bigquery.datasets.create IAM 權限。

  • 您必須具備下列權限,才能建立模型:

    • bigquery.jobs.create
    • bigquery.models.create
    • bigquery.models.getData
    • bigquery.models.updateData
  • 如要執行推論,您需要具備下列權限:

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

如要進一步瞭解 BigQuery 中的 IAM 角色和權限,請參閱「IAM 簡介」。

費用

在本文件中,您會使用 Google Cloud的下列計費元件:

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

您可以使用 Pricing Calculator 根據預測用量產生預估費用。 新 Google Cloud 使用者可能符合申請免費試用的資格。

詳情請參閱 BigQuery 價格一文。

事前準備

  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. Enable the BigQuery API.

    Enable the API

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

    Go to project selector

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

  7. Enable the BigQuery API.

    Enable the API

  8. 建立資料集

    建立 BigQuery 資料集來儲存機器學習模型。

    控制台

    1. 前往 Google Cloud 控制台的「BigQuery」頁面。

      前往「BigQuery」頁面

    2. 在「Explorer」窗格中,按一下專案名稱。

    3. 依序點選 「View actions」(查看動作) >「Create dataset」(建立資料集)

      「建立資料集」選單選項。

    4. 在「Create dataset」頁面上執行下列操作:

      • 在「Dataset ID」(資料集 ID) 中輸入 bqml_tutorial

      • 在「位置類型」中選取「多區域」,然後選取「美國 (多個美國區域)」

      • 保留其餘預設設定,然後點選「Create dataset」(建立資料集)

    bq

    如要建立新的資料集,請使用 bq mk 指令搭配 --location 旗標。如需可能參數的完整清單,請參閱 bq mk --dataset 指令參考資料。

    1. 建立名為 bqml_tutorial 的資料集,並將資料位置設為 US,說明為 BigQuery ML tutorial dataset

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

      這個指令採用 -d 捷徑,而不是使用 --dataset 旗標。如果您省略 -d--dataset,該指令預設會建立資料集。

    2. 確認資料集已建立:

      bq ls

    API

    請呼叫 datasets.insert 方法,搭配已定義的資料集資源

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

    BigQuery DataFrames

    在嘗試這個範例之前,請先參閱 BigQuery 快速入門:使用 BigQuery DataFrames,按照 BigQuery DataFrames 設定說明進行操作。詳情請參閱 BigQuery DataFrames 參考資料說明文件

    如要向 BigQuery 進行驗證,請設定應用程式預設憑證。詳情請參閱「為本機開發環境設定 ADC」。

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

    準備時間序列資料

    Google I/O 網頁的 Wikipedia 網頁瀏覽資料匯總到單一表格,並依日期分組:

    1. 前往「BigQuery」頁面

      前往 BigQuery

    2. 在 SQL 編輯器窗格中執行下列 SQL 陳述式:

      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)

    建立使用內建假日的時間序列預測模型

    建立模型,根據 2022 年前的網頁瀏覽資料,並考量內建假日,預測 Wikipedia「Google I/O」頁面的每日網頁瀏覽量:

    1. 前往「BigQuery」頁面

      前往 BigQuery

    2. 在 SQL 編輯器窗格中執行下列 SQL 陳述式:

      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';

    以圖表呈現預測結果

    使用內建假日建立模型後,請將 bqml_tutorial.googleio_page_views 資料表的原始資料與 ML.EXPLAIN_FORECAST 函式的預測值彙整,然後使用 Looker Studio以圖表呈現:

    1. 前往「BigQuery」頁面

      前往 BigQuery

    2. 在 SQL 編輯器窗格中執行下列 SQL 陳述式:

      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. 在「查詢結果」窗格中,依序點選「探索資料」和「透過 Looker Studio 探索」。Looker Studio 會在新分頁中開啟。

    4. 在 Looker Studio 分頁中,按一下「新增圖表」,然後點選時間序列圖表:

      新增時序圖。

      將圖表放到報表上。

    5. 在「圖表」窗格的「設定」分頁中,按一下「新增指標」,然後選取「adjusted_views_without_custom_holiday」

      新增其他指標。

      圖表如下所示:

      使用內建假日的預測結果時間序列圖表

      您可以看到預測模型相當準確地掌握整體趨勢。不過,這項指標並未擷取與先前 Google I/O 活動相關的流量增加情形,因此無法產生準確的預測數據。

      1. 接下來的章節將說明如何處理其中部分限制。

    建立使用內建假日和自訂假日的時間序列預測模型

    如您在 Google I/O 歷史記錄中看到的,Google I/O 活動在 2017 年至 2022 年間的不同日期舉行。為考量這項變化,請建立模型,根據 2022 年前的網頁瀏覽資料,預測 Wikipedia「Google_I/O」網頁在 2022 年前後的網頁瀏覽量,並使用自訂節日來代表每年的 Google I/O 活動。在這個模型中,您也調整了節慶效應視窗,涵蓋活動日期前後三天,以便更準確地擷取活動前後的部分潛在網頁流量。

    1. 前往「BigQuery」頁面

      前往 BigQuery

    2. 在 SQL 編輯器窗格中執行下列 SQL 陳述式:

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

    以圖表呈現預測結果

    使用自訂假日建立模型後,請將 bqml_tutorial.googleio_page_views 資料表的原始資料與 ML.EXPLAIN_FORECAST 函式的預測值彙整,然後使用 Looker Studio以視覺化方式呈現:

    1. 前往「BigQuery」頁面

      前往 BigQuery

    2. 在 SQL 編輯器窗格中執行下列 SQL 陳述式:

      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. 在「查詢結果」窗格中,依序點選「探索資料」和「透過 Looker Studio 探索」。Looker Studio 會在新分頁中開啟。

    4. 在 Looker Studio 分頁中,按一下「新增圖表」,然後點選時間序列圖表,並將圖表放置在報表上。

    5. 在「圖表」窗格的「設定」分頁中,點選「新增指標」,然後選取「adjusted_views_with_custom_holiday」

      圖表如下所示:

      使用自訂假日的預測結果時序圖

      如您所見,自訂假日提升了預測模型的成效。這項指標現在可有效擷取 Google I/O 造成的網頁瀏覽次數增加情形。

    檢查假日資訊

    使用 ML.HOLIDAY_INFO 函式檢查模擬期間考慮的節日清單:

    1. 前往「BigQuery」頁面

      前往 BigQuery

    2. 在 SQL 編輯器窗格中執行下列 SQL 陳述式:

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

      結果會在節日清單中顯示 Google I/O 和內建節日:

      ML.HOLIDAY_INFO 函式的結果。

    評估自訂節慶的影響

    使用 ML.EXPLAIN_FORECAST 函式,評估自訂節日對預測結果的影響:

    1. 前往「BigQuery」頁面

      前往 BigQuery

    2. 在 SQL 編輯器窗格中執行下列 SQL 陳述式:

      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;

      結果顯示,Google I/O 對預測結果的節慶效應貢獻很大:

      ML.EXPLAIN_FORECAST 函式的結果。

    比較模型效能

    使用 ML.EVALUATE 函式比較在未使用自訂假日的情況下建立的第一個模型,以及在使用自訂假日的情況下建立的第二個模型的效能。如要查看第二個模型在預測未來自訂節慶時的表現,請將時間範圍設為 2022 年 Google I/O 大會的當週:

    1. 前往「BigQuery」頁面

      前往 BigQuery

    2. 在 SQL 編輯器窗格中執行下列 SQL 陳述式:

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

      結果顯示,第二個模型的成效大幅提升:

      ML.EXPLAIN_FORECAST 函式的結果。

    清除所用資源

    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.