多変量モデルを使用して単一の時系列を予測する

このチュートリアルでは、多変量時系列モデルを使用して、複数の入力特徴の過去の値に基づいて、特定の列の将来の値を予測する方法について説明します。

このチュートリアルでは、単一の時系列を予測します。予測値は、入力データの各時点に対して 1 回ずつ計算されます。

このチュートリアルでは、bigquery-public-data.epa_historical_air_quality 一般公開データセットのデータを使用します。このデータセットには、米国の複数の都市から毎日収集された粒子状物質(PM2.5)、気温、風速に関する情報が含まれています。

データセットを作成する

ML モデルを保存する BigQuery データセットを作成します。

コンソール

  1. Cloud de Confiance コンソールで、[BigQuery] ページに移動します。

    [BigQuery] ページに移動

  2. [エクスプローラ] ペインで、プロジェクト名をクリックします。

  3. [アクションを表示] > [データセットを作成] をクリックします。

  4. [データセットを作成する] ページで、次の操作を行います。

    • [データセット ID] に「bqml_tutorial」と入力します。

    • [ロケーション タイプ] で [マルチリージョン] を選択してから、[US(米国の複数のリージョン)] を選択します。

    • 残りのデフォルトの設定は変更せず、[データセットを作成] をクリックします。

bq

新しいデータセットを作成するには、--location フラグを指定した bq mk コマンドを使用します。使用可能なパラメータの一覧については、bq mk --dataset コマンドのリファレンスをご覧ください。

  1. データの場所が US に設定され、BigQuery ML tutorial dataset という説明の付いた、bqml_tutorial という名前のデータセットを作成します。

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

    このコマンドでは、--dataset フラグの代わりに -d ショートカットを使用しています。-d--dataset を省略した場合、このコマンドはデフォルトでデータセットを作成します。

  2. データセットが作成されたことを確認します。

    bq ls

API

定義済みのデータセット リソースを使用して datasets.insert メソッドを呼び出します。

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

BigQuery DataFrames

このサンプルを試す前に、BigQuery DataFrames を使用した BigQuery クイックスタートの手順に沿って 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. Cloud de Confiance コンソールで、[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. Cloud de Confiance コンソールで、[BigQuery] ページに移動します。

    [BigQuery] に移動

  2. クエリエディタに次のクエリを貼り付け、[実行] をクリックします。

    SELECT
      *
    FROM
      `bqml_tutorial.seattle_air_quality_daily`;
  3. クエリが完了したら、[データを探索] > [Looker Studio で調べる] をクリックします。Looker Studio が新しいタブで開きます。新しいタブで次の操作を行います。

  4. Looker Studio で、[挿入] > [期間グラフ] をクリックします。

  5. [グラフ] ペインで、[設定] タブを選択します。

  6. [指標] セクションで、pm25temperaturewind_speed の各フィールドを追加し、デフォルトの指標である [レコード数] を削除します。作成されたグラフは次のようになります。

    時間経過に伴う天候の変化を示すグラフ。

    グラフを見ると、入力時系列には週ごとの季節パターンがあることがわかります。

時系列モデルを作成する

pm25wind_speedtemperature 列の値を入力変数として使用し、pm25 列で表される粒子状物質の値を予測する時系列モデルを作成します。2012 年 1 月 1 日から 2020 年 12 月 31 日までに収集されたデータを選択し、bqml_tutorial.seattle_air_quality_daily テーブルの大気質データでモデルをトレーニングします。

次のクエリでは、OPTIONS(model_type='ARIMA_PLUS_XREG', time_series_timestamp_col='date', ...) 句は、外部リグレッサー モデルの ARIMA を作成することを示します。CREATE MODEL ステートメントの auto_arima オプションはデフォルトで TRUE であるため、auto.ARIMA アルゴリズムによってモデルのハイパーパラメータが自動的にチューニングされます。アルゴリズムが多数の候補モデルを学習し、Akaike information criterion(AIC)が最も低い最適なモデルを選択します。CREATE MODEL ステートメントの data_frequency オプションはデフォルトで AUTO_FREQUENCY に設定されているため、トレーニング プロセスでは入力時系列のデータ頻度が自動的に推定されます。

次の手順でモデルを作成します。

  1. Cloud de Confiance コンソールで、[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. Cloud de Confiance コンソールで、[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 候補モデルごとに 1 行)が含まれます。一部のモデルが無効な場合は、出力から除外されます。これらの候補モデルは、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. Cloud de Confiance コンソールで、[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. Cloud de Confiance コンソールで、[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_bound 列と prediction_interval_upper_bound 列の値で表される予測間隔は、forecast_value 列の値と同じくらい重要です。forecast_value 値は予測間隔の中間点です。予測間隔は、standard_error 列と confidence_level 列の値によって異なります。

    出力列の詳細については、ML.FORECAST 関数をご覧ください。

予測の精度を評価する

ML.EVALUATE 関数を使用して、モデルの予測精度を評価します。

次の GoogleSQL クエリでは、2 番目の SELECT ステートメントで将来の特徴を含むデータを提供します。このデータは、実際のデータと比較して将来の値を予測するために使用されます。

モデルの精度を評価する手順は次のとおりです。

  1. Cloud de Confiance コンソールで、[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. Cloud de Confiance コンソールで、[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')
        ));

    結果は次のようになります。

    予測データと予測の説明に関する最初の 9 つの出力列。 予測データと予測の説明に関する 10~17 番目の出力列。 予測データと予測の説明に関する最後の 6 つの出力列。

    出力行は、time_series_timestamp 列の値で時系列順に表示されます。

    出力列の詳細については、ML.EXPLAIN_FORECAST 関数をご覧ください。