このチュートリアルでは、1 つのクエリで複数の時系列予測を行うために、一連の時系列モデルのトレーニングを大幅に高速化する方法について説明します。また、予測精度を評価する方法についても学習します。
このチュートリアルでは、予測するための単変量時系列モデルのトレーニングを大幅に高速化する方法について説明します。
このチュートリアルでは、複数の時系列の予測を行います。予測値は、指定された 1 つ以上の列の値ごとに、各時点について計算されます。たとえば、天気を予測し、都市データを含む列を指定した場合、予測データには、都市 A のすべての時間ポイントの予測と、都市 B のすべての時間ポイントの予測値が含まれます。
このチュートリアルでは、一般公開されている bigquery-public-data.new_york.citibike_trips
テーブルと iowa_liquor_sales.sales
テーブルのデータを使用します。自転車のルートデータには数百の時系列しか含まれていないため、モデルのトレーニングを高速化するさまざまな方法を説明するために使用されます。酒類販売データには 100 万を超える時系列があるため、大規模な時系列予測を示すために使用されます。
このチュートリアルを読む前に、単変量モデルを使用して複数の時系列を予測すると大規模な時系列予測のベスト プラクティスをご覧ください。
目標
このチュートリアルでは、以下を使用します。
CREATE MODEL
ステートメントを使用して時系列モデルを作成する。ML.EVALUATE
関数を使用してモデルの精度を評価する。CREATE MODEL
ステートメントのAUTO_ARIMA_MAX_ORDER
、TIME_SERIES_LENGTH_FRACTION
、MIN_TIME_SERIES_LENGTH
、MAX_TIME_SERIES_LENGTH
オプションを使用して、モデルのトレーニング時間を大幅に短縮します。
わかりやすくするため、このチュートリアルでは ML.FORECAST
関数または ML.EXPLAIN_FORECAST
関数を使用して予測を生成する方法について説明しません。これらの関数の使用方法については、単一変数モデルを使用して複数の時系列を予測するをご覧ください。
料金
このチュートリアルでは、Google Cloud の課金対象となる以下のコンポーネントを使用します。
- BigQuery
- BigQuery ML
費用の詳細については、BigQuery の料金と BigQuery ML の料金をご覧ください。
始める前に
- 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.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
- 新しいプロジェクトでは、BigQuery が自動的に有効になります。既存のプロジェクトで BigQuery を有効にするには、
Enable the BigQuery 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 データセットを作成します。
Google Cloud コンソールで [BigQuery] ページに移動します。
[エクスプローラ] ペインで、プロジェクト名をクリックします。
「アクションを表示」> [データセットを作成] をクリックします。
[データセットを作成する] ページで、次の操作を行います。
[データセット ID] に「
bqml_tutorial
」と入力します。[ロケーション タイプ] で [マルチリージョン] を選択してから、[US (米国の複数のリージョン)] を選択します。
一般公開データセットは
US
マルチリージョンに保存されています。わかりやすくするため、データセットを同じロケーションに保存します。残りのデフォルトの設定は変更せず、[データセットを作成] をクリックします。
入力データのテーブルを作成する
次のクエリの SELECT
ステートメントは、EXTRACT
関数を使用して、starttime
列から日付情報を抽出します。さらに、COUNT(*)
句を使用して、1 日あたりのシティバイクの合計利用回数を取得します。
table_1
には 679 の時系列があります。このクエリでは、追加の INNER JOIN
ロジックを使用して、400 を超える時点を持つすべての時系列を選択し、合計は 383 の時系列になります。
次の手順で入力データテーブルを作成します。
Google Cloud コンソールで [BigQuery] ページに移動します。
クエリエディタに次のクエリを貼り付け、[実行] をクリックします。
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
関数で予測精度を評価できます。
モデルを作成する手順は次のとおりです。
Google Cloud コンソールで [BigQuery] ページに移動します。
クエリエディタに次のクエリを貼り付け、[実行] をクリックします。
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
関数を使用して、モデルの予測精度を評価します。
モデルを評価する手順は次のとおりです。
Google Cloud コンソールで [BigQuery] ページに移動します。
クエリエディタに次のクエリを貼り付け、[実行] をクリックします。
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 つの指標の集計のみが有意となります。
モデルを評価する手順は次のとおりです。
Google Cloud コンソールで [BigQuery] ページに移動します。
クエリエディタに次のクエリを貼り付け、[実行] をクリックします。
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));
このクエリは、MAPE
値 0.3471
と sMAPE
値 0.2563
を返します。
小さいハイパーパラメータ検索空間で複数の時系列を予測するモデルを作成する
デフォルト パラメータを使用して複数の時系列のモデルを作成するセクションでは、auto_arima_max_order
オプションを含むすべてのトレーニング オプションにデフォルト値を使用しました。このオプションは、auto.ARIMA
アルゴリズムでのハイパーパラメータ調整の検索空間を制御します。
次のクエリで作成されたモデルでは、auto_arima_max_order
オプションの値をデフォルトの 5
から 2
に変更することで、ハイパーパラメータの検索空間を小さくしています。
モデルを評価する手順は次のとおりです。
Google Cloud コンソールで [BigQuery] ページに移動します。
クエリエディタに次のクエリを貼り付け、[実行] をクリックします。
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
値を増やすと、候補モデルの数が増えるだけでなく、複雑さも増すためです。これにより、モデルのトレーニング時間が長くなります。
小さいハイパーパラメータ検索空間を持つモデルの予測精度を評価する
モデルを評価する手順は次のとおりです。
Google Cloud コンソールで [BigQuery] ページに移動します。
クエリエディタに次のクエリを貼り付け、[実行] をクリックします。
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));
このクエリは、MAPE
値 0.3337
と sMAPE
値 0.2337
を返します。
全体的な予測精度を評価するセクションでは、auto_arima_max_order
オプション値が 5
の、ハイパーパラメータ検索空間が大きいモデルを評価しました。これにより、MAPE
値は 0.3471
、sMAPE
値は 0.2563
になりました。この場合、ハイパーパラメータ検索空間が小さいほど、予測精度が高くなります。理由の 1 つは、auto.ARIMA
アルゴリズムが、モデリング パイプライン全体のトレンド モジュールに対してのみハイパーパラメータ調整を実行したためです。auto.ARIMA
アルゴリズムによって選択された最良の ARIMA モデルが、パイプライン全体に対して最良の予測結果を生成するとは限りません。
小さいハイパーパラメータ検索空間とスマートな高速トレーニング戦略を使用して複数の時系列を予測するモデルを作成する
このステップでは、小さいハイパーパラメータ検索空間と、1 つ以上の max_time_series_length
、max_time_series_length
、または time_series_length_fraction
トレーニング オプションを使用したスマートな高速トレーニング戦略の両方を使用します。
季節性などの定期的なモデリングには一定数の時点が必要ですが、トレンド モデリングの場合、必要な時点は少なくなります。一方、トレンド モデリングは、季節性などの他の時系列コンポーネントよりも計算コストがはるかに高くなります。上記の高速トレーニング オプションを使用すると、他の時系列コンポーネントでは時系列全体を使用しながら、時系列のサブセットを使用してトレンド コンポーネントを効率的にモデル化できます。
次の例では、max_time_series_length
オプションを使用して高速トレーニングを実現します。max_time_series_length
オプションの値を 30
に設定すると、直近 30 の時点のみがトレンド コンポーネントのモデル化に使用されます。トレンド以外のコンポーネントのモデル化には、引き続き 383 の時系列が使用されます。
モデルを作成する手順は次のとおりです。
Google Cloud コンソールで [BigQuery] ページに移動します。
クエリエディタに次のクエリを貼り付け、[実行] をクリックします。
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 倍以上になります。
小さいハイパーパラメータ検索空間とスマートな高速トレーニング戦略でモデルの予測精度を評価する
モデルを評価する手順は次のとおりです。
Google Cloud コンソールで [BigQuery] ページに移動します。
クエリエディタに次のクエリを貼り付け、[実行] をクリックします。
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));
このクエリは、MAPE
値 0.3515
と sMAPE
値 0.2473
を返します。
高速トレーニング戦略を使用しない場合、予測精度の結果は MAPE
値が 0.3337
、sMAPE
値が 0.2337
になります。2 つの指標値の差は 3% 以内であり、統計的に有意ではありません。
つまり、予測精度を犠牲にすることなく、モデル トレーニングを 20 倍以上高速化するため、小さいハイパーパラメータ検索空間とスマートな高速トレーニング戦略を使用しています。前述のように、時系列が多いほど、スマートな高速トレーニング戦略による速度ゲインが大幅に向上する可能性があります。さらに、ARIMA_PLUS
モデルで使用されている基盤となる ARIMA ライブラリは、以前よりも 5 倍速く実行されるよう最適化されています。これにより、何百万もの時系列を数時間で予測できるようになります。
100 万の時系列を予測するモデルを作成する
このステップでは、公開されているアイオワ州の酒類販売データを使用して、さまざまな店舗での 100 万を超える酒類製品の酒類販売を予測します。モデルのトレーニングでは、小さいハイパーパラメータ検索空間とスマートな高速トレーニング戦略が使用されます。
モデルを評価する手順は次のとおりです。
Google Cloud コンソールで [BigQuery] ページに移動します。
クエリエディタに次のクエリを貼り付け、[実行] をクリックします。
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 アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。
- 作成したプロジェクトを削除する。
- または、プロジェクトを保存して、データセットを削除する。
データセットを削除する
プロジェクトを削除すると、プロジェクト内のデータセットとテーブルがすべて削除されます。プロジェクトを再利用する場合は、このチュートリアルで作成したデータセットを削除できます。
必要に応じて、Google Cloud コンソールで [BigQuery] ページを開きます。
ナビゲーションで、作成した bqml_tutorial データセットをクリックします。
[データセットの削除] をクリックして、データセット、テーブル、すべてのデータを削除します。
[データセットの削除] ダイアログ ボックスでデータセットの名前(
bqml_tutorial
)を入力し、[削除] をクリックして確定します。
プロジェクトの削除
プロジェクトを削除するには:
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
次のステップ
- 単変量モデルを使用して単一の時系列を予測する方法を学習する
- 多変量モデルを使用して単一の時系列を予測する方法を学習する
- 単変量モデルを使用して複数の時系列を予測する方法を学習する
- 単変量モデルを使用して複数の時系列を階層的に予測する方法を学習する
- BigQuery ML の概要については、BigQuery の AI と ML の概要をご覧ください。