Vertex AI と BigQuery ML による時系列予測

1. 概要

このラボでは、TensorFlow を使用して時系列予測モデルを構築する方法と、Vertex AI を使用してこれらのモデルをデプロイする方法について学習します。

学習内容

次の方法を学習します。

  • ML モデルで使用できるようにデータを変換する
  • データを可視化して探索する
  • BigQuery ML を使用して時系列予測モデルを作成する
  • LSTM アーキテクチャと CNN アーキテクチャを使用して TensorFlow で時系列予測モデルを構築する

2. 時系列予測の概要

このコードラボでは、Google Cloud Platform を使用して時系列予測手法を適用する方法に焦点を当てます。一般的な時系列予測コースではありませんが、コンセプトの概要を把握することはユーザーにとって有益です。

時系列データ

まず、時系列とはどのようなものでしょうか。これは、一定の時間間隔で記録されたデータを含むデータセットです。時系列データセットには、時刻と、時間に依存する変数が 1 つ以上含まれています。

85af6a1ff05c69f2.png

コンポーネント

時系列はコンポーネントに分解できます。

  • トレンド: 比較的予測可能なパターンで上下に移動する
  • 季節: 特定の期間(日、週、月、季節など)に繰り返されます。
  • ランダム: 残差の変動

季節性は複数のレイヤで構成されることがあります。たとえば、コールセンターでは、特定の曜日や特定の月に通話量のパターンが見られることがあります。残差は、時間以外の他の変数で説明できる可能性があります。

6e8d45bbbbc388ec.png

定常性

予測で最良の結果を得るには、時系列データを定常にする必要があります。定常とは、平均や分散などの統計的特性が時間とともに一定であることを意味します。差分やデトレンドなどの手法を元データに適用して、より定常的なデータにすることができます。

たとえば、下の CO2 濃度プロットは、上昇傾向のある年間の繰り返しパターンを示しています。(出典

ab82857e2e7d0b89.png

線形トレンドを削除すると、データは平均が一定になるため、予測に適したものになります。

c936381ab1095528.png

機械学習に時系列データを使用する

機械学習の問題で時系列データを使用するには、過去の値を使用して将来の値を予測できるように変換する必要があります。次の表は、ターゲットの予測に役立つ遅延変数の作成方法の例を示しています。

d667a941dbd470f5.png

基本事項の説明は以上です。ここからは、データの探索と予測を始めましょう。

3. ノートブック環境をセットアップする

データについて簡単に説明したので、次はモデル開発環境を設定しましょう。

ステップ 1: API を有効にする

BigQuery コネクタは BigQuery Storage API を使用します。コンソールで BigQuery Storage API を検索し、現在無効になっている場合は API を有効にします。

9895a2fd3cdf8f8c.png

ステップ 2: Vertex AI Workbench ノートブックを作成する

Cloud コンソールの [Vertex AI Workbench] セクションに移動し、[新しいノートブック] をクリックします。次に、最新の TensorFlow Enterprise 2.x ノートブック タイプ(GPU なし)を選択します。

4e7b73eabf2bc061.png

デフォルトのオプションを使用して、[作成] をクリックします。インスタンスが作成されたら、[JUPYTERLAB を開く] を選択します。

18c9f3c462aafaee.png

次に、JupyterLab から Python 3 ノートブックを作成します。

58523671a252b95a.png

ステップ 3: ラボの資料をダウンロードする

JupyterLab インターフェースから新しいターミナル ウィンドウを作成します([File] -> [New] -> [Terminal])。

次のコマンドを使用して、ソースマテリアルを複製します。

git clone https://github.com/GoogleCloudPlatform/training-data-analyst

4. データの探索と可視化

このセクションでは、次の作業を行います。

  • データを時系列にグループ化するクエリを作成する
  • 欠損値を埋める
  • データの可視化
  • 時系列をトレンド コンポーネントと季節性コンポーネントに分解する

ステップ 1

Vertex AI Workbench で、training-data-analyst/courses/ai-for-time-series/notebooks に移動して 01-explore.ipynb を開きます。

ステップ 2

ノートブックのすべてのセルを消去([編集] > [出力をすべて消去] をクリック)し、最初の数個のセルのいずれかでリージョン、プロジェクト、バケットの設定を変更して、セルを 1 つずつ実行します。

ステップ 3

このセクションでは、データをインポートし、さまざまなディメンションを可視化しました。データの概要が把握できたので、このデータを使用して ML モデリングに進む準備が整いました。

55839e7bc0427915.png

5. BigQuery 時系列予測でモデルを作成する

このセクションでは、次の作業を行います。

  • 時系列入力データを BigQuery テーブルにインポートする
  • BQML 構文を使用して時系列モデルを作成する
  • モデルのパラメータと精度を評価する方法を学習する
  • モデルを使用して予測する

ステップ 1

先ほど確認した CSV の元データを使用して、BigQuery テーブルを作成します。まず、ノートブック環境から CSV をダウンロードします。

training-data-analyst/courses/ai-for-time-series/notebooks/data ディレクトリで cta_ridership.csv を右クリックし、ローカル環境にダウンロードします。

ステップ 2

次に、このデータを BigQuery テーブルにアップロードします。

コンソールで BigQuery に移動します(検索するか、このリンクを使用します)。

649e7ab1c44b75e8.png

テーブルは、関連するテーブルをグループ化する新しいデータセットまたは既存のデータセットに追加できます。データセットをまだ作成していない場合は、左下にあるプロジェクトをクリックし、右下にある [データセットを作成] を選択します。

281b97020cd52f29.png

任意の名前(demo など)を選択し、デフォルト設定のまま続行します。

そのデータセットが選択された状態で、右下の [テーブルを作成] を選択して新しいテーブルを作成します。

ad47810d44cfb289.png

テーブル作成オプションで、次のいずれかを選択します。

  • テーブルの作成元: アップロード
  • ファイルを選択: cta_ridership.csv
  • テーブル名: cta_ridership
  • スキーマ: [スキーマと入力パラメータ] の自動検出を有効にするチェックボックスをオンにします。

213e4177e9e79544.png

ステップ 3

それでは、モデルを作成しましょう。BigQuery ML は、SQL に似た簡単な構文を提供し、さまざまなモデルタイプを作成できます。

クエリエディタにこのクエリを貼り付けまたは入力します。必要に応じて、両方の場所で demo をデータセット名に置き換えます。

CREATE OR REPLACE MODEL
  `demo.cta_ridership_model` OPTIONS(MODEL_TYPE='ARIMA',
    TIME_SERIES_TIMESTAMP_COL='service_date',
    TIME_SERIES_DATA_COL='total_rides',
    HOLIDAY_REGION='us') AS
SELECT
  service_date, total_rides
FROM
  `demo.cta_ridership`

構文の重要な要素を理解するために、以下で説明します。

CREATE OR REPLACE MODEL
demo.cta_ridership_model

このステートメントはモデルを作成します。このステートメントには CREATE MODEL などのバリエーションがありますが、ここでは同じ名前の既存のモデルを置き換えることにしました。

OPTIONS(MODEL_TYPE=‘ARIMA' ... )

ここでは、モデル オプションを定義します。最初のオプションはモデルタイプです。ARIMA を選択すると、時系列予測モデルが作成されます。

TIME_SERIES_TIMESTAMP_COL=‘service_date'

日付/時刻情報を含む列

TIME_SERIES_DATA_COL=‘total_rides'

データ列

HOLIDAY_REGION=‘us'

このオプション パラメータを使用すると、モデルに休日を含めることができます。前のステップのデータ探索で、祝日の乗客数が少ないことがわかったため、データが米国イリノイ州シカゴのものであることから、米国の祝日をモデルに含めます。

AS SELECT ... FROM ...

このセクションでは、モデルのトレーニングに使用する入力データを選択します。

複数の時系列がある場合に列を定義したり、ARIMA モデル パラメータを自動的に検出するかどうかを選択するなど、クエリに追加できるオプションは他にも多数あります。詳細については、時系列モデルの CREATE MODEL ステートメントの構文リファレンスをご覧ください。

ステップ 4

モデルの詳細を見てみましょう。トレーニングが完了したら、別のクエリを実行します。必要に応じて、demo を置き換えます。

SELECT
  *
FROM
  ML.EVALUATE(MODEL `demo.cta_ridership_model`)

結果を解釈してみましょう。各行には、候補モデルとそのパラメータと評価統計が表示されます。結果は、モデルの品質の相対的な指標である AIC(赤池情報量規準)の昇順で返されます。したがって、最初の行のモデルは AIC が最も低く、最適なモデルとみなされます。

ARIMA モデルの p、d、q パラメータと、モデルで検出された季節性を確認できます。この場合、上位モデルには週単位と年単位の両方の季節性が含まれます。

5b5b1e129c70a340.png

ステップ 5

これで、ML.FORECAST 関数を使用して予測を行う準備が整いました。

次のように貼り付けまたは入力します(必要に応じて demo を置き換えます)。

SELECT
  *
FROM
  ML.FORECAST(MODEL `demo.cta_ridership_model`,
    STRUCT(7 AS horizon))

このクエリは、モデルを使用して 7 日後の予測を行うだけです。以下に、返された 7 行を示します。予測には信頼区間も含まれます。デフォルトは 0.95 ですが、クエリで構成できます。

b8a7f22657dc2d27.png

お疲れさまでした。数個の BQML クエリだけで時系列モデルを作成できました。

6. カスタム予測モデルを構築する

このセクションでは、次の作業を行います。

  • データから外れ値を削除する
  • マルチステップ予測を実行する
  • 時系列モデルに追加の機能を含める
  • 時系列予測用のニューラル ネットワーク アーキテクチャ(LSTM と CNN)について学習する
  • Holt-Winters 指数平滑法などの統計モデルについて学習する
  • モデルのアンサンブル

ステップ 1

Vertex AI Workbench で、training-data-analyst/courses/ai-for-time-series/notebooks に移動して 02-model.ipynb を開きます。

ステップ 2

ノートブックのすべてのセルを消去([編集] > [出力をすべて消去] をクリック)し、最初の数個のセルのいずれかでリージョン、プロジェクト、バケットの設定を変更して、セルを 1 つずつ実行します。

ステップ 3

ノートブックで、LSTM、CNN、統計モデルなど、複数のモデル アーキテクチャについて学習しました。各モデルについて、テストデータに対するモデルのパフォーマンスを確認できます。

a528df58f4e6d372.png

7. クラウドでのトレーニングと予測

このセクションでは、次の作業を行います。

  • クラウドでトレーニング用のデータとモデルを準備する
  • AI Platform Training でモデルをトレーニングし、ジョブの進行状況をモニタリングする
  • AI Platform Predictions でモデルを使用して予測する

ステップ 1

Vertex AI Workbench で、training-data-analyst/courses/ai-for-time-series/notebooks に移動して 03-cloud-training.ipynb を開きます。

ステップ 2

ノートブックのすべてのセルを消去([編集] > [出力をすべて消去] をクリック)し、最初の数個のセルのいずれかでリージョン、プロジェクト、バケットの設定を変更して、セルを 1 つずつ実行します。

ステップ 3

前のセクションでは、Workbench ノートブック内でモデルをトレーニングし、そのモデルを使用して予測を行いました。このセクションでは、ノートブックから Python SDK for Vertex AI を使用して、トレーニングとデプロイに Vertex AI サービスを使用する方法について説明しました。

a3f6b5dc895a24fb.png

8. 課題

このセクションでは、学んだコンセプトを新しいデータセットに適用してみます。

詳細な手順は提供しませんが、ヒントは提供します(ご希望の場合)。

目標は、ニューヨーク市の 311 サービス リクエストを予測することです。緊急ではないリクエストには、騒音に関する苦情や街灯に関する問題などが含まれます。

ステップ 1

まず、データセットについて理解しましょう。

まず、City of New York 311 Service Requests データセットにアクセスします。

データをよりよく理解するには、データセットの説明に記載されているサンプルクエリをいくつか試してみてください。

  • アイスクリーム トラックに関連する 311 リクエストの件数
  • パーティーに関連した 311 リクエストが最も多いのはどの日か?

BigQuery UI で [クエリを作成] を選択して、データセットにアクセスする方法を確認します。SELECT ステートメントは bigquery-public-data.new_york_311.311_service_requests からクエリを実行しています。

ステップ 2

準備が整いました。このセクションでは、このデータを操作するために、探索と可視化のノートブックを変更します。

ヒント

  • 01-explore.ipynb ノートブックを複製し、複製したノートブックで作業を開始します。
  • データを調べるには、次のクエリを試してください。
from google.cloud import bigquery as bq

sql = """
SELECT * FROM `bigquery-public-data.new_york_311.311_service_requests` LIMIT 5
"""

client = bq.Client(project=PROJECT)
df = client.query(sql).to_dataframe()

df.head()
  • 月ごとのインシデント数を取得するには、次のクエリを使用します。
SELECT
  COUNT(unique_key) as y,
  DATE_TRUNC(DATE(created_date), month) as ds  
FROM `bigquery-public-data.new_york_311.311_service_requests`
GROUP by ds ORDER BY ds asc
  • 定数セクションの列変数を更新します。上記のクエリでは、ターゲット列は y、日付列は ds です。追加機能はありません。
  • 次のラボでデータをエクスポートするファイル名の変更を検討してください。
  • df.to_csv(YOUR-EXPORT-FILENAME, index=False) を使用してデータをエクスポートします。

ステップ 3

次に、月次データを使用して時系列モデルを作成します。

ヒント:

  • 02-model.ipynb ノートブックを複製し、複製したノートブックで作業を開始します。
  • データセット パラメータを更新します。
  • 新しいデータセットに合わせて target_col パラメータと ts_col パラメータを更新します。
  • モデル パラメータを更新します。
  • 頻度を月単位に変更(月の開始のコードは「MS」)
  • 入力ステップ: 12(ルックバック ウィンドウは 12 か月)
  • 出力ステップ: 3(3 か月先の予測)
  • 季節: 12(季節性は 12 か月)
  • 前のノートブックで入力ファイル名を変更した場合は、ここでも変更します。
  • 月の途中でクエリを実行すると、最終月の月間合計が想定よりも大幅に低くなります。このラボでは、df = df[:-1] を使用してデータセットから最後の月を削除します。
  • データに明らかな外れ値はないため、これらのセルをスキップするか、コメントアウトします。
  • この新しいモデルの LSTM ユニット、CNN フィルタ、カーネルサイズを調整します。

9. クリーンアップ

このノートブックを引き続き使用する場合は、未使用時にオフにすることをおすすめします。Cloud コンソールの Workbench UI で、ノートブックを選択して [停止] を選択します。

57213ef2edad9257.png

このラボで作成したリソースをすべて削除する場合は、ワークベンチ ノートブックを停止するのではなく、削除します。

Cloud コンソールのナビゲーション メニューで [ストレージ] に移動し、モデルアセットの保存用に作成した両方のバケットを削除します(警告: この操作は、このラボ専用に新しいバケットを作成した場合にのみ行ってください)。