👍

BigQuery MLにおいてML.TRANSFORM関数を活用し、前処理されたデータを確認しよう!

2024/02/29に公開

はじめに

こんにちは、クラウドエースデータソリューション部所属のヒッキーです。クラウドエースの IT エンジニアリングを担うシステム開発部の中で、特にデータ基盤構築・分析基盤構築からデータ分析までを含む一貫したデータ課題の解決を専門とするのがデータソリューション部です。

データソリューション部では活動の一環として、毎週 Google Cloud (旧 Google Cloud Platform、以下「GCP」) の新規リリースを調査・発表し、データ領域のプロダクトのキャッチアップをしています。その中でも重要と考えるリリースを本ページ含め記事として公開しています。
今回ご紹介するリリースは、2023年12月07日にプレビューとなった、BigQuery ML(以下BQML) のML.TRANSFORM関数です。この関数を利用することで前処理後の特徴データを取得できるようになりました。

前提知識

BigQuery ML(BQML)

BQML とは BigQuery(以下BQ)が提供する機械学習サービスです。BQ 上で機械学習の評価や予測、トレーニングを行えます。SQL を書ければ誰でも利用可能であるため、機械学習初心者でも簡単に機械学習を行えます。
BQML を利用することで、以下の3つの利点があります。

  1. SQL の記述でモデルを作成することができます。
  2. 作成されたモデルを反復学習することで、開発速度を向上できます。
  3. 一般的な ML タスクとハイパーパラメータの調整を自動化できます。

リリース内容

今回のリリースで、BQML において ML.TRANSFORM 関数がプレビューとなりました。この関数は、モデル中に記載された TRANSFORM 句で前処理されたデータを取得することができます。そのため、モデル中に TRANSFORM 句を使用していない場合、ML.TRANSFORM 関数は利用できないため注意しましょう。
ML.TRANSFORM 関数の基本構文は以下のようになっています。

ML.TRANSFORM(
  MODEL `project_id.dataset.model`,
  { TABLE `project_id.dataset.table` | (query_statement) }
)

ML.TRANSFORM 関数の引数について説明していきます。

  • project_id
    • プロジェクトidを入力します。
  • dataset
    • modelを含んでいるデータセット名を入力します。
  • model
    • モデル名を入力します。ここで使用するモデルは、CREATE MODEL句で作成されている必要があります。また、モデル中に TRANSFORM句が使用されていない場合、エラーを出力します。
  • table
    • 前処理を施したいデータが含まれるテーブル名を入力します。
  • query_statement
    • 前処理をするデータを生成するクエリを入力します。この句に関しては必ず入力されている必要はありません。

検証

今回は簡単なデータを利用して ML.TRANSFORM 関数を検証していきます。
今回使用するデータは BQ の一般公開データセット内にある、機械学習用のデータです。あらかじめ用意されたデータセットのため、BQ 内でモデル作成を完結させられます。
また検証は以下の公式ドキュメントに沿って行っていきます。
(The ML.TRANSFORM function)

ML.TRANSFORM関数

  1. はじめに、GCPを開きます。その後、ナビゲーションメニューから「 BigQuery 」→ BigQuery Studio を選択しましょう。以下のような画面に遷移できていることを確認します。
    alt

  2. SQLを記載するワークスペースを開きます。画面中央に書かれている「BigQuery Studio へようこそ」の上側にある「無題」と書かれたタブをクリックします。SQLを実際に記載するワークスペースが開かれます。

  3. データセットを作成していきます。

    1. 「エクスプローラ」と書かれた箇所の下側に、自分のプロジェクト名が記載されたストレージがあります。その右側にある三点マーカーをクリックし、「データセットを作成」をクリックします。
    2. 画面右側にデータセット作成画面が表示されますので、データセット ID と書かれている箇所に任意の ID を入力してください。その後、データセット作成ボタンをクリックします。
    3. 作成後、自分のプロジェクト名が記載されたストレージを開き、作成したデータセットがあることを確認します。
      例として、私は今回"bqml_tutorial"という名称でデータセットを作成しました。以下のような画面となっていることを確認しましょう。
      alt
  4. 機械学習モデルを作成していきます。以下のSQL文をコピー&ペーストしてください。DATASET には先ほど作成したデータセットの ID を、MODEL_NAME には任意のモデル名を入力してください。入力ができたら、「実行」ボタンを入力してください。

CREATE OR REPLACE MODEL `DATASET.MODEL_NAME`
  TRANSFORM(
    species,
    island,
    ML.MAX_ABS_SCALER(culmen_length_mm) OVER () AS culmen_length_mm,
    ML.MAX_ABS_SCALER(flipper_length_mm) OVER () AS flipper_length_mm,
    sex,
    body_mass_g)
  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
);
  1. 作成したモデルを確認していきます。実行後に以下のような画面となることを確認します。実行完了までは数秒から数十秒程度かかる可能性があります。確認できたら「モデルに移動」ボタンをクリックします。ここでは、モデルのタイプや損失タイプ、トレーニングにかかった時間等が確認できます。
    alt

  2. ML.TRANSFORM関数を使用して前処理されたデータを確認していきます。以下のSQL文をコピー&ペーストしてください。DATASET には先ほど作成したデータセットの ID を、MODEL_NAME には先ほど設定したモデル名を入力してください。入力ができたら、「実行」ボタンを入力してください。実行後、以下の画面のようなクエリ結果が得られることを確認します。これにより、前処理されたデータの取得が行えます。

SELECT
  *
FROM
  ML.TRANSFORM(
    MODEL `DATASET.MODEL_NAME`,
    TABLE `bigquery-public-data.ml_datasets.penguins`);

alt

ML.TRANSFORM 関数では、モデルの作成時にデータ変換のために計算された値を、関数の入力データに適用しています。今回の例では、モデル作成時に ML.MAX_ABS_SCALER()を使用しています。そのため、ML.TRANSFORM 関数を使用した際に、モデル作成時に検出された最小値、最大値を利用しています。
以下の画面のように、クエリ結果内の実行の詳細をクリックすると確認できます。
alt

まとめ

今回は BQML の新しい機能である ML.TRANSFORM 関数について見ていきました。この関数を利用することで、学習されたデータの前処理後のデータを閲覧できるようになりました。これにより、学習をする際に正しいデータが前処理されているかを確認できます。
また、学習データ以外にTRANSFORM句の前処理を適用した結果を確認したりすることもできるようになりました。学習時のミスを減らすために、ML.TRANSFORM関数を活用していきましょう。

Discussion