一変量時系列モデルを数百万の時系列にスケーリングする


このチュートリアルでは、1 つのクエリで複数の時系列予測を行うために、一連の時系列モデルのトレーニングを大幅に高速化する方法について説明します。また、予測精度を評価する方法についても学習します。

このチュートリアルでは、予測するための単変量時系列モデルのトレーニングを大幅に高速化する方法について説明します。

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

このチュートリアルでは、一般公開されている bigquery-public-data.new_york.citibike_trips テーブルと iowa_liquor_sales.sales テーブルのデータを使用します。自転車のルートデータには数百の時系列しか含まれていないため、モデルのトレーニングを高速化するさまざまな方法を説明するために使用されます。酒類販売データには 100 万を超える時系列があるため、大規模な時系列予測を示すために使用されます。

このチュートリアルを読む前に、単変量モデルを使用して複数の時系列を予測する大規模な時系列予測のベスト プラクティスをご覧ください。

目標

このチュートリアルでは、以下を使用します。

わかりやすくするため、このチュートリアルでは ML.FORECAST 関数または ML.EXPLAIN_FORECAST 関数を使用して予測を生成する方法について説明しません。これらの関数の使用方法については、単一変数モデルを使用して複数の時系列を予測するをご覧ください。

料金

このチュートリアルでは、Google Cloud の課金対象となる以下のコンポーネントを使用します。

  • BigQuery
  • BigQuery ML

費用の詳細については、BigQuery の料金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

    に移動します。

必要な権限

  • データセットを作成するには、bigquery.datasets.create IAM 権限が必要です。
  • 接続リソースを作成するには、次の権限が必要です。

    • bigquery.connections.create
    • bigquery.connections.get
  • モデルを作成するには、次の権限が必要です。

    • bigquery.jobs.create
    • bigquery.models.create
    • bigquery.models.getData
    • bigquery.models.updateData
    • bigquery.connections.delegate
  • 推論を実行するには、次の権限が必要です。

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

BigQuery における IAM ロールと権限の詳細については、IAM の概要をご覧ください。

データセットの作成

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

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

    [BigQuery] ページに移動

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

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

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

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

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

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

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

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

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

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

次のクエリの SELECT ステートメントは、EXTRACT 関数を使用して、starttime 列から日付情報を抽出します。さらに、COUNT(*) 句を使用して、1 日あたりのシティバイクの合計利用回数を取得します。

table_1 には 679 の時系列があります。このクエリでは、追加の INNER JOIN ロジックを使用して、400 を超える時点を持つすべての時系列を選択し、合計は 383 の時系列になります。

次の手順で入力データテーブルを作成します。

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

    BigQuery に移動

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

    CREATE OR REPLACE TABLE
      `bqml_tutorial.nyc_citibike_time_series` AS
    WITH input_time_series AS
    (
      SELECT
        start_station_name,
        EXTRACT(DATE FROM starttime) AS date,
        COUNT(*) AS num_trips
      FROM
        `bigquery-public-data.new_york.citibike_trips`
      GROUP BY
        start_station_name, date
    )
    SELECT table_1.*
    FROM input_time_series AS table_1
    INNER JOIN (
      SELECT start_station_name,  COUNT(*) AS num_points
      FROM input_time_series
      GROUP BY start_station_name) table_2
    ON
      table_1.start_station_name = table_2.start_station_name
    WHERE
      num_points > 400;

デフォルトのパラメータを使用して複数の時系列のモデルを作成する

Citi Bike ステーションごとの自転車利用回数を予測したいとします。この場合、入力データに含まれる Citi Bike ステーションごとに 1 つずつ、多くの時系列モデルが必要になります。これを行うには、複数の CREATE MODEL クエリを作成できますが、時系列が非常に多い場合は、作成に手間や時間がかかる可能性があります。代わりに、1 つのクエリを使用して一連の時系列モデルを作成して適合させ、複数の時系列を一度に予測できます。

OPTIONS(model_type='ARIMA_PLUS', time_series_timestamp_col='date', ...) 句で、一連の ARIMA ベースの時系列 ARIMA_PLUS モデルを作成します。time_series_timestamp_col オプションは時系列を含む列を指定します。time_series_data_col オプションは予測する列を指定します。time_series_id_col は、時系列を作成するディメンションを 1 つ以上指定します。

この例では、2016 年 6 月 1 日以降の時系列の時点が除外されていますが、後でこれらの時点を使用して ML.EVALUATE 関数で予測精度を評価できます。

モデルを作成する手順は次のとおりです。

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

    BigQuery に移動

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

    CREATE OR REPLACE MODEL `bqml_tutorial.nyc_citibike_arima_model_default`
    OPTIONS
      (model_type = 'ARIMA_PLUS',
      time_series_timestamp_col = 'date',
      time_series_data_col = 'num_trips',
      time_series_id_col = 'start_station_name'
      ) AS
    SELECT *
    FROM bqml_tutorial.nyc_citibike_time_series
    WHERE date < '2016-06-01';

    クエリの完了には、約 15 分かかります。

各時系列の予測精度を評価する

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

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

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

    BigQuery に移動

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

    SELECT *
    FROM
      ML.EVALUATE(MODEL `bqml_tutorial.nyc_citibike_arima_model_default`,
      TABLE `bqml_tutorial.nyc_citibike_time_series`,
      STRUCT(7 AS horizon, TRUE AS perform_aggregation));

    このクエリは、次のような予測指標を報告します。

    結果は次のようになります。 時系列モデルの評価指標。

    ML.EVALUATE 関数の TABLE 句は、グラウンド トゥルース データを含むテーブルを識別します。予測結果を正解データと比較して精度の指標を計算します。この場合、nyc_citibike_time_series には 2016 年 6 月 1 日以前と 2016 年 6 月 1 日以降の時系列ポイントの両方が含まれます。2016 年 6 月 1 日以降のポイントは正解データです。2016 年 6 月 1 日より前のポイントは、その日付以降の予測を生成するためにモデルのトレーニングに使用されます。指標の計算に必要なのは、2016 年 6 月 1 日以降のポイントのみです。2016 年 6 月 1 日より前のポイントは指標の計算で無視されます。

    ML.EVALUATE 関数の STRUCT 句で、関数のパラメータを指定しました。horizon の値は 7 です。これは、クエリが 7 点予測に基づいて予測精度を計算することを意味します。正解データの比較ポイントが 7 点未満の場合、精度の指標は使用可能なポイントのみに基づいて計算されます。perform_aggregation の値は TRUE です。これは、予測精度の指標がその時点の指標に基づいて集計されることを意味します。perform_aggregation 値を FALSE に指定すると、予測された時点ごとに予測精度が返されます。

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

予測の総合的な精度を評価する

383 個の時系列の予測精度を評価します。

ML.EVALUATE によって返される予測指標のうち、平均絶対誤差率対称平均絶対誤差率のみが時系列値に依存しません。したがって、一連の時系列の予測精度全体を評価するには、これら 2 つの指標の集計のみが有意となります。

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

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

    BigQuery に移動

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

    SELECT
      AVG(mean_absolute_percentage_error) AS MAPE,
      AVG(symmetric_mean_absolute_percentage_error) AS sMAPE
    FROM
      ML.EVALUATE(MODEL `bqml_tutorial.nyc_citibike_arima_model_default`,
        TABLE `bqml_tutorial.nyc_citibike_time_series`,
        STRUCT(7 AS horizon, TRUE AS perform_aggregation));

このクエリは、MAPE0.3471sMAPE0.2563 を返します。

小さいハイパーパラメータ検索空間で複数の時系列を予測するモデルを作成する

デフォルト パラメータを使用して複数の時系列のモデルを作成するセクションでは、auto_arima_max_order オプションを含むすべてのトレーニング オプションにデフォルト値を使用しました。このオプションは、auto.ARIMA アルゴリズムでのハイパーパラメータ調整の検索空間を制御します。

次のクエリで作成されたモデルでは、auto_arima_max_order オプションの値をデフォルトの 5 から 2 に変更することで、ハイパーパラメータの検索空間を小さくしています。

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

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

    BigQuery に移動

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

    CREATE OR REPLACE MODEL `bqml_tutorial.nyc_citibike_arima_model_max_order_2`
    OPTIONS
      (model_type = 'ARIMA_PLUS',
      time_series_timestamp_col = 'date',
      time_series_data_col = 'num_trips',
      time_series_id_col = 'start_station_name',
      auto_arima_max_order = 2
      ) AS
    SELECT *
    FROM `bqml_tutorial.nyc_citibike_time_series`
    WHERE date < '2016-06-01';

    クエリの完了には、約 2 分かかります。以前のモデルでは、auto_arima_max_order 値が 5 の場合、完了までに約 15 分かかりました。この変更により、モデル トレーニングの速度が約 7 倍向上します。速度の向上が 5/2=2.5x でないのは、auto_arima_max_order 値を増やすと、候補モデルの数が増えるだけでなく、複雑さも増すためです。これにより、モデルのトレーニング時間が長くなります。

小さいハイパーパラメータ検索空間を持つモデルの予測精度を評価する

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

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

    BigQuery に移動

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

    SELECT
      AVG(mean_absolute_percentage_error) AS MAPE,
      AVG(symmetric_mean_absolute_percentage_error) AS sMAPE
    FROM
      ML.EVALUATE(MODEL `bqml_tutorial.nyc_citibike_arima_model_max_order_2`,
        TABLE `bqml_tutorial.nyc_citibike_time_series`,
        STRUCT(7 AS horizon, TRUE AS perform_aggregation));

このクエリは、MAPE0.3337sMAPE0.2337 を返します。

全体的な予測精度を評価するセクションでは、auto_arima_max_order オプション値が 5 の、ハイパーパラメータ検索空間が大きいモデルを評価しました。これにより、MAPE 値は 0.3471sMAPE 値は 0.2563 になりました。この場合、ハイパーパラメータ検索空間が小さいほど、予測精度が高くなります。理由の 1 つは、auto.ARIMA アルゴリズムが、モデリング パイプライン全体のトレンド モジュールに対してのみハイパーパラメータ調整を実行したためです。auto.ARIMA アルゴリズムによって選択された最良の ARIMA モデルが、パイプライン全体に対して最良の予測結果を生成するとは限りません。

小さいハイパーパラメータ検索空間とスマートな高速トレーニング戦略を使用して複数の時系列を予測するモデルを作成する

このステップでは、小さいハイパーパラメータ検索空間と、1 つ以上の max_time_series_lengthmax_time_series_length、または time_series_length_fraction トレーニング オプションを使用したスマートな高速トレーニング戦略の両方を使用します。

季節性などの定期的なモデリングには一定数の時点が必要ですが、トレンド モデリングの場合、必要な時点は少なくなります。一方、トレンド モデリングは、季節性などの他の時系列コンポーネントよりも計算コストがはるかに高くなります。上記の高速トレーニング オプションを使用すると、他の時系列コンポーネントでは時系列全体を使用しながら、時系列のサブセットを使用してトレンド コンポーネントを効率的にモデル化できます。

次の例では、max_time_series_length オプションを使用して高速トレーニングを実現します。max_time_series_length オプションの値を 30 に設定すると、直近 30 の時点のみがトレンド コンポーネントのモデル化に使用されます。トレンド以外のコンポーネントのモデル化には、引き続き 383 の時系列が使用されます。

モデルを作成する手順は次のとおりです。

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

    BigQuery に移動

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

    CREATE OR REPLACE MODEL `bqml_tutorial.nyc_citibike_arima_model_max_order_2_fast_training`
    OPTIONS
      (model_type = 'ARIMA_PLUS',
      time_series_timestamp_col = 'date',
      time_series_data_col = 'num_trips',
      time_series_id_col = 'start_station_name',
      auto_arima_max_order = 2,
      max_time_series_length = 30
      ) AS
    SELECT *
    FROM `bqml_tutorial.nyc_citibike_time_series`
    WHERE date < '2016-06-01';

    このクエリが完了するまでに 35 秒ほどかかります。これは、小さいハイパーパラメータ検索空間で複数の時系列を予測するモデルを作成するで使用したクエリと比較して 3 倍速くなっています。データの前処理など、クエリのトレーニング以外のオーバーヘッドが一定であるため、この例よりも時系列の数がはるかに多い場合、速度ゲインが大幅に向上します。100 万の時系列の場合、速度ゲインは時系列の長さと max_time_series_length オプション値の値の比率に近づきます。この場合、速度ゲインは 10 倍以上になります。

小さいハイパーパラメータ検索空間とスマートな高速トレーニング戦略でモデルの予測精度を評価する

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

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

    BigQuery に移動

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

    SELECT
      AVG(mean_absolute_percentage_error) AS MAPE,
      AVG(symmetric_mean_absolute_percentage_error) AS sMAPE
    FROM
      ML.EVALUATE(MODEL `bqml_tutorial.nyc_citibike_arima_model_max_order_2_fast_training`,
        TABLE `bqml_tutorial.nyc_citibike_time_series`,
        STRUCT(7 AS horizon, TRUE AS perform_aggregation));

このクエリは、MAPE0.3515sMAPE0.2473 を返します。

高速トレーニング戦略を使用しない場合、予測精度の結果は MAPE 値が 0.3337sMAPE 値が 0.2337 になります。2 つの指標値の差は 3% 以内であり、統計的に有意ではありません。

つまり、予測精度を犠牲にすることなく、モデル トレーニングを 20 倍以上高速化するため、小さいハイパーパラメータ検索空間とスマートな高速トレーニング戦略を使用しています。前述のように、時系列が多いほど、スマートな高速トレーニング戦略による速度ゲインが大幅に向上する可能性があります。さらに、ARIMA_PLUS モデルで使用されている基盤となる ARIMA ライブラリは、以前よりも 5 倍速く実行されるよう最適化されています。これにより、何百万もの時系列を数時間で予測できるようになります。

100 万の時系列を予測するモデルを作成する

このステップでは、公開されているアイオワ州の酒類販売データを使用して、さまざまな店舗での 100 万を超える酒類製品の酒類販売を予測します。モデルのトレーニングでは、小さいハイパーパラメータ検索空間とスマートな高速トレーニング戦略が使用されます。

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

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

    BigQuery に移動

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

    CREATE OR REPLACE MODEL
      `bqml_tutorial.liquor_forecast_by_product`
    OPTIONS(
      MODEL_TYPE = 'ARIMA_PLUS',
      TIME_SERIES_TIMESTAMP_COL = 'date',
      TIME_SERIES_DATA_COL = 'total_bottles_sold',
      TIME_SERIES_ID_COL = ['store_number', 'item_description'],
      HOLIDAY_REGION = 'US',
      AUTO_ARIMA_MAX_ORDER = 2,
      MAX_TIME_SERIES_LENGTH = 30
    ) AS
    SELECT
      store_number,
      item_description,
      date,
      SUM(bottles_sold) as total_bottles_sold
    FROM
      `bigquery-public-data.iowa_liquor_sales.sales`
    WHERE date BETWEEN DATE("2015-01-01") AND DATE("2021-12-31")
    GROUP BY store_number, item_description, date;

    このクエリが完了するまでに 1 時間 16 分ほどかかります。

クリーンアップ

このチュートリアルで使用したリソースについて、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.

次のステップ