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


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

このチュートリアルでは、複数の時系列の予測を行います。予測値は、指定された 1 つ以上の列の値ごとに、各時点について計算されます。たとえば、天気を予測し、州データを含む列を指定した場合、予測データには、州 A のすべての時間ポイントの予測と、州 B のすべての時間ポイントの予測値が含まれます。天気を予測し、州と都市のデータを含む列を指定した場合、予測データには、州 A と都市 A のすべての時間ポイントの予測と、州 A と都市 B のすべての時間ポイントの予測値が含まれます。

このチュートリアルでは、公開されている bigquery-public-data.iowa_liquor_sales.sales テーブルと bigquery-public-data.covid19_weathersource_com.postal_code_day_history テーブルのデータを使用します。bigquery-public-data.iowa_liquor_sales.sales テーブルには、アイオワ州の複数の都市から収集された酒類販売データが含まれています。bigquery-public-data.covid19_weathersource_com.postal_code_day_history テーブルには、世界中の過去の気象データ(温度や湿度など)が含まれています。

このチュートリアルを読む前に、多変量モデルを使用して 1 つの時系列を予測するをお読みになることを強くおすすめします。

目標

このチュートリアルでは、次のタスクの手順について説明します。

  • CREATE MODEL ステートメントを使用して、酒屋の注文を予測する時系列モデルを作成します。
  • ML.FORECAST 関数を使用して、モデルから予測された注文値を取得します。
  • ML.EXPLAIN_FORECAST 関数を使用して、季節性、トレンド、特徴アトリビューションなどの時系列のコンポーネントを取得します。これらの時系列コンポーネントを調べて、予測値を説明できます。
  • ML.EVALUATE 関数を使用してモデルの精度を評価します。
  • ML.DETECT_ANOMALIES 関数でモデルを使用して異常を検出します。

料金

このチュートリアルでは、 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

    に移動します。

データセットを作成する

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

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

    [BigQuery] ページに移動

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

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

    データセットを作成する。

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

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

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

      一般公開データセットは US マルチリージョンに保存されています。わかりやすくするため、データセットを同じロケーションに保存します。

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

      データセットの作成ページ。

入力データのテーブルを作成する

モデルのトレーニングと評価に使用できるデータのテーブルを作成します。このテーブルは、bigquery-public-data.iowa_liquor_sales.sales テーブルと bigquery-public-data.covid19_weathersource_com.postal_code_day_history テーブルの列を結合して、天気が酒屋で注文される商品の種類と数にどのように影響するかを分析します。また、モデルの入力変数として使用できる次の列も作成します。

  • date: 注文日
  • store_number: 注文した店舗の一意の番号
  • item_number: 注文されたアイテムの一意の番号
  • bottles_sold: 関連するアイテムの注文したボトル数
  • temperature: 注文日における店舗の平均気温
  • humidity: 注文日における店舗の平均湿度

入力データテーブルを作成するには、次の操作を行います。

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

    BigQuery に移動

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

    CREATE OR REPLACE TABLE
      `bqml_tutorial.iowa_liquor_sales_with_weather` AS
    WITH
      sales AS (
        SELECT
          DATE,
          store_number,
          item_number,
          bottles_sold,
          SAFE_CAST(SAFE_CAST(zip_code AS FLOAT64) AS INT64) AS zip_code
        FROM
          `bigquery-public-data.iowa_liquor_sales.sales` AS sales
        WHERE
          SAFE_CAST(zip_code AS FLOAT64) IS NOT NULL
      ),
      aggregated_sales AS (
        SELECT
          DATE,
          store_number,
          item_number,
          ANY_VALUE(zip_code) AS zip_code,
          SUM(bottles_sold) AS bottles_sold,
        FROM
          sales
        GROUP BY
          DATE,
          store_number,
          item_number
      ),
      weather AS (
        SELECT
          DATE,
          SAFE_CAST(postal_code AS INT64) AS zip_code,
          avg_temperature_air_2m_f AS temperature,
          avg_humidity_specific_2m_gpkg AS humidity,
        FROM
          `bigquery-public-data.covid19_weathersource_com.postal_code_day_history`
        WHERE
          SAFE_CAST(postal_code AS INT64) IS NOT NULL
      ),
      avg_weather AS (
        SELECT
          DATE,
          zip_code,
          AVG(temperature) AS temperature,
          AVG(humidity) AS humidity,
        FROM
          weather
        GROUP BY
          DATE,
          zip_code
      )
    SELECT
      aggregated_sales.date,
      aggregated_sales.store_number,
      aggregated_sales.item_number,
      aggregated_sales.bottles_sold,
      avg_weather.temperature AS temperature,
      avg_weather.humidity AS humidity
    FROM
      aggregated_sales
      LEFT JOIN avg_weather ON aggregated_sales.zip_code=avg_weather.zip_code
      AND aggregated_sales.DATE=avg_weather.DATE;

時系列モデルを作成する

時系列モデルを作成して、2022 年 9 月 1 日より前の bqml_tutorial.iowa_liquor_sales_with_weather テーブル内の日付ごとに、店舗 ID と商品 ID の組み合わせごとに販売されたボトル数を予測します。予測中に評価する特徴として、各日の店舗の平均気温と湿度を使用します。bqml_tutorial.iowa_liquor_sales_with_weather テーブルには、商品番号と店舗番号の組み合わせが約 100 万個あります。つまり、予測する時系列が 100 万個あるということです。

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

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

    BigQuery に移動

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

    CREATE
    OR REPLACE MODEL `bqml_tutorial.multi_time_series_arimax_model`
    OPTIONS(
      model_type = 'ARIMA_PLUS_XREG',
      time_series_id_col = ['store_number', 'item_number'],
      time_series_data_col = 'bottles_sold',
      time_series_timestamp_col = 'date'
    )
    AS SELECT
      *
    FROM
      `bqml_tutorial.iowa_liquor_sales_with_weather`
    WHERE
      DATE < DATE('2022-09-01');

    クエリが完了するまでに約 38 分かかります。完了後、multi_time_series_arimax_model モデルが [エクスプローラ] ペインに表示されます。クエリは CREATE MODEL ステートメントを使用してモデルを作成するため、クエリの結果は表示されません。

モデルを使用してデータを予測する

ML.FORECAST 関数を使用して、将来の時系列値を予測します。

次の GoogleSQL クエリの STRUCT(5 AS horizon, 0.8 AS confidence_level) 句は、5 個の将来の時点を予測し、信頼度レベル 80% の予測間隔を生成するように指示します。

ML.FORECAST 関数の入力データのデータシグネチャは、モデルの作成に使用したトレーニング データのデータシグネチャと同じです。bottles_sold 列は、モデルが予測しようとしているデータであるため、入力に含まれません。

次の手順でモデルを使用し、データを予測します。

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

    BigQuery に移動

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

    SELECT
      *
    FROM
      ML.FORECAST (
        model `bqml_tutorial.multi_time_series_arimax_model`,
        STRUCT (5 AS horizon, 0.8 AS confidence_level),
        (
          SELECT
            * EXCEPT (bottles_sold)
          FROM
            `bqml_tutorial.iowa_liquor_sales_with_weather`
          WHERE
            DATE>=DATE('2022-09-01')
        )
      );

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

    販売されるボトル数の予測データ。

    出力行は、store_number 値、item_ID 値、forecast_timestamp 列の値の順に並べ替えられます。時系列予測では、prediction_interval_lower_bound 列と prediction_interval_upper_bound 列の値で表される予測間隔は、forecast_value 列の値と同じくらい重要です。forecast_value 値は予測間隔の中間点です。予測間隔は、standard_error 列と confidence_level 列の値によって異なります。

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

予測結果を説明する

ML.EXPLAIN_FORECAST 関数を使用すると、予測データに加えて説明可能性の指標を取得できます。ML.EXPLAIN_FORECAST 関数は、将来の時系列値を予測し、時系列の個別のコンポーネントをすべて返します。

ML.FORECAST 関数と同様に、ML.EXPLAIN_FORECAST 関数で使用される STRUCT(5 AS horizon, 0.8 AS confidence_level) 句は、30 個の将来の時点を予測し、信頼度 80% の予測間隔を生成するように指示します。

ML.EXPLAIN_FORECAST 関数は、過去のデータと予測データの両方を提供します。予測データのみを表示するには、クエリに time_series_type オプションを追加し、オプション値として forecast を指定します。

モデルの結果を説明する手順は次のとおりです。

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

    BigQuery に移動

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

    SELECT
      *
    FROM
      ML.EXPLAIN_FORECAST (
        model `bqml_tutorial.multi_time_series_arimax_model`,
        STRUCT (5 AS horizon, 0.8 AS confidence_level),
        (
          SELECT
            * EXCEPT (bottles_sold)
          FROM
            `bqml_tutorial.iowa_liquor_sales_with_weather`
          WHERE
            DATE >= DATE('2022-09-01')
        )
      );

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

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

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

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

予測の精度を評価する

モデルがトレーニングされていないデータでモデルを実行して、モデルの予測精度を評価します。これを行うには、ML.EVALUATE 関数を使用します。ML.EVALUATE 関数は、各時系列を個別に評価します。

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

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

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

    BigQuery に移動

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

    SELECT
      *
    FROM
      ML.EVALUATE (
        model `bqml_tutorial.multi_time_series_arimax_model`,
        (
          SELECT
            *
          FROM
           `bqml_tutorial.iowa_liquor_sales_with_weather`
          WHERE
            DATE >= DATE('2022-09-01')
        )
      );

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

    モデルの評価指標。

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

モデルを使用して異常を検出する

ML.DETECT_ANOMALIES 関数を使用して、トレーニング データの異常を検出します。

次のクエリでは、STRUCT(0.95 AS anomaly_prob_threshold) 句により、ML.DETECT_ANOMALIES 関数は 95% の信頼度で異常なデータポイントを特定します。

トレーニング データ内の異常を検出する手順は次のとおりです。

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

    BigQuery に移動

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

    SELECT
      *
    FROM
      ML.DETECT_ANOMALIES (
        model `bqml_tutorial.multi_time_series_arimax_model`,
        STRUCT (0.95 AS anomaly_prob_threshold)
      );

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

    トレーニング データの異常検出情報。

    結果の anomaly_probability 列には、特定の bottles_sold 列値が異常である可能性を示します。

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

新しいデータの異常を検出する

ML.DETECT_ANOMALIES 関数に入力データを渡して、新しいデータの異常を検出します。新しいデータのデータ署名は、トレーニング データと同じである必要があります。

新しいデータの異常を検出する手順は次のとおりです。

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

    BigQuery に移動

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

    SELECT
      *
    FROM
      ML.DETECT_ANOMALIES (
        model `bqml_tutorial.multi_time_series_arimax_model`,
        STRUCT (0.95 AS anomaly_prob_threshold),
        (
          SELECT
            *
          FROM
            `bqml_tutorial.iowa_liquor_sales_with_weather`
          WHERE
            DATE >= DATE('2022-09-01')
        )
      );

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

    新しいデータの異常検出情報。

クリーンアップ

このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。

  • 作成したプロジェクトを削除する。
  • または、プロジェクトを保存して、データセットを削除する。

データセットを削除する

プロジェクトを削除すると、プロジェクト内のデータセットとテーブルがすべて削除されます。プロジェクトを再利用する場合は、このチュートリアルで作成したデータセットを削除できます。

  1. 必要に応じて、Google Cloud コンソールで BigQuery ページを開きます。

    [BigQuery] ページに移動

  2. ナビゲーションで、作成した bqml_tutorial データセットをクリックします。

  3. ウィンドウの右側にある [データセットを削除] をクリックします。この操作を行うと、データセット、テーブル、すべてのデータが削除されます。

  4. [データセットの削除] ダイアログ ボックスでデータセットの名前(bqml_tutorial)を入力し、[削除] をクリックして確定します。

プロジェクトの削除

プロジェクトを削除するには:

  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.

次のステップ