1. 概要
このラボでは、TensorFlow を使用して時系列予測モデルを構築する方法を学習し、Vertex AI を使用してそれらのモデルをデプロイする方法を学習します。
学習内容
次の方法を学習します。
- ML モデルで使用できるようにデータを変換する
- データの可視化と探索
- BigQuery ML を使用して時系列予測モデルを作成する
- LSTM アーキテクチャと CNN アーキテクチャを使用して TensorFlow で時系列予測モデルを構築する
2. 時系列予測の概要
この Codelab では、Google Cloud Platform を使用した時系列予測手法の適用方法に焦点を当てます。一般的な時系列予測のコースではありませんが、コンセプトを簡単に説明するとユーザーの役に立ちます。
時系列データ
まず、時系列とは何でしょうか。一定の間隔で記録されたデータを含むデータセットです。時系列データセットには、時刻と、時間に依存する変数が 1 つ以上含まれます。
コンポーネント
時系列はコンポーネントに分解できます。
- 傾向: 合理的に予測できるパターンで上下動します
- 季節性: 日、週、月、季節など、特定の期間にわたって繰り返します。
- ランダム: 残差変動
季節性には複数のレイヤが存在する場合があります。たとえばコールセンターでは、特定の曜日や月でも通話量にパターンが見られることがあります。残差は、時間以外の変数によって説明できる場合があります。
定常性
予測で最良の結果を得るには、平均や分散などの統計的特性が経時的に一定である、時系列データを定常的にする必要があります。元データに差分やトレンド除去などの手法を適用して、より定常的にすることができます。
例えば、下の図の CO2 濃度は、毎年繰り返されるパターンで、上昇傾向にあることを示しています。(出典)。
線形トレンドを削除すると、平均が一定になるため、予測により適したデータが得られます。
ML での時系列データの使用
ML の問題で時系列データを使用するには、以前の値を使用して将来の値を予測できるように時系列データを変換する必要があります。この表は、ターゲットを予測するために遅延変数を作成する方法の例を示しています。
基礎についてご説明したところで、次はデータの探索と予測を始めましょう。
3. ノートブック環境を設定する
データを簡単に紹介したので、次にモデル開発環境を設定しましょう。
ステップ 1: API を有効にする
BigQuery コネクタは、BigQuery Storage API を使用します。コンソールで BigQuery Storage API を検索し、API が無効になっている場合は有効にします。
ステップ 2: Vertex AI Workbench ノートブックを作成する
Cloud コンソールの [Vertex AI Workbench] セクションに移動し、[新しいノートブック] をクリックします。次に、最新の [TensorFlow Enterprise 2.x] ノートブック タイプ(GPU なし)を選択します。
デフォルトのオプションを使用して、[作成] をクリックします。インスタンスが作成されたら、[JupyterLab を開く] を選択します。
次に、JupyterLab から Python 3 ノートブックを作成します。
ステップ 3: ラボ資料をダウンロードする
JupyterLab インターフェースから新しいターミナル ウィンドウを作成します: [File] ->新規 ->ターミナル。
そこから、次のコマンドを使用してソース マテリアルのクローンを作成します。
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 モデリングに進みましょう。
5. BigQuery Time Series Forecasting を使用してモデルを作成する
このセクションでは、次の作業を行います。
- 時系列入力データを BigQuery テーブルにインポートする
- BQML 構文を使用して時系列モデルを作成する
- モデルのパラメータと精度を評価する方法を学ぶ
- モデルを使用した予測
ステップ 1
これから、先ほど確認した CSV の元データを使用して BigQuery テーブルを作成します。まず、ノートブック環境から CSV をダウンロードします。
training-data-analyst/courses/ai-for-time-series/notebooks/data
ディレクトリで cta_ridership.csv
を右クリックし、ローカル環境にダウンロードします。
ステップ 2
次に、このデータを BigQuery テーブルにアップロードします。
コンソールで BigQuery に移動します(検索するか、こちらのリンクを使用します)。
テーブルを新規または既存のデータセットに追加して、関連するテーブルをグループ化できます。データセットをまだ作成していない場合は、左下のプロジェクトをクリックして、右下の [データセットを作成] を選択します。
任意の名前(demo
など)を選択し、デフォルトをそのまま使用して続行します。
そのデータセットを選択したら、右下にある [テーブルを作成] を選択して新しいテーブルを作成します。
テーブル作成オプションとして、以下を選択します。
- テーブルの作成元: アップロード
- ファイルを選択: cta_ridership.csv
- テーブル名: cta_ridership
- スキーマ: [スキーマと入力パラメータ] を自動検出するには、このチェックボックスをオンにします。
ステップ 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`
理解に役立つ構文の重要な要素を見ていきましょう。
| このステートメントでモデルが作成されます。この記述にはバリエーションがあります。次に例を示します。 |
| ここではモデルのオプションを定義します。最初のオプションはモデルタイプです。ARIMA を選択すると、時系列予測モデルが作成されます。 |
| 日時情報を含む列 |
| データ列 |
| このオプション パラメータを使用すると、モデルに休日を含めることができます。前のステップのデータ探索では、休日は乗客数が少なく、データの提供元であるイリノイ州シカゴが判明したため、米国の祝日をモデルに含めています。 |
| このセクションでは、モデルのトレーニングに使用する入力データを選択します。 |
複数の時系列がある場合に列を定義する、ARIMA モデル パラメータを自動的に検出するかどうかを選択するなど、クエリに追加できるオプションは他にも多数あります。詳細については、時系列モデルの CREATE MODEL ステートメントの構文リファレンスをご覧ください。
ステップ 4
モデルについて詳しく見ていきましょう。トレーニングが完了したら、別のクエリを実行します。このときも、必要に応じて demo を置き換えます。
SELECT * FROM ML.EVALUATE(MODEL `demo.cta_ridership_model`)
結果を解釈しましょう。各行に、候補モデルとそのパラメータ、評価統計が表示されます。結果は、AIC(赤池情報量基準)の昇順で返されます。これは、モデルの品質の相対的な指標を示します。そのため、1 行目のモデルは AIC が最も低く、最適なモデルとみなされます。
ARIMA モデルの p、d、q の各パラメータと、モデルで検出された季節性を確認できます。この場合、上位モデルには週単位と年単位の両方の季節性が含まれます。
ステップ 5
これで、ML.FORECAST
関数を使用して予測する準備が整いました。
次の情報を貼り付けるか入力します(必要に応じて demo に置き換えてください)。
SELECT * FROM ML.FORECAST(MODEL `demo.cta_ridership_model`, STRUCT(7 AS horizon))
このクエリでは、モデルを使用して 7 日後の予測を行います。以下のように、7 つの行が返されます。予測には信頼区間も含まれており、デフォルトは 0.95 ですが、クエリで構成できます。
お疲れさまでした。ここでは、いくつかの BQML クエリを使用して時系列モデルを作成しました。
6. カスタム予測モデルの構築
このセクションでは、次の作業を行います。
- データから外れ値を削除する
- マルチステップ予測を実行する
- 時系列モデルに追加の特徴を含める
- 時系列予測のためのニューラル ネットワーク アーキテクチャについて学習する: LSTM と CNN
- ホルト・ウィンタース指数平滑などの統計モデルについて学ぶ
- モデルのアンサンブル
ステップ 1
Vertex AI Workbench で、training-data-analyst/courses/ai-for-time-series/notebooks
に移動して 02-model.ipynb
を開きます。
ステップ 2
ノートブックのすべてのセルをクリア([編集] > [出力をすべて消去])し、最初の数個のセルのいずれかでリージョン、プロジェクト、バケットの設定を変更してから、セルを 1 つずつ実行します。
ステップ 3
ノートブックでは、複数のモデル アーキテクチャ(LSTM、CNN、統計モデル)について学びました。各モデルについて、テストデータに対するモデルのパフォーマンスを確認できます。
7. クラウドでのトレーニングと予測
このセクションでは、次の作業を行います。
- クラウドでのトレーニング用のデータとモデルを準備する
- AI Platform Training でモデルをトレーニングし、ジョブの進行状況をモニタリングする
- AI Platform Prediction でモデルを使用して予測する
ステップ 1
Vertex AI Workbench で、training-data-analyst/courses/ai-for-time-series/notebooks
に移動して 03-cloud-training.ipynb
を開きます。
ステップ 2
ノートブックのすべてのセルをクリア([編集] > [出力をすべて消去])し、最初の数個のセルのいずれかでリージョン、プロジェクト、バケットの設定を変更してから、セルを 1 つずつ実行します。
ステップ 3
前のセクションでは、Workbench ノートブック内でモデルのトレーニングと予測を行いました。このセクションでは、ノートブックから Vertex AI 用 Python SDK を使用して、Vertex AI サービスを使用してトレーニングとデプロイを行う方法を説明しました。
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 で、ノートブックを選択して [停止] を選択します。
このラボで作成したすべてのリソースを削除する場合は、ワークベンチ ノートブックを停止するのではなく、単に削除します。
Cloud コンソールのナビゲーション メニューで Storage に移動し、モデルアセットを保存するために作成した両方のバケットを削除します(警告: このラボ用に新しいバケットを作成した場合にのみ行ってください)。