線形回帰モデルのチュートリアルで、今度こそBigQuery MLに入門してみる!

BigQuery MLの基本操作を今度こそ分かって、すっきり2022年を締めたい。
2022.12.12

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

データアナリティクス事業本部の鈴木です。

クラスメソッド 機械学習チーム アドベントカレンダー 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テーブルに格納されています。一般公開データセットのテーブルは、当然ですが中身の情報を確認することが可能です。

penguinsテーブルの内容

同様にプレビューも可能です。

プレビュー結果

初めてする方だとどの程度のデータが入っているのか分からず不安だと思うので、確認した方法を記載します。

基本的には一般公開データセットを開くの手順で開くのが正解ですが、上手く検索にかからない場合は以下でも可能です。

「エクスプローラー」の文字の右のメニューで、+データを追加を押す。

データを追加

その他のソース名前を指定してプロジェクトにスターを付けるをクリックする。

名前を指定してプロジェクトにスターを付ける

プロジェクト名bigquery-public-dataを入力し、スターを付けるを押す。

スターを付ける

以下のようにリソースが追加されたので、中身のテーブルを確認してみてください。

データセットが追加される

チュートリアルをやってみる

チュートリアルに沿って、7ステップで進めていきました。それぞれやったことや感想をまとめていきます。

ステップ1: データセットを作成する

まずはモデルを作成するデータセットを作成しました。データセットを作成したいプロジェクトでデータセットを作成を押します。

データセットの作成

データセットIDはbqml_tutorialを入力しました。データのロケーションは米国(US)にしました。ほかはデフォルトでデータセットを作成を押します。

データセットの作成

データのロケーションは、この記事を見ていただいている方は実際のところは東京リージョンに作成することが多いと思います。BigQuery MLは、訓練データのあるデータセットとモデルを作成するデータセットのロケーションは、記事執筆時点だと、同じである必要があります。

ステップ2: モデルを作成する

チュートリアル記載の以下のクエリを実行して、モデルを作成します。モデルを作成には、CREATE MODEL句を使います。OPTIONSmodel_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関数を実行してみます。

ML.GLOBAL_EXPLAINの実行結果

attributionの大きさで、重要な特徴がどれか分かるようになっていますね。

リソースの削除

検証が終わったので、作成したリソースは削除しておきます。個人アカウントであればプロジェクトごと削除するのが確実ですが、そうでない場合は今回作成したデータセットを削除しておきましょう。

データセットの削除1

データセットの削除2

おわりに

今回は『BigQuery ML でペンギンの体重を予測する』チュートリアルを通して、実際にBigQuery MLの使い方をご紹介しました。

データセットなどBigQueryならではの単語や使い方があるので、本当に初めてのときは慣れながらぽちぽち実行していました。何回かやっているうちに分かるようになったので、統計手法・機械学習について既に使い方をある程度分かっている方で、チュートリアルでピンと来なかった方は、めげずに何回か試してみて頂ければと思います。

今年も残り少なくなってきましたが、BigQuery MLの使い方も、モデルを作成して推定を実行するところまでは分かったので、気持ちよく年越しできそうです!もしご興味があって手が出せていない方は、この記事が冬休みの宿題のチャレンジの参考になりましたら幸いです。