GCPTableauTech Blog 

BigQuery MLを利用した予測モデル構築〜パラメータチューニングから評価まで〜

はじめに

※本記事は BigQuery Advent Calendar 2021 の13日目の記事であり、ちゅらデータ Advent Calender 2021 の13日目の記事でもあります。

こんにちは、ちゅらデータ株式会社の真嘉比です。
本記事では、BigQuery ML を利用してモデルのパラメータチューニングからモデル評価・Explanable AIを利用したモデル説明を行うまでの一連の流れについて紹介します。

BigQuery ML とは

公式ページより定義を引用します:

BigQuery ML を使用すると、BigQuery で標準 SQL クエリを使用して、機械学習モデルを作成し実行できます。BigQuery ML では既存の SQL ツールやスキルを活用できるため、SQL のユーザーなら誰でも簡単にモデルを構築して機械学習を利用できます。BigQuery ML では、データを移動する必要がないため、開発スピードを向上させることができます。

 

BigQuery ML に用意されているモデルの種類は様々で、基礎的な線形回帰から K-Means のようなクラスタリング、Factorization Machine のような行列分解、XGBoost モデルや Deep Learning モデルまで構築することが出来ます。AutoML Tables もサポートされているため、分析に明るくない方でも安心です。
ここでは、BigQuery ML を利用する例としてニューヨーク市のタクシー運賃を予測するモデルを構築してみます。

BigQuery ML を利用した運賃予測モデルの構築

利用データセット: NYC TLC Trips

BigQuery の一般公開データセット にある NYC TLC Trips を利用して、ニューヨーク市のタクシー運賃を予測するモデルを構築します。
このデータセットには、運賃だけではなく、乗車日時や乗車・降車場所、乗客の人数といった様々な情報が含まれています。ここでは以下のクエリから得られるデータについて、 total_amount を予測します。
※データを taxi.sample_data という名前のテーブルに保存します。

SELECT
  EXTRACT(HOUR FROM pickup_datetime) AS pickup_hour,
  pickup_longitude,
  pickup_latitude,
  dropoff_longitude,
  dropoff_latitude,
  passenger_count,
  total_amount
FROM
  `nyc-tlc.yellow.trips`
WHERE
  trip_distance > 0 AND fare_amount > 0
LIMIT 10000

データのサンプルは以下の通りです:

pickup_hourpickup_longitudepickup_latitudedropoff_longitudedropoff_latitudepassenger_counttotal_amount
119-73.95676240.76668-73.95510240.76894522.5
29-73.97514340.752406-73.95403740.76404712.5
314-73.86848240.769913-73.86959340.76971552.5

モデルの構築

ここでは、BigQuery ML の線形回帰モデルを利用します。 CREATE MODEL ... OPTIONS 文にて指定したアルゴリズムで BigQuery ML モデルを構築します。今回構築する線形回帰モデルで指定できるパラメータの詳細については以下公式ドキュメントをご参照ください:
The CREATE MODEL statement for generalized linear models

以下が基本的な構文となります。SQL を利用して直感的にモデル構築を行えます。

CREATE OR REPLACE MODEL taxi.total_amount_model
OPTIONS (
  model_type='linear_reg',
  input_label_cols=['total_amount'],
) AS
SELECT * FROM `taxi.sample_data`

学習時にハイパーパラメータチューニングを行うことも出来ます。
num_trials オプションを指定するとパラメータ調整がトリガーされ、関連するハイパーパラメータの最適化が自動的に行われます。調整されるハイパーパラメータのリストについては以下で確認できます:
Hyperparameters and Objectives – Hyperparameter tuning for CREATE MODEL statements

今回構築するモデルの場合、 l1_regl2_reg が最適化されることとなります。評価指標には mean_squared_error を利用します。

CREATE OR REPLACE MODEL taxi.total_amount_model
OPTIONS (
  model_type='linear_reg',
  input_label_cols=['total_amount'],
  num_trials=10,
  hparam_tuning_objectives=['mean_squared_error'],
  max_parallel_trials=5,
  enable_global_explain=TRUE
) AS
SELECT * FROM `taxi.sample_data`

デフォルト設定では、8割を訓練、1割をバリデーション、1割をテストとして、データをランダムに分割し利用しています。データ分割のオプションについては以下の記事をご覧ください:
Data Split – Hyperparameter tuning for CREATE MODEL statements

後ほど Explainable AI (説明可能AI) の機能を利用して特徴量寄与度を確認したいため、 enable_global_explain の値を TRUE としておきます。

Vertex Vizierについて

ハイパーパラメータチューニングのアルゴリズムとして、グリッドサーチやランダムサーチといった基本的な手法も選択できますが、おすすめはデフォルトの VIZIER_DEFAULT です。こちらを選択すると、 Vertex Vizier によるベイズ最適化を活用したパラメータ探索が行われます。 (上記クエリ中で明示的には指定しておりませんが、VIZIER_DEFAULT を利用しています)
Vertex Vizier によるハイパーパラメータチューニングについては、こちらの記事もご覧ください:
Vertex Vizier のハイパーパラメータ調整が ML モデルを改善する 5 つの方法

モデルの評価

ML.TRIAL_INFO を利用することで、学習時のトライアル結果の詳細を確認することが出来ます。is_optimal 列を確認すると、何回目のトライアルが最適なのか知ることが出来ます。(以下の例では2回目のトライアルで最適なモデルが構築されています) hparam_tuning_evaluation_metrics.mean_squared_error は、テストデータセットにおける評価結果です。

SELECT * FROM ML.TRIAL_INFO(MODEL `taxi.total_amount_model`)
trial_idhyperparameters.l1_reghyperparameters.l2_reghparam_tuning_evaluation_metrics.mean_squared_errortraining_losseval_lossstatuserror_messageis_optimal
111.0E-141.0E-141.4796666501923511.64854347615058261.4796666501923563SUCCEEDEDnullfalse
221.691058565479033E-120.067444346284127341.47966205123069731.64854123210362261.4796620512306995SUCCEEDEDnulltrue
333.1660996602325454E-111.560135307730692E-41.47966663944547631.64854347086455971.4796666394454712SUCCEEDEDnullfalse
448.529543640109168E-135.049914900435818E-41.47966661540807731.6485434590421011.47966661540808SUCCEEDEDnullfalse

 

パラメータの探索範囲を指定しなかった場合、デフォルトの探索範囲が適用されますが、このとき一番最初のトライアルではデフォルトのハイパーパラメータが選択されます。これにより、モデル性能がハイパーパラメータチューニングを実施しなかった場合より下がることを抑止しているようです。
詳細はこちらをご覧ください: The ML.TRAINING_INFO function

任意のテストセットに対する評価には、ML.EVALUATE を使用します。これにより、指定したデータにおける予測性能を確認することが出来ます。

SELECT * FROM ML.EVALUATE(
  MODEL taxi.total_amount_model,
  (SELECT * FROM `taxi.sample_data`)
  )
trial_idmean_absolute_errormean_squared_errormean_squared_log_errormedian_absolute_errorr2_scoreexplained_variance
120.87421004722635891.60657530069504630.027093385789567750.78364680204544430.0134681626062381770.013472602902881547

BigQuery Explainable AI について

enable_global_explain パラメータを TRUE にしていた場合、BigQuery Explainable AI を利用して特徴毎の寄与度を確認することが出来ます。

SELECT * FROM ML.GLOBAL_EXPLAIN (MODEL taxi.total_amount_model)
trial_idfeatureattribution
12pickup_hour0.11804140135456641
22passenger_count0.007697714429952254
32pickup_latitude0.004248563414587361
42dropoff_longitude0.003954386392306926
52dropoff_latitude0.003603676472720668
62pickup_longitude0.0023647614326476616

おまけ: モデルのエクスポート

構築したモデルを Google Cloud Storage にエクスポートすることでアプリケーションに組み込んで利用することも可能です。
Google Next ’21 の Integration with Vertex にて、Vertex AI パイプラインとの連携強化も予告されているため、より便利になっていくことも予想されます。

BigQuery MLモデルのエクスポート

おわりに

ここ数ヶ月の間で追加された BigQuery ML の新機能をざっと試しながら、モデルを構築して評価するまでの一連の流れについて説明しました。
個人的には、Wide And Deep Learning の実装が気になっているため、また改めてのタイミングでご紹介出来ればと思います。

このページをシェアする:



DATUM STUDIOは、クライアントの事業成長と経営課題解決を最適な形でサポートする、データ・ビジネスパートナーです。
データ分析の分野でお客様に最適なソリューションをご提供します。まずはご相談ください。