TRANSFORM 句を使用して特徴量エンジニアリングを実行する

このチュートリアルでは、CREATE MODEL ステートメントの TRANSFORMを使用して、モデルの作成およびトレーニングと同時に特徴量エンジニアリングを行う方法について説明します。TRANSFORM 句を使用して、1 つ以上の前処理関数を指定し、モデルのトレーニングに使用する入力データを変換できます。モデルに適用する前処理は、モデルを ML.EVALUATE 関数と ML.PREDICT 関数で使用すると自動的に適用されます。

このチュートリアルでは、一般公開の bigquery-public-data.ml_datasets.penguin データセットを使用します。

データセットを作成する

ML モデルを保存する BigQuery データセットを作成します。

コンソール

  1. Google Cloud コンソールで、[BigQuery] ページに移動します。

    [BigQuery] ページに移動

  2. [エクスプローラ] ペインで、プロジェクト名をクリックします。

  3. [アクションを表示] > [データセットを作成] をクリックします。

  4. [データセットを作成する] ページで、次の操作を行います。

    • [データセット ID] に「bqml_tutorial」と入力します。

    • [ロケーション タイプ] で [マルチリージョン] を選択してから、[US(米国の複数のリージョン)] を選択します。

    • 残りのデフォルトの設定は変更せず、[データセットを作成] をクリックします。

bq

新しいデータセットを作成するには、--location フラグを指定した bq mk コマンドを使用します。使用可能なパラメータの一覧については、bq mk --dataset コマンドのリファレンスをご覧ください。

  1. データの場所が US に設定され、BigQuery ML tutorial dataset という説明の付いた、bqml_tutorial という名前のデータセットを作成します。

    bq --location=US mk -d \
     --description "BigQuery ML tutorial dataset." \
     bqml_tutorial

    このコマンドでは、--dataset フラグの代わりに -d ショートカットを使用しています。-d--dataset を省略した場合、このコマンドはデフォルトでデータセットを作成します。

  2. データセットが作成されたことを確認します。

    bq ls

API

定義済みのデータセット リソースを使用して datasets.insert メソッドを呼び出します。

{
  "datasetReference": {
     "datasetId": "bqml_tutorial"
  }
}

BigQuery DataFrames

このサンプルを試す前に、BigQuery DataFrames を使用した BigQuery クイックスタートの手順に沿って BigQuery DataFrames を設定してください。詳細については、BigQuery DataFrames のリファレンス ドキュメントをご覧ください。

BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の ADC の設定をご覧ください。

import google.cloud.bigquery

bqclient = google.cloud.bigquery.Client()
bqclient.create_dataset("bqml_tutorial", exists_ok=True)

モデルを作成する

ペンギンの体重を予測する線形回帰モデルを作成し、penguins サンプル テーブルでトレーニングします。

OPTIONS(model_type='linear_reg', input_label_cols=['body_mass_g']) 句は、線形回帰モデルを作成することを意味します。線形回帰モデルは、入力する特徴量の線型結合から連続値を生成します。body_mass_g 列は入力ラベルの列です。線形回帰モデルの場合、ラベル列は実数にする必要があります(列の値は実数でなければなりません)。

このクエリの TRANSFORM 句は、SELECT ステートメントの次の列を使用します。

  • body_mass_g: 変更なしでトレーニングで使用されます。
  • culmen_depth_mm: 変更なしでトレーニングで使用されます。
  • flipper_length_mm: 変更なしでトレーニングで使用されます。
  • bucketized_culmen_length: ML.QUANTILE_BUCKETIZE() 分析関数を使用して、変位値に基づいて culmen_length_mm をバケット化することにより、culmen_length_mm から生成されます。
  • culmen_length_mm: 元の culmen_length_mm 値。STRING 値にキャストされ、トレーニングで使用されます。
  • species_sex: ML.FEATURE_CROSS 関数を使用して、speciessex の交差から生成されます。

TRANSFORM 句でトレーニング テーブルのすべての列を使用する必要はありません。

WHERE 句(WHERE body_mass_g IS NOT NULL AND RAND() < 0.2)は、ペンギンの体重が NULL の行を除外し、RAND 関数を使用してデータのランダム サンプルを取得します。

次の手順でモデルを作成します。

  1. Google Cloud コンソールで、[BigQuery] ページに移動します。

    [BigQuery] に移動

  2. クエリエディタに次のクエリを貼り付け、[実行] をクリックします。

    CREATE OR REPLACE MODEL `bqml_tutorial.penguin_transform`
      TRANSFORM(
        body_mass_g,
        culmen_depth_mm,
        flipper_length_mm,
        ML.QUANTILE_BUCKETIZE(culmen_length_mm, 10) OVER () AS bucketized_culmen_length,
        CAST(culmen_length_mm AS string) AS culmen_length_mm,
        ML.FEATURE_CROSS(STRUCT(species, sex)) AS species_sex)
      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
      AND RAND() < 0.2;

    クエリが完了するまでに約 15 分かかります。完了後、penguin_transform モデルが [エクスプローラ] ペインに表示されます。クエリは CREATE MODEL ステートメントを使用してモデルを作成するため、クエリの結果は表示されません。

モデルを評価する

ML.EVALUATE 関数を使用してモデルのパフォーマンスを評価します。ML.EVALUATE 関数は、モデルから返されたペンギンの体重予測を、トレーニング データの実際のペンギンの体重と比較して評価します。

このクエリでネストしている SELECT ステートメントと FROM 句は CREATE MODEL クエリのものと同じです。モデルの作成時に TRANSFORM 句を使用したため、ML.EVALUATE 関数で列と変換を再度指定する必要はありません。関数はモデルからそれらを自動的に取得します。

次の手順でモデルを評価します。

  1. Google Cloud コンソールで、[BigQuery] ページに移動します。

    [BigQuery] に移動

  2. クエリエディタに次のクエリを貼り付け、[実行] をクリックします。

    SELECT
      *
    FROM
      ML.EVALUATE(
        MODEL `bqml_tutorial.penguin_transform`,
        (
          SELECT
            *
          FROM
            `bigquery-public-data.ml_datasets.penguins`
          WHERE
            body_mass_g IS NOT NULL
        ));

    結果は次のようになります。

    +---------------------+--------------------+------------------------+-----------------------+--------------------+--------------------+
    | mean_absolute_error | mean_squared_error | mean_squared_log_error | median_absolute_error |      r2_score      | explained_variance |
    +---------------------+--------------------+------------------------+-----------------------+--------------------+--------------------+
    |   64.21134350607677 | 13016.433317859564 |   7.140935762696211E-4 |     15.31788461553515 | 0.9813042531507734 | 0.9813186268757634 |
    +---------------------+--------------------+------------------------+-----------------------+--------------------+--------------------+
    

    評価結果における重要な測定指標は、R2スコア(決定係数)です。R2 スコアは、線形回帰予測が実際のデータに近似するかどうかを決定する統計的尺度です。0 の値は、モデルの平均値周辺のレスポンス データにばらつきがないことを示しています。1 の値は、モデルの平均値周辺のレスポンス データにばらつきがあることを示しています。

    ML.EVALUATE 関数の出力の詳細については、出力をご覧ください。

    また、入力データを指定せずに ML.EVALUATE を呼び出すこともできます。これにはトレーニング中に計算された評価指標が使用されます。

モデルを使用してペンギンの体重を予測する

ML.PREDICT 関数とともにモデルを使用し、オスのペンギンの体重を予測します。

ML.PREDICT 関数は、予測値を predicted_label_column_name 列(この場合は predicted_body_mass_g)に出力します。

ML.PREDICT 関数を使用する場合、モデル トレーニングで使用されるすべての列を渡す必要はありません。TRANSFORM 句で使用した列のみが必要です。ML.EVALUATE と同様に、ML.PREDICT 関数はモデルから TRANSFORM 列と変換を自動的に取得します。

モデルから予測を取得する手順は次のとおりです。

  1. Google Cloud コンソールで、[BigQuery] ページに移動します。

    [BigQuery] に移動

  2. クエリエディタに次のクエリを貼り付け、[実行] をクリックします。

    SELECT
      predicted_body_mass_g
    FROM
      ML.PREDICT(
        MODEL `bqml_tutorial.penguin_transform`,
        (
          SELECT
            *
          FROM
            `bigquery-public-data.ml_datasets.penguins`
          WHERE
            sex = 'MALE'
        ));

    結果は次のようになります。

    +-----------------------+
    | predicted_body_mass_g |
    +-----------------------+
    |    2810.2868541725757 |
    +-----------------------+
    |    3813.6574220842676 |
    +-----------------------+
    |     4098.844698262214 |
    +-----------------------+
    |     4256.587135004173 |
    +-----------------------+
    |     3008.393497302691 |
    +-----------------------+
    |     ...               |
    +-----------------------+