線形回帰モデルのチュートリアルで、今度こそBigQuery MLに入門してみる!
データアナリティクス事業本部の鈴木です。
『クラスメソッド 機械学習チーム アドベントカレンダー 2022』の12日目のエントリーになります。
昨日はAmazon Transcribeの再入門でした。
本日はBigQuery MLについてです。
BigQueryをデータウェアハウスとして使っている方は、格納したデータをBigQuery MLを使って機械学習に利用することができます。私はBigQueryを使った開発に関しては、データウェアハウスとしての利用にとどまっているものの、長らくBigQuery MLを使ってみたいなと思っていたので、BigQuery MLのドキュメントのチュートリアルのうち、一番オーソドックスなBigQuery ML でペンギンの体重を予測するを試してみることにしました。
ちなみにBigQuery MLでの時系列データの利用については、2日目の記事にてクルトンさんが取り上げています。
チュートリアルとテーブルについて
以下の『BigQuery ML でペンギンの体重を予測する』になります。
このデータは、bigquery-public-data.ml_datasets.penguins
テーブルに格納されています。一般公開データセットのテーブルは、当然ですが中身の情報を確認することが可能です。
同様にプレビューも可能です。
初めてする方だとどの程度のデータが入っているのか分からず不安だと思うので、確認した方法を記載します。
基本的には一般公開データセットを開くの手順で開くのが正解ですが、上手く検索にかからない場合は以下でも可能です。
「エクスプローラー」の文字の右のメニューで、+データを追加
を押す。
その他のソース
で名前を指定してプロジェクトにスターを付ける
をクリックする。
プロジェクト名
にbigquery-public-data
を入力し、スターを付ける
を押す。
以下のようにリソースが追加されたので、中身のテーブルを確認してみてください。
チュートリアルをやってみる
チュートリアルに沿って、7ステップで進めていきました。それぞれやったことや感想をまとめていきます。
ステップ1: データセットを作成する
まずはモデルを作成するデータセットを作成しました。データセットを作成したいプロジェクトでデータセットを作成
を押します。
データセットIDはbqml_tutorial
を入力しました。データのロケーションは米国(US)
にしました。ほかはデフォルトでデータセットを作成
を押します。
データのロケーションは、この記事を見ていただいている方は実際のところは東京リージョンに作成することが多いと思います。BigQuery MLは、訓練データのあるデータセットとモデルを作成するデータセットのロケーションは、記事執筆時点だと、同じである必要があります。
ステップ2: モデルを作成する
チュートリアル記載の以下のクエリを実行して、モデルを作成します。モデルを作成には、CREATE MODEL句を使います。OPTIONS
のmodel_type
で使用する手法を、input_label_cols
で推定対象のカラムがどれかを指定します。なお、線形回帰の場合は、ラベル列は実数にする必要があります。
# https://cloud.google.com/bigquery-ml/docs/linear-regression-tutorial?hl=ja #standardSQL CREATE OR REPLACE MODEL `bqml_tutorial.penguins_model` OPTIONS (model_type='linear_reg', input_label_cols=['body_mass_g']) AS SELECT * FROM `bigquery-public-data.ml_datasets.penguins` WHERE body_mass_g IS NOT NULL
実行を押して、訓練が終了するのを待ちます。終わったらUI上でモデルに移動
が押せるようになるので、これを押してステップ3に移ります。
ステップ3: トレーニングの統計情報を取得する
モデルに移動
か、モデルを作成したデータセットから、トレーニング結果を確認することができました。
以下のような画面で、モデルの詳細などを確認できます。
評価結果も確認できます。
チュートリアルではクエリから確認する方法にも少し言及がありましたが、以下のクエリのようにML.TRAINING_INFO関数を使って、実際に値を取得してみました。
SELECT * FROM ML.TRAINING_INFO(MODEL `bqml_tutorial.penguins_model`)
クエリでは学習時のパラメータやメトリクスなどが取得できることが分かりました。
ステップ4: モデルを評価する
ML.EVALUATE関数で評価用データを使ってモデルの性能を評価できました。
評価の実行は、ML.EVALUATE
関数を使って以下のように実行できました。なお、チュートリアルでは訓練時に使ったデータと同じデータを使っているので、普通は異なるデータを使うことが必要です。今回はあくまでも挙動の確認ですね。
# https://cloud.google.com/bigquery-ml/docs/linear-regression-tutorial?hl=ja #standardSQL SELECT * FROM ML.EVALUATE(MODEL `bqml_tutorial.penguins_model`, ( SELECT * FROM `bigquery-public-data.ml_datasets.penguins` WHERE body_mass_g IS NOT NULL))
もっとデータがたくさんある場合は、ML.EVALUATE
関数に渡すSELECT文のWHERE句で、CREATE MODEL
ステートメントで使ったデータとは重ならない条件で抽出するとよさそうですね。そういう意味で、同じクエリで使用するデータを作成できるのでとても便利です。
実行結果は以下のようになりました。
ステップ 5: モデルを使用して結果を予測する
ML.PREDICT
関数を使って、特徴量から推定を行うことができます。ML.EVALUATE
関数と同じ形式で、SELECT文で作成した特徴量を渡し、推定を行います。このデータも、学習に使用したデータが混ざってしまっているはずなので、実戦では推定に使いたい、訓練には使用していない新しいデータを使う必要があります。
# https://cloud.google.com/bigquery-ml/docs/linear-regression-tutorial?hl=ja #standardSQL SELECT * FROM ML.PREDICT(MODEL `bqml_tutorial.penguins_model`, ( SELECT * FROM `bigquery-public-data.ml_datasets.penguins` WHERE body_mass_g IS NOT NULL AND island = "Biscoe"))
実行結果は以下のようになります。一番左側のpredicted_
から始まる列が推定結果ですね。
ステップ 6: Explainable AI メソッドを使用して予測結果を説明する
ML.PREDICT
関数の拡張バージョンであるML.EXPLAIN_PREDICT
関数を使うと、予測結果と結果の説明を含む追加の列を得ることができます。
# https://cloud.google.com/bigquery-ml/docs/linear-regression-tutorial?hl=ja #standardSQL SELECT * FROM ML.EXPLAIN_PREDICT(MODEL `bqml_tutorial.penguins_model`, ( SELECT * FROM `bigquery-public-data.ml_datasets.penguins` WHERE body_mass_g IS NOT NULL AND island = "Biscoe"), STRUCT(3 as top_k_features))
実行結果は以下のようになりました。
列の説明手法がなんなのかについては、Explainable AI Offerings in BigQuery MLから確認できます。推定に使う関数を変えるだけで重要な特徴を確認できるのは、BigQuery MLの強力な点の一つですね。
ステップ 7: モデルをグローバルに説明する
今回解きたい問題に対して、どの特徴が最も重要か調べるため、ML.GLOBAL_EXPLAIN関数を使用できます。ENABLE_GLOBAL_EXPLAIN=TRUE
オプションを指定して、モデルを再トレーニングする必要があるということで、以下のクエリを実行してみます。
# https://cloud.google.com/bigquery-ml/docs/linear-regression-tutorial?hl=ja #standardSQL CREATE OR REPLACE MODEL `bqml_tutorial.penguins_model` OPTIONS (model_type='linear_reg', input_label_cols=['body_mass_g'], enable_global_explain=TRUE) AS SELECT * FROM `bigquery-public-data.ml_datasets.penguins` WHERE body_mass_g IS NOT NULL
実行が終わったら、ML.GLOBAL_EXPLAIN
関数を実行してみます。
attributionの大きさで、重要な特徴がどれか分かるようになっていますね。
リソースの削除
検証が終わったので、作成したリソースは削除しておきます。個人アカウントであればプロジェクトごと削除するのが確実ですが、そうでない場合は今回作成したデータセットを削除しておきましょう。
おわりに
今回は『BigQuery ML でペンギンの体重を予測する』チュートリアルを通して、実際にBigQuery MLの使い方をご紹介しました。
データセットなどBigQueryならではの単語や使い方があるので、本当に初めてのときは慣れながらぽちぽち実行していました。何回かやっているうちに分かるようになったので、統計手法・機械学習について既に使い方をある程度分かっている方で、チュートリアルでピンと来なかった方は、めげずに何回か試してみて頂ければと思います。
今年も残り少なくなってきましたが、BigQuery MLの使い方も、モデルを作成して推定を実行するところまでは分かったので、気持ちよく年越しできそうです!もしご興味があって手が出せていない方は、この記事が冬休みの宿題のチャレンジの参考になりましたら幸いです。