BigQuery MLのARIMAモデルで時系列データを扱う

2021.08.31

はじめに

データアナリティクス事業本部のkobayashiです。

先日Google Cloud 認定資格の一つであるProfessional Machine Learning Engineerを受験しました。Google Cloudの認定試験では模擬試験としてサンプル問題を解くことができるので今回も模擬試験を解いて勉強したのですが、その中で出てきたアーキテクチャで気になったものを実際に試してみたいと思います。

Google Cloud 認定資格の模擬試験

Google Cloud 認定資格の試験では模擬試験を無料で受けることができます。出題される問題は固定ですが、解説と関連ドキュメントが出てくるので受験前の最後の仕上げには最適です。

模擬試験の問題

試してみたいアーキテクチャが出てきた問題は以下の問題になります。

You work for a large retailer. You want to use ML to forecast future sales leveraging 10 years of historical sales data. The historical data is stored in Cloud Storage in Avro format. You want to rapidly experiment with all the available data. How should you build and train your model for the sales forecast?

要約すると、「Avro形式の販売データがありそのファイルがGoogleCloudStorageに保存されている状態でこのデータを使って素早く売上予測のモデルを構築しトレーニングするにはどのアーキテクチャがベストか」という問題です。サンプル試験での正答は以下とされています。

Load data into BigQuery and use the ARIMA model type on BigQuery ML

GoogleCloudStorageにAvro形式があるのでこれを外部テーブルとしてBigQueryにテーブルを作成し、そのテーブルを使ってARIMA (AutoRegressive Integrated Moving Average:自己回帰和分移動平均)ベースの時系列モデルを作成するという内容になります。

ARIMAとは時系列分析で一般的に使われるアルゴリズムで、AR(自己回帰)とMA(移動平均)を組み合わせたARMAをデータの階差を使って非定常な時系列データにも適応したものになります。詳しくは以下のサイトをご確認ください。

Autoregressive integrated moving average - Wikipedia

CloudStorageにある時系列データのモデル構築を試してみる

では実際に上記の内容をGoogle Cloudで試してみたいと思います。

事前準備(元データの作成)

販売データですが、BigQueryで利用できる一般公開データセットの中にGoogle Analytics Sampleのデータ(Google Analytics Sample – マーケットプレイス – Google Cloud Platform )があるのでこれを元にAvro形式のファイルをCloud Storageに作成し、そのデータを使います。

SELECT
  PARSE_TIMESTAMP("%Y%m%d", date) AS parsed_date,
  SUM(totals.transactionRevenue) AS total_transactionRevenue
FROM
  `bigquery-public-data.google_analytics_sample.ga_sessions_*`
GROUP BY date

上記のSQLのクエリ結果をCloud Storageに保存しておきます。 保存先は以下としています。

gs://cm_koba/ga_transaction.avro

外部テーブルの作成

Google Cloud StorageのAvro形式のファイルをデータソースとして外部テーブルを作成します。以下のSQLで外部テーブルを作成します。

$ bq mk \
--external_table_definition=AVRO=gs://cm_koba/ga_transaction.avro \
--use_avro_logical_types \
data_set.ga_transaction

以前ブログ記事で書きましたが、Avro形式のファイルにTIMESTAMPが含まれている際にはuse_avro_logical_typesフラグをつけることで作成される外部テーブルでもTIMEATAMPとして扱えるようになるのでこのオプションを付けて外部テーブルを作成します。

BigQuery MLでのARIMAモデルの構築とトレーニング

時系列データをBigQuery MLを使ってARIMAモデルを作りますが、Google Cloudのチュートリアルにほぼその内容のチュートリアルがあります。

このチュートリアルを参考に外部テーブルのデータを使って販売データの予測を行ってみます。

外部テーブルを先に作成したのでこれをデータソースとして時系列モデルを作成します。時系列モデルを作成するSQLクエリは以下になります。

CREATE OR REPLACE MODEL data_set.ga_arima_model
OPTIONS
 (model_type = 'ARIMA_PLUS',
  time_series_timestamp_col = 'parsed_date',
  time_series_data_col = 'total_transactionRevenue',
) AS
SELECT parsed_date,total_transactionRevenue
FROM `data_set.ga_transaction` 
order by parsed_date;

BigQuery MLで時系列予測のARIMAモデルの詳細は「時系列モデルのCREATEMODELステートメント| BigQuery ML 」で詳しく解説されていて時系列モデルのARIMAモデルを作成するCreate Modelクエリのオプションが確認できます。

モデルが作成されると、ML.ARIMA_EVALUATE()でモデルの評価、ML.ARIMA_COEFFICIENTS()でARIMAモデルの係数を表示できます。

  • モデルの評価
SELECT
 *
FROM
 ML.ARIMA_EVALUATE(MODEL data_set.ga_arima_model)
  • モデルの係数
SELECT
 *
FROM
 ML.ARIMA_COEFFICIENTS(MODEL data_set.ga_arima_model)

ARIMAモデルを使って売上を予測

作成したモデルを使って予測を行ってみます。BigQuery MLで予測を行うにはML.FORECAST()を使います。

  • 30日分の予測を行い80%の信頼区間を取得
SELECT
 *
FROM
 ML.FORECAST(MODEL data_set.ga_arima_model,
             STRUCT(30 AS horizon, 0.8 AS confidence_level))

クエリ結果

データポータルで実測値、予測、信頼区間上限・下限を表示してみると以下のようになります。

以上でCloud StorageにあるAvro形式のファイルのデータを使って素早く予測モデルを作成できました。

まとめ

Professional Machine Learning Engineerのサンプル問題で出てきたアーキテクチャを実際に試してみました。今回はAvroファイルを外部テーブルとしてBQMLでモデルを作成してみました。他にも気になる問題があったので次回も今回同様に実際に構築してみたいと思います。どなたかのお役に立てれば幸いです。

最後まで読んで頂いてありがとうございました。