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


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

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

このチュートリアルでは、一般公開テーブル bigquery-public-data.new_york.citibike_trips のデータを使用します。このテーブルには、ニューヨーク市でのシティバイクの利用状況に関する情報が含まれています。

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

目標

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

  • CREATE MODEL ステートメントを使用して、自転車の利用回数を予測する時系列モデルを作成します。
  • ML.ARIMA_EVALUATE 関数を使用して、モデル内の自己回帰統合移動平均(ARIMA)情報を評価します。
  • ML.ARIMA_COEFFICIENTS 関数を使用してモデルの係数を検査する。
  • ML.FORECAST 関数を使用して、モデルから予測された自転車走行情報を取得します。
  • ML.EXPLAIN_FORECAST 関数を使用して、季節性やトレンドなどの時系列のコンポーネントを取得する。これらの時系列コンポーネントを調べて、予測値を説明できます。

料金

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

    に移動します。

必要な権限

  • データセットを作成するには、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 マルチリージョンに保存されています。わかりやすくするため、データセットを同じロケーションに保存します。

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

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

入力データを可視化する

モデルを作成する前に、必要に応じて入力時系列データを可視化して分布を把握できます。これは、Looker Studio を使用して行います。

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

時系列データを可視化する手順は次のとおりです。

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

    BigQuery に移動

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

    SELECT
      EXTRACT(DATE from starttime) AS date,
      COUNT(*) AS num_trips
    FROM
    `bigquery-public-data.new_york.citibike_trips`
    GROUP BY date;
  3. クエリが完了したら、[データを探索] > [Looker Studio で調べる] をクリックします。Looker Studio が新しいタブで開きます。新しいタブで次の操作を行います。

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

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

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

    自転車のルートデータの経時的な変化を示すグラフ。

時系列モデルを作成する

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

次のクエリの OPTIONS(model_type='ARIMA_PLUS', time_series_timestamp_col='date', ...) 句は、ARIMA ベースの時系列モデルを作成していることを示します。CREATE MODEL ステートメントの time_series_id_col オプションを使用して、予測を取得する入力データの 1 つ以上の列(この場合は、start_station_name 列で表される Citi Bike ステーション)を指定します。WHERE 句を使用して、名前に Central Park が含まれるステーションに限定します。CREATE MODEL ステートメントの auto_arima_max_order オプションは、auto.ARIMA アルゴリズムでのハイパーパラメータ チューニングの検索空間を制御します。CREATE MODEL ステートメントの decompose_time_series オプションはデフォルトで TRUE に設定されているため、次のステップでモデルを評価するときに時系列データに関する情報が返されます。

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

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

    BigQuery に移動

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

    CREATE OR REPLACE MODEL `bqml_tutorial.nyc_citibike_arima_model_group`
    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 = 5
    ) AS
    SELECT
      start_station_name,
      EXTRACT(DATE from starttime) AS date,
      COUNT(*) AS num_trips
    FROM
    `bigquery-public-data.new_york.citibike_trips`
    WHERE start_station_name LIKE '%Central Park%'
    GROUP BY start_station_name, date;

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

このクエリでは、入力データ内の 12 個のシティバイクの出発ステーションごとに 1 つずつ、12 個の時系列モデルを作成します。所要時間は約 24 秒です。並列処理を行うため、これは 1 つの時系列モデルを作成する場合の 1.4 倍程度にすぎません。ただし、WHERE ... LIKE ... 句を削除すると、600 以上の時系列が予測されるため、スロットの容量の制限により、時系列の予測が完全に並列では処理されない可能性があります。その場合、クエリが完了するまでに約 15 分かかることがあります。モデルの品質がわずかに低下する可能性がありますが、クエリの実行時間を短縮するには、auto_arima_max_order オプションの値をデフォルト値の 5 から 3 または 4 に減らします。これにより、auto.ARIMA アルゴリズムのハイパーパラメータ調整の検索空間が縮小されます。詳細については、Large-scale time series forecasting best practices をご覧ください。

モデルを評価する

ML.ARIMA_EVALUATE 関数を使用して時系列モデルを評価します。ML.ARIMA_EVALUATE 関数は、ハイパーパラメータの自動チューニング プロセス中にモデルに対して生成された評価指標を表示します。

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

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

    BigQuery に移動

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

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

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

    時系列モデルの評価指標。

    start_station_name 列は、時系列が作成された入力データ列を識別します。これは、CREATE MODEL ステートメントの time_series_id_col オプションで指定した列です。

    non_seasonal_pnon_seasonal_dnon_seasonal_qhas_drift の出力列は、トレーニング パイプラインの ARIMA モデルを定義します。log_likelihoodAICvariance の出力列は、ARIMA モデルの適合プロセスに関連しています。適合プロセスでは、時系列ごとに auto.ARIMA アルゴリズムを使用して最適な ARIMA モデルが決定されます。

    auto.ARIMA アルゴリズムは KPSS テストを使用して、non_seasonal_d の最適値を決定します。この場合は 1 です。non_seasonal_d1 の場合、auto.ARIMA アルゴリズムは 42 個の ARIMA 候補モデルを並行してトレーニングします。この例では、42 個の候補モデルがすべて有効であるため、出力には 42 行(ARIMA 候補モデルごとに 1 行)が含まれます。一部のモデルが無効な場合は、出力から除外されます。これらの候補モデルは、AIC の昇順で返されます。最初の行のモデルは AIC が最も低く、最適なモデルとみなされます。この最適モデルが最終モデルとして保存され、次に示すように ML.FORECASTML.EVALUATEML.ARIMA_COEFFICIENTS を呼び出すときに使用されます。

    seasonal_periods 列には、時系列データで識別された季節パターンに関する情報が含まれます。時系列ごとに異なるパターンがある場合があります。たとえば、この図では 1 つの時系列に 1 年ごとのパターンがありますが、他の時系列には存在しません。

    has_holiday_effecthas_spikes_and_dipshas_step_changes 列は、decompose_time_series=TRUE の場合にのみ入力されます。これらの列には、入力時系列データに関する情報も反映されますが、ARIMA モデリングとは関係ありません。また、これらの列の値はすべての出力行で同じです。

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

auto.ARIMA は、各時系列について複数の ARIMA 候補モデルを評価しますが、ML.ARIMA_EVALUATE はデフォルトでは出力テーブルをコンパクトにするため、最適モデルの情報のみを出力します。すべての候補モデルを表示するには、ML.ARIMA_EVALUATE 関数の show_all_candidate_model 引数TRUE に設定します。

モデルの係数を調べる

ML.ARIMA_COEFFICIENTS 関数を使用して、時系列モデルの係数を調べます。

モデルの係数を取得する手順は次のとおりです。

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

    BigQuery に移動

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

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

    クエリが完了するまでに 1 秒もかかりません。結果は次のようになります。

    時系列モデルの係数。

    start_station_name 列は、時系列が作成された入力データ列を識別します。これは、CREATE MODEL ステートメントの time_series_id_col オプションで指定した列です。

    ar_coefficients 出力列には、ARIMA モデルの自己回帰(AR)部分のモデル係数が表示されます。同様に、ma_coefficients 出力列には、ARIMA モデルの移動平均(MA)部分のモデル係数が表示されます。どちらの列にも配列値が含まれており、長さはそれぞれ non_seasonal_pnon_seasonal_q です。intercept_or_drift 値は、ARIMA モデルの定数項です。

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

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

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

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

モデルを使用してデータを予測する手順は次のとおりです。

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

    BigQuery に移動

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

    SELECT
     *
    FROM
     ML.FORECAST(MODEL `bqml_tutorial.nyc_citibike_arima_model_group`,
       STRUCT(3 AS horizon, 0.9 AS confidence_level))
  3. [実行] をクリックします。

    クエリが完了するまでに 1 秒もかかりません。結果は次のようになります。

    ML.FORECAST の出力。

    最初の列 start_station_name は、各時系列モデルが適合される時系列にアノテーションを付けます。各 start_station_name には、horizon 値で指定された 3 行の予測結果があります。

    start_station_name ごとに、出力行は 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(3 AS horizon, 0.9 AS confidence_level) 句は、クエリが 3 個の将来の時点を予測し、信頼度 90% の予測間隔を生成するように指示します。

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

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

    BigQuery に移動

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

    SELECT
     *
    FROM
     ML.EXPLAIN_FORECAST(MODEL `bqml_tutorial.nyc_citibike_arima_model_group`,
       STRUCT(3 AS horizon, 0.9 AS confidence_level));

    クエリが完了するまでに 1 秒もかかりません。結果は次のようになります。

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

    返される最初の数千行はすべて履歴データです。予測データを表示するには、結果をスクロールする必要があります。

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

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

クリーンアップ

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

次のステップ