特徴量エンジニアリングで BigQuery ML TRANSFORM 句を使用する

このチュートリアルでは、データ アナリストの方を対象に BigQuery ML を紹介します。BigQuery ML を使用すると、BigQuery で SQL クエリを使用して機械学習モデルを作成して実行できます。このチュートリアルでは、TRANSFORM 句を使用した特徴量エンジニアリングを紹介します。TRANSFORM 句を使用して、モデル作成時にすべての前処理を指定できます。前処理は、機械学習の予測と評価の段階で自動的に適用されます。

このチュートリアルでは、natality サンプル テーブルを使用して、新生児の性別、妊娠期間、および母親に関するバケット化された人口統計情報に基づいて、出生時体重を予測するモデルを作成します。natality サンプル テーブルには、米国での新生児に関する 40 年以上の情報が格納されています。

目標

このチュートリアルでは、次のものを使用します。

  • BigQuery ML。CREATE MODEL ステートメントと TRANSFORM 句を使用して線形回帰モデルを作成します。
  • ML.FEATURE_CROSSML.QUANTILE_BUCKETIZE 前処理関数。
  • ML.EVALUATE 関数。ML モデルを評価します。
  • ML.PREDICT 関数。ML モデルを使用して予測を行います。

料金

このチュートリアルでは、Google Cloud の課金対象となる以下のコンポーネントを使用します。

  • BigQuery
  • BigQuery ML

BigQuery の費用の詳細については、BigQuery の料金ページをご覧ください。

始める前に

  1. Google アカウントにログインします。

    Google アカウントをまだお持ちでない場合は、新しいアカウントを登録します。

  2. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    [プロジェクトの選択] ページに移動

  3. Cloud プロジェクトに対して課金が有効になっていることを確認します。プロジェクトに対して課金が有効になっていることを確認する方法を学習する

  4. 新しいプロジェクトでは、BigQuery が自動的に有効になります。既存のプロジェクトで BigQuery を有効にするには、 BigQuery API を有効にします。

    API を有効にする

    にアクセスします。

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

まず、ML モデルを格納する BigQuery データセットを作成します。データセットを作成するには、次の操作を行います。

  1. Google Cloud Console で [BigQuery] ページに移動します。

    [BigQuery] ページに移動

  2. ナビゲーション パネルの [リソース] セクションで、プロジェクト名をクリックします。

  3. 右側の詳細パネルで、[データセットを作成] をクリックします。

    データセットを作成する

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

    • [データセット ID] に bqml_tutorial を入力します。
    • [データのロケーション] で [米国(US)] を選択します。現在、一般公開データセットは US マルチ リージョン ロケーションに保存されています。わかりやすくするため、データセットを同じロケーションに配置します。

      データセットの作成ページ

  5. その他のデフォルト設定はすべてそのままにし、[データセットを作成] をクリックします。

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

次に、BigQuery の natality サンプル テーブルを使用して線形回帰モデルを作成します。子供の出生時体重の予測に使用するモデルを作成するために、次の標準 SQL クエリを使用します。

#standardSQL
CREATE MODEL `bqml_tutorial.natality_model`
TRANSFORM(weight_pounds,
    is_male,
    gestation_weeks,
    ML.QUANTILE_BUCKETIZE(mother_age,
      5) OVER() AS bucketized_mother_age,
    CAST(mother_race AS string) AS mother_race,
    ML.FEATURE_CROSS(STRUCT(is_male,
        CAST(mother_race AS STRING) AS mother_race)) is_male_mother_race)
OPTIONS
  (model_type='linear_reg',
    input_label_cols=['weight_pounds']) AS
SELECT
  *
FROM
  `bigquery-public-data.samples.natality`
WHERE
  weight_pounds IS NOT NULL
  AND RAND() < 0.001

CREATE MODEL コマンドはモデルを作成するとともに、作成したモデルのトレーニングも行います。

クエリの詳細

CREATE MODEL 句は、bqml_tutorial.natality_model という名前のモデルを作成し、トレーニングするために使用されます。

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

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

  • weight_pounds: ポンド単位の子供の体重(FLOAT64)。
  • is_male: 子供の性別。子供が男児の場合は TRUE、女児の場合は FALSE(BOOL)。
  • gestation_weeks: 妊娠週数(INT64)。
  • mother_age: 出産時の母親の年齢(INT64)。
  • mother_race: 母親の人種(INT64)。この整数値は、テーブル スキーマの child_race 値と同じです。BigQuery ML で mother_race を非数値の特徴として扱うには、各カテゴリを表す固有値を使用して、クエリで mother_race を STRING 型にキャストします。人種は、(順序とスケールを持つ)整数として扱うよりも、カテゴリとして扱ったほうが良い場合が多いため、この処理は重要になります。

TRANSFORM 句により、元の機能は前処理されてトレーニングに使用されます。生成される列は次のとおりです。

  • weight_pounds: 変更なしでそのまま渡されます。
  • is_male: そのまま渡され、トレーニングに使用されます。
  • gestation_weeks: そのまま渡され、トレーニングに使用されます。
  • bucketized_mother_age: ML.QUANTILE_BUCKETIZE() 分析関数を使用して、変位値に基づいて mother_age をバケット化することにより、mother_age から生成されます。
  • mother_race: 元の mother_race の文字列の形式です。
  • is_male_mother_race: ML.FEATURE_CROSS 関数を使用して、is_malemother_race の交差から生成されます。

クエリの SELECT ステートメントは、TRANSFORM 句で使用できる列を提供します。ただし、TRANSFORM 句の列のすべてを使用する必要はありません。その結果、TRANSFORM 句内で機能の選択と前処理の両方を行うことができます。

FROM 句(bigquery-public-data.samples.natality)は、サンプル データセットの natality サンプル テーブルにクエリを実行していることを示します。このデータセットは bigquery-public-data プロジェクト中にあります。

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

CREATE MODEL クエリを実行する

モデルを作成してトレーニングする CREATE MODEL クエリを実行するには、次の操作を行います。

  1. Cloud Console で、[クエリを新規作成] ボタンをクリックします。

  2. [クエリエディタ] テキスト領域に、次の標準 SQL クエリを入力します。

    #standardSQL
    CREATE MODEL `bqml_tutorial.natality_model`
    TRANSFORM(weight_pounds,
        is_male,
        gestation_weeks,
        ML.QUANTILE_BUCKETIZE(mother_age,
          5) OVER() AS bucketized_mother_age,
        CAST(mother_race AS string) AS mother_race,
        ML.FEATURE_CROSS(STRUCT(is_male,
            CAST(mother_race AS STRING) AS mother_race)) is_male_mother_race)
    OPTIONS
      (model_type='linear_reg',
        input_label_cols=['weight_pounds']) AS
    SELECT
      *
    FROM
      `bigquery-public-data.samples.natality`
    WHERE
      weight_pounds IS NOT NULL
      AND RAND() < 0.001
    
  3. [実行] をクリックします。

    クエリが完了するまでに約 30 秒かかります。完了後、モデル(natality_model)がナビゲーション パネルに表示されます。クエリは CREATE MODEL ステートメントを使用してテーブルを作成するため、クエリの結果は表示されません。

(省略可)ステップ 3: トレーニングの統計情報を取得する

モデルのトレーニング結果を確認するには、ML.TRAINING_INFO 関数を使用するか、Cloud Console で統計情報を表示します。このチュートリアルでは Cloud Console を使用します。

機械学習アルゴリズムは、多くのサンプルを検査し、損失を最小限に抑えるモデルを見つけることでモデルを構築します。このプロセスを「経験損失最小化」と呼びます。

損失とは、精度の低い予測に対するペナルティです。これは、1 つのサンプルで予測の精度がどのくらい低いかで表します。モデルの予測が完璧であれば、損失はゼロになります。それ以外の場合、精度に応じて損失が大きくなります。モデルをトレーニングする目的は、すべてのサンプルで平均的に損失の少ない重みとバイアスの組み合わせを見つけることです。

CREATE MODEL クエリで生成したモデルのトレーニング統計を確認するには、次の操作を行います。

  1. Cloud Console のナビゲーション パネルの [リソース] セクションで、[project-name] > [bqml_tutorial] を展開し、[natality_model] をクリックします。

  2. [トレーニング] タブをクリックし、[表示形式] で [テーブル] オプションを選択します。結果は次のようになります。

    ML.TRAINING_INFO の出力。

    [トレーニング データの損失] 列は、トレーニング データセットでモデルのトレーニングを行った後に計算された損失指標を表します。線形回帰を行ったので、この列は平均二乗誤差になります。

    [評価データの損失] 列は、ホールドアウト データセット(モデルを検証するためにトレーニングから返され、保存されているデータ)で計算された損失指標と同じになります。トレーニングで使用されるデフォルトの最適化戦略は「normal_equation」なので、最終モデルに変換するために必要なイテレーションは 1 回だけです。

    optimize_strategy オプションの詳細については、CREATE MODEL ステートメントをご覧ください。

    ML.TRAINING_INFO 関数と「optimize_strategy」トレーニング オプションの詳細については、BigQuery ML 構文リファレンスをご覧ください。

ステップ 4: モデルを評価する

モデルを作成したら、ML.EVALUATE 関数を使用して識別子の性能を評価します。ML.EVALUATE 関数は、実際のデータに対する予測値を評価します。

モデルの評価に使用するクエリは次のとおりです。

#standardSQL
SELECT
  *
FROM
  ML.EVALUATE(MODEL `bqml_tutorial.natality_model`,
    (
    SELECT
      *
    FROM
      `bigquery-public-data.samples.natality`
    WHERE
      weight_pounds IS NOT NULL))

クエリの詳細

上部の SELECT ステートメントで、モデルから列を取得します。

FROM 句で、モデル bqml_tutorial.natality_model に対して ML.EVALUATE 関数を使用します。

このクエリでネストしている SELECT ステートメントと FROM 句は CREATE MODEL クエリと同じです。トレーニングでは TRANSFORM 句が使用されるため、特定の列と変換を指定する必要はありません。自動的に復元されます。

WHERE 句(WHERE weight_pounds IS NOT NULL)は、重みが NULL の行を除外します。

#standardSQL
SELECT
  *
FROM
  ML.EVALUATE(MODEL `bqml_tutorial.natality_model`)

ML.EVALUATE クエリを実行する

モデルを評価する ML.EVALUATE クエリを実行するには、次の操作を行います。

  1. Cloud Console で、[クエリを新規作成] ボタンをクリックします。

  2. [クエリエディタ] テキスト領域に、次の標準 SQL クエリを入力します。

    #standardSQL
    SELECT
      *
    FROM
      ML.EVALUATE(MODEL `bqml_tutorial.natality_model`,
        (
        SELECT
          *
        FROM
          `bigquery-public-data.samples.natality`
        WHERE
          weight_pounds IS NOT NULL))
    
  3. (省略可)処理のロケーションを設定するには、 [その他] プルダウン リストで [クエリの設定] をクリックします。[処理を行うロケーション] で [米国(US)] を選択します。処理を行うロケーションはデータセットのロケーションに基づいて自動的に検出されるため、この手順は省略できます。

    クエリの設定

  4. [実行] をクリックします。

  5. クエリが完了したら、クエリテキスト領域の下にある [結果] タブをクリックします。結果は次のようになります。

    ML.EVALUATE の出力

    線形回帰を使用しているため、結果には次の列が含まれます。

    • mean_absolute_error
    • mean_squared_error
    • mean_squared_log_error
    • median_absolute_error
    • r2_score
    • explained_variance

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

ステップ 5: モデルを使用して結果を予測する

モデルの評価を行ったので、モデルを使用して結果を予測します。モデルを使用して、ワイオミング州で生まれるすべての新生児の出生体重を予測できます。

結果の予測に使用するクエリは次のとおりです。

#standardSQL
SELECT
  predicted_weight_pounds
FROM
  ML.PREDICT(MODEL `bqml_tutorial.natality_model`,
    (
    SELECT
      *
    FROM
      `bigquery-public-data.samples.natality`
    WHERE
      state = "WY"))

クエリの詳細

先頭の SELECT ステートメントで、predicted_weight_pounds 列を取得します。この列は、ML.PREDICT 関数によって生成されます。ML.PREDICT 関数を使用した場合は、モデルの出力列名は predicted_label_column_name です。線形回帰モデルの場合、predicted_labellabel の推定値になります。ロジスティック回帰モデルの場合、predicted_label は予測可能性が高いラベルに応じて、2 つの入力値のいずれかになります。

ML.PREDICT 関数は、モデル bqml_tutorial.natality_model を使用して結果を予測するために使われます。

このクエリでネストしている SELECT ステートメントと FROM 句は CREATE MODEL クエリと同じです。トレーニングでは必ずしもすべての列を渡す必要はなく、TRANSFORM 句で使用される列のみが必須ですので注意してください。ML.EVALUATE と同じように、TRANSFORM 内部の変換は自動的に復元されます。

WHERE 句(WHERE state = "WY")は、予測をワイオミング州に限定していることを示します。

ML.PREDICT クエリを実行する

モデルを使用して結果を予測するクエリを実行するには:

  1. Cloud Console で、[クエリを新規作成] ボタンをクリックします。

  2. [クエリエディタ] テキスト領域に、次の標準 SQL クエリを入力します。

    #standardSQL
    SELECT
      predicted_weight_pounds
    FROM
      ML.PREDICT(MODEL `bqml_tutorial.natality_model`,
        (
        SELECT
          *
        FROM
          `bigquery-public-data.samples.natality`
        WHERE
          state = "WY"))
    
  3. (省略可)処理のロケーションを設定するには、 [その他] プルダウン リストで [クエリの設定] をクリックします。[処理を行うロケーション] で [米国(US)] を選択します。処理を行うロケーションはデータセットのロケーションに基づいて自動的に検出されるため、この手順は省略できます。

    クエリの設定

  4. [実行] をクリックします。

  5. クエリが完了したら、クエリテキスト領域の下にある [結果] タブをクリックします。結果は次のようになります。

    ML.PREDICT の出力

クリーンアップ

このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。

  • 作成したプロジェクトを削除する。
  • または、プロジェクトを保存して、データセットを削除する。

データセットの削除

プロジェクトを削除すると、プロジェクト内のデータセットとテーブルがすべて削除されます。プロジェクトを再利用する場合は、このチュートリアルで作成したデータセットを削除できます。

  1. 必要に応じて、Cloud Console で [BigQuery] ページを開きます。

    [BigQuery] ページに移動

  2. ナビゲーション パネルで、作成した bqml_tutorial データセットをクリックします。

  3. ウィンドウの右側の [データセットを削除] をクリックします。この操作を行うと、データセット、テーブル、すべてのデータが削除されます。

  4. [データセットの削除] ダイアログ ボックスでデータセットの名前(bqml_tutorial)を入力し、[削除] をクリックして確定します。

プロジェクトの削除

プロジェクトを削除するには:

  1. Cloud Console で [リソースの管理] ページに移動します。

    [リソースの管理] に移動

  2. プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
  3. ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。

次のステップ