使用多變數模型預測單一時間序列


本教學課程將說明如何使用多變量時間序列模型,根據多個輸入特徵的歷史值,預測特定資料欄的未來值。

本教學課程將預測單一時間序列。系統會針對輸入資料中的每個時間點計算一次預測值。

本教學課程使用 bigquery-public-data.epa_historical_air_quality 公開資料集的資料。這個資料集包含來自多個美國城市的每日懸浮微粒 (PM2.5)、溫度和風速資訊。

目標

本教學課程會逐步引導您完成下列工作:

費用

本教學課程使用 Google Cloud的計費元件,包括:

  • BigQuery
  • BigQuery ML

如要進一步瞭解 BigQuery 費用,請參閱 BigQuery 定價頁面。

如要進一步瞭解 BigQuery ML 費用,請參閱 BigQuery ML 定價

事前準備

  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。如要在現有的專案中啟用 BigQuery,請前往

    Enable the BigQuery API.

    Enable the API

  7. 所需權限

    • 如要建立資料集,您必須具備 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 簡介」。

建立資料集

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

建立輸入資料表

建立資料表,用於訓練及評估模型。這個資料表會結合 bigquery-public-data.epa_historical_air_quality 資料集中多個資料表的資料欄,以提供每日資料天氣資料。您也需要建立下列資料欄,做為模型的輸入變數:

  • date:觀測日期
  • pm25 每天的平均 PM2.5 值
  • wind_speed:每天的平均風速
  • temperature:每個日期的最高溫度

在下列 GoogleSQL 查詢中,FROM bigquery-public-data.epa_historical_air_quality.*_daily_summary 子句表示您正在 epa_historical_air_quality 資料集中查詢 *_daily_summary 資料表。這些資料表是分區資料表

請按照下列步驟建立輸入資料表:

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

    前往 BigQuery

  2. 在查詢編輯器中貼上以下查詢,然後點選「執行」

    CREATE TABLE `bqml_tutorial.seattle_air_quality_daily`
    AS
    WITH
      pm25_daily AS (
        SELECT
          avg(arithmetic_mean) AS pm25, date_local AS date
        FROM
          `bigquery-public-data.epa_historical_air_quality.pm25_nonfrm_daily_summary`
        WHERE
          city_name = 'Seattle'
          AND parameter_name = 'Acceptable PM2.5 AQI & Speciation Mass'
        GROUP BY date_local
      ),
      wind_speed_daily AS (
        SELECT
          avg(arithmetic_mean) AS wind_speed, date_local AS date
        FROM
          `bigquery-public-data.epa_historical_air_quality.wind_daily_summary`
        WHERE
          city_name = 'Seattle' AND parameter_name = 'Wind Speed - Resultant'
        GROUP BY date_local
      ),
      temperature_daily AS (
        SELECT
          avg(first_max_value) AS temperature, date_local AS date
        FROM
          `bigquery-public-data.epa_historical_air_quality.temperature_daily_summary`
        WHERE
          city_name = 'Seattle' AND parameter_name = 'Outdoor Temperature'
        GROUP BY date_local
      )
    SELECT
      pm25_daily.date AS date, pm25, wind_speed, temperature
    FROM pm25_daily
    JOIN wind_speed_daily USING (date)
    JOIN temperature_daily USING (date);

以視覺化方式呈現輸入資料

建立模型前,您可以視需要將輸入的時間序列資料以視覺化方式呈現,以便瞭解分布情形。您可以使用 Looker Studio 執行這項操作。

如要以視覺化方式呈現時間序列資料,請按照下列步驟操作:

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

    前往 BigQuery

  2. 在查詢編輯器中貼上以下查詢,然後點選「執行」

    SELECT
      *
    FROM
      `bqml_tutorial.seattle_air_quality_daily`;
  3. 查詢完成後,請依序點選「探索資料」「透過 Looker Studio 探索」。Looker Studio 會在新分頁中開啟。請在新分頁中完成下列步驟。

  4. 在 Looker Studio 中,依序點選「插入」>「時序圖表」

  5. 在「圖表」窗格中,選擇「設定」分頁標籤。

  6. 在「指標」專區中,新增「pm2.5」、「溫度」和「風速」欄位,並移除預設的「記錄計數」指標。產生的圖表如下所示:

    顯示天氣隨時間變化的圖表。

    從圖表中,您可以看到輸入的時間序列具有週期性季節模式。

建立時間序列模型

建立時間序列模型,使用 pm25wind_speedtemperature 欄值做為輸入變數,預測 pm25 欄所代表的懸浮微粒值。針對 bqml_tutorial.seattle_air_quality_daily 資料表中的空氣品質資料訓練模型,選取 2012 年 1 月 1 日至 2020 年 12 月 31 日期間收集的資料。

在以下查詢中,OPTIONS(model_type='ARIMA_PLUS_XREG', time_series_timestamp_col='date', ...) 子句表示您要建立使用外部迴歸變項的 ARIMA 模型。CREATE MODEL 陳述式的 auto_arima 選項預設為 TRUE,因此 auto.ARIMA 演算法會自動調整模型中的超參數。演算法會測試數十個候選模型,並選擇最佳模型,也就是赤池訊息量準則 (AIC) 最低的模型。CREATE MODEL 陳述式的 data_frequency 選項預設為 AUTO_FREQUENCY,因此訓練程序會自動推斷輸入時間序列的資料頻率。

請按照下列步驟建立模型:

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

    前往 BigQuery

  2. 在查詢編輯器中貼上以下查詢,然後點選「執行」

    CREATE OR REPLACE
      MODEL
        `bqml_tutorial.seattle_pm25_xreg_model`
      OPTIONS (
        MODEL_TYPE = 'ARIMA_PLUS_XREG',
        time_series_timestamp_col = 'date',  # Identifies the column that contains time points
        time_series_data_col = 'pm25')       # Identifies the column to forecast
    AS
    SELECT
      date,                                  # The column that contains time points
      pm25,                                  # The column to forecast
      temperature,                           # Temperature input to use in forecasting
      wind_speed                             # Wind speed input to use in forecasting
    FROM
      `bqml_tutorial.seattle_air_quality_daily`
    WHERE
      date
      BETWEEN DATE('2012-01-01')
      AND DATE('2020-12-31');

    查詢作業完成 (約需 20 秒) 後,seattle_pm25_xreg_model 模型就會顯示在「探索器」窗格中。由於查詢是使用 CREATE MODEL 陳述式建立模型,因此您不會看到查詢結果。

評估候選模型

使用 ML.ARIMA_EVALUATE 函式評估時間序列模型。ML.ARIMA_EVALUATE 函式會顯示自動超參數調整過程中評估的所有候選模型評估指標。

如要評估模型,請按照下列步驟操作:

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

    前往 BigQuery

  2. 在查詢編輯器中貼上以下查詢,然後點選「執行」

    SELECT
     *
    FROM
     ML.ARIMA_EVALUATE(MODEL `bqml_tutorial.seattle_pm25_xreg_model`);

    結果應如下所示:

    時間序列模型的評估指標。

    non_seasonal_pnon_seasonal_dnon_seasonal_qhas_drift 輸出欄會在訓練管道中定義 ARIMA 模型。log_likelihoodAICvariance 輸出資料欄與 ARIMA 模型擬合程序相關。

    auto.ARIMA 演算法會使用 KPSS 測試來判斷 non_seasonal_d 的最佳值,在本例中為 1。當 non_seasonal_d1 時,auto.ARIMA 演算法會並行訓練 42 個不同的 ARIMA 候選模型。在這個範例中,所有 42 個候選模型皆有效,因此輸出內容包含 42 列,每個 ARIMA 候選模型一列;如果部分模型無效,則會從輸出內容中排除。系統會依 AIC 遞增順序傳回這些候選模型。第一列的模型 AIC 值最低,因此被視為最佳模型。最佳模型會儲存為最終模型,並在您對模型呼叫 ML.FORECAST 等函式時使用。

    seasonal_periods 欄包含時間序列資料中所識別的季節性模式相關資訊。這與 ARIMA 模擬無關,因此所有輸出資料列的值都相同。它會回報每週的模式,這與您選擇將輸入資料視覺化的結果相符。

    has_holiday_effecthas_spikes_and_dipshas_step_changes 欄會提供輸入時間序列資料的相關資訊,與 ARIMA 模擬無關。系統會傳回這些資料欄,因為 CREATE MODEL 陳述式中 decompose_time_series 選項的值為 TRUE。這些欄在所有輸出資料列中也具有相同的值。

    error_message 欄會顯示 auto.ARIMA 配戴過程中發生的任何錯誤。發生錯誤的其中一個可能原因是所選取的 non_seasonal_pnon_seasonal_dnon_seasonal_qhas_drift 欄無法穩定時間序列。如要擷取所有候選模型的錯誤訊息,請在建立模型時將 show_all_candidate_models 選項設為 TRUE

    如要進一步瞭解輸出資料欄,請參閱 ML.ARIMA_EVALUATE 函式

檢查模型的係數

使用 ML.ARIMA_COEFFICIENTS 函式檢查時間序列模型的係數。

如要擷取模型的係數,請按照下列步驟操作:

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

    前往 BigQuery

  2. 在查詢編輯器中貼上以下查詢,然後點選「執行」

    SELECT
     *
    FROM
     ML.ARIMA_COEFFICIENTS(MODEL `bqml_tutorial.seattle_pm25_xreg_model`);

    結果應如下所示:

    時間序列模型的係數。

    ar_coefficients 輸出資料欄會顯示 ARIMA 模型自迴歸 (AR) 部分的模型係數。同樣地,ma_coefficients 輸出資料欄會顯示 ARIMA 模型中移動平均值 (MA) 部分的模型係數。這兩個資料欄都包含陣列值,長度分別等於 non_seasonal_pnon_seasonal_q。您在 ML.ARIMA_EVALUATE 函式的輸出內容中看到,最佳模型的 non_seasonal_p 值為 0non_seasonal_q 值為 5。因此,在 ML.ARIMA_COEFFICIENTS 輸出內容中,ar_coefficients 值為空陣列,而 ma_coefficients 值為 5 個元素的陣列。intercept_or_drift 值是 ARIMA 模型中的常數項。

    processed_inputweightcategory_weights 輸出欄會顯示線性迴歸模型中每項特徵的權重和截距。如果特徵是數值特徵,權重會位於 weight 欄中。如果特徵是類別特徵,category_weights 值就是結構體值的陣列,其中每個結構體值都包含指定類別的名稱和權重。

    如要進一步瞭解輸出資料欄,請參閱 ML.ARIMA_COEFFICIENTS 函式

使用模型預測資料

使用 ML.FORECAST 函式預測未來的時間序列值。

在下列 GoogleSQL 查詢中,STRUCT(30 AS horizon, 0.8 AS confidence_level) 子句表示查詢會預測 30 個未來時間點,並產生 80% 信賴水準的預測間隔。

如要使用模型預測資料,請按照下列步驟操作:

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

    前往 BigQuery

  2. 在查詢編輯器中貼上以下查詢,然後點選「執行」

    SELECT
      *
    FROM
      ML.FORECAST(
        MODEL `bqml_tutorial.seattle_pm25_xreg_model`,
        STRUCT(30 AS horizon, 0.8 AS confidence_level),
        (
          SELECT
            date,
            temperature,
            wind_speed
          FROM
            `bqml_tutorial.seattle_air_quality_daily`
          WHERE
            date > DATE('2020-12-31')
        ));

    結果應如下所示:

    時間序列模型的預測結果。

    輸出資料列會依據 forecast_timestamp 資料欄值按時間順序排列。在時間序列預測中,prediction_interval_lower_boundprediction_interval_upper_bound 欄值所代表的預測間隔,與 forecast_value 欄值同樣重要。forecast_value 值是預測區間的中間點。預測間隔取決於 standard_errorconfidence_level 欄值。

    如要進一步瞭解輸出資料欄,請參閱 ML.FORECAST 函式

評估預測準確度

使用 ML.EVALUATE 函式評估模型的預測準確度。

在下列 GoogleSQL 查詢中,第二個 SELECT 陳述式會為資料提供未來特徵,用於預測未來值,並與實際資料進行比較。

請按照下列步驟評估模型的準確度:

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

    前往 BigQuery

  2. 在查詢編輯器中貼上以下查詢,然後點選「執行」

    SELECT
      *
    FROM
      ML.EVALUATE(
        MODEL `bqml_tutorial.seattle_pm25_xreg_model`,
        (
          SELECT
            date,
            pm25,
            temperature,
            wind_speed
          FROM
            `bqml_tutorial.seattle_air_quality_daily`
          WHERE
            date > DATE('2020-12-31')
        ),
        STRUCT(
          TRUE AS perform_aggregation,
          30 AS horizon));

    結果應如下所示:

    模型的評估指標。

    如要進一步瞭解輸出資料欄,請參閱 ML.EVALUATE 函式

解釋預測結果

您可以使用 ML.EXPLAIN_FORECAST 函式,除了預測資料之外,還能取得可解釋指標。ML.EXPLAIN_FORECAST 函式可預測未來的時間序列值,並傳回時間序列的所有個別元件。

ML.FORECAST 函式類似,ML.EXPLAIN_FORECAST 函式中使用的 STRUCT(30 AS horizon, 0.8 AS confidence_level) 子句表示查詢會預測 30 個未來時間點,並產生 80% 信心等級的預測區間。

請按照下列步驟說明模型的結果:

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

    前往 BigQuery

  2. 在查詢編輯器中貼上以下查詢,然後點選「執行」

    SELECT
      *
    FROM
      ML.EXPLAIN_FORECAST(
        MODEL `bqml_tutorial.seattle_pm25_xreg_model`,
        STRUCT(30 AS horizon, 0.8 AS confidence_level),
        (
          SELECT
            date,
            temperature,
            wind_speed
          FROM
            `bqml_tutorial.seattle_air_quality_daily`
          WHERE
            date > DATE('2020-12-31')
        ));

    結果應如下所示:

    預測資料和預測說明的前九個輸出資料欄。 第十到第十七列的輸出資料欄,包含預測資料和預測說明。 預測資料和預測說明的最後六個輸出欄。

    輸出資料列會依照 time_series_timestamp 欄值按時間排序。

    如要進一步瞭解輸出資料欄,請參閱 ML.EXPLAIN_FORECAST 函式

清除所用資源

如要避免系統向您的 Google Cloud 帳戶收取本教學課程中所用資源的相關費用,請刪除含有該項資源的專案,或者保留專案但刪除個別資源。

  • 您可以刪除建立的專案。
  • 或者您可以保留專案並刪除資料集。

刪除資料集

刪除專案將移除專案中所有的資料集與資料表。若您希望重新使用專案,您可以刪除本教學課程中所建立的資料集。

  1. 如有必要,請在Google Cloud 控制台中開啟 BigQuery 頁面。

    前往「BigQuery」頁面

  2. 在導覽窗格中,按一下您建立的 bqml_tutorial 資料集。

  3. 按一下視窗右側的「Delete dataset」。這個動作將會刪除資料集、資料表,以及所有資料。

  4. 在「Delete dataset」對話方塊中,輸入資料集的名稱 (bqml_tutorial),然後按一下「Delete」來確認刪除指令。

刪除專案

如要刪除專案,請進行以下操作:

  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.

後續步驟