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_hour | pickup_longitude | pickup_latitude | dropoff_longitude | dropoff_latitude | passenger_count | total_amount |
---|---|---|---|---|---|---|---|
1 | 19 | -73.956762 | 40.76668 | -73.955102 | 40.768945 | 2 | 2.5 |
2 | 9 | -73.975143 | 40.752406 | -73.954037 | 40.764047 | 1 | 2.5 |
3 | 14 | -73.868482 | 40.769913 | -73.869593 | 40.769715 | 5 | 2.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_reg
と l2_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_id | hyperparameters.l1_reg | hyperparameters.l2_reg | hparam_tuning_evaluation_metrics.mean_squared_error | training_loss | eval_loss | status | error_message | is_optimal |
---|---|---|---|---|---|---|---|---|---|
1 | 1 | 1.0E-14 | 1.0E-14 | 1.479666650192351 | 1.6485434761505826 | 1.4796666501923563 | SUCCEEDED | null | false |
2 | 2 | 1.691058565479033E-12 | 0.06744434628412734 | 1.4796620512306973 | 1.6485412321036226 | 1.4796620512306995 | SUCCEEDED | null | true |
3 | 3 | 3.1660996602325454E-11 | 1.560135307730692E-4 | 1.4796666394454763 | 1.6485434708645597 | 1.4796666394454712 | SUCCEEDED | null | false |
4 | 4 | 8.529543640109168E-13 | 5.049914900435818E-4 | 1.4796666154080773 | 1.648543459042101 | 1.47966661540808 | SUCCEEDED | null | false |
パラメータの探索範囲を指定しなかった場合、デフォルトの探索範囲が適用されますが、このとき一番最初のトライアルではデフォルトのハイパーパラメータが選択されます。これにより、モデル性能がハイパーパラメータチューニングを実施しなかった場合より下がることを抑止しているようです。
詳細はこちらをご覧ください: The ML.TRAINING_INFO function
任意のテストセットに対する評価には、ML.EVALUATE
を使用します。これにより、指定したデータにおける予測性能を確認することが出来ます。
SELECT * FROM ML.EVALUATE( MODEL taxi.total_amount_model, (SELECT * FROM `taxi.sample_data`) )
行 | trial_id | mean_absolute_error | mean_squared_error | mean_squared_log_error | median_absolute_error | r2_score | explained_variance |
---|---|---|---|---|---|---|---|
1 | 2 | 0.8742100472263589 | 1.6065753006950463 | 0.02709338578956775 | 0.7836468020454443 | 0.013468162606238177 | 0.013472602902881547 |
BigQuery Explainable AI について
enable_global_explain
パラメータを TRUE
にしていた場合、BigQuery Explainable AI を利用して特徴毎の寄与度を確認することが出来ます。
SELECT * FROM ML.GLOBAL_EXPLAIN (MODEL taxi.total_amount_model)
行 | trial_id | feature | attribution |
---|---|---|---|
1 | 2 | pickup_hour | 0.11804140135456641 |
2 | 2 | passenger_count | 0.007697714429952254 |
3 | 2 | pickup_latitude | 0.004248563414587361 |
4 | 2 | dropoff_longitude | 0.003954386392306926 |
5 | 2 | dropoff_latitude | 0.003603676472720668 |
6 | 2 | pickup_longitude | 0.0023647614326476616 |
おまけ: モデルのエクスポート
構築したモデルを Google Cloud Storage にエクスポートすることでアプリケーションに組み込んで利用することも可能です。
Google Next ’21 の Integration with Vertex にて、Vertex AI パイプラインとの連携強化も予告されているため、より便利になっていくことも予想されます。
おわりに
ここ数ヶ月の間で追加された BigQuery ML の新機能をざっと試しながら、モデルを構築して評価するまでの一連の流れについて説明しました。
個人的には、Wide And Deep Learning の実装が気になっているため、また改めてのタイミングでご紹介出来ればと思います。
DATUM STUDIOは、クライアントの事業成長と経営課題解決を最適な形でサポートする、データ・ビジネスパートナーです。
データ分析の分野でお客様に最適なソリューションをご提供します。まずはご相談ください。
Contact
Explore Jobs
関連記事