BigQuery ML で出生時体重を予測する

このチュートリアルでは、データ アナリストの方を対象に BigQuery ML を紹介します。BigQuery ML を使用すると、BigQuery で SQL クエリを使用して機械学習モデルを作成して実行できます。このチュートリアルでは、SQL のユーザーが簡単に機械学習を利用できるようにすることを目標としています。使い慣れたツールを使用してモデルを構築でき、データ移動の必要もないため、開発スピードを向上させることができます。

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

目標

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

  • BigQuery ML。CREATE MODEL ステートメントを使用して、2 項線形回帰モデルを作成します。
  • ML.EVALUATE 関数。ML モデルを評価します。
  • ML.PREDICT 関数。ML モデルを使用して予測を行います。

料金

このチュートリアルでは、以下を含む、Cloud Platform の有料コンポーネントを使用します。

  • BigQuery
  • BigQuery ML

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

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

始める前に

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

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

  2. GCP プロジェクトを選択または作成します。

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

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

    課金を有効にする方法について

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

    APIを有効にする

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

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

  1. GCP Console の BigQuery ウェブ UI に移動します。

    BigQuery ウェブ UI に移動

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

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

    データセットを作成

  4. [Create dataset] ページで、次の操作を行います。

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

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

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

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

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

#standardSQL
CREATE MODEL `bqml_tutorial.natality_model`
OPTIONS
  (model_type='linear_reg',
    input_label_cols=['weight_pounds']) AS
SELECT
  weight_pounds,
  is_male,
  gestation_weeks,
  mother_age,
  CAST(mother_race AS string) AS mother_race
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 列は入力ラベルの列です。線形回帰モデルの場合、ラベル列は実数にする必要があります(列の値が実数でなければなりません)。

このクエリの 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 型にキャストします。人種は、整数(順序とスケールを持つ)として扱うよりも、カテゴリとして扱ったほうが良い場合が多いため、この処理は重要になります。

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. BigQuery ウェブ UI で、[クエリを新規作成] ボタンをクリックします。

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

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

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

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

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

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

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

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

  1. BigQuery ウェブ UI の [Resources] セクションで、[PROJECT_ID] > bqml_tutorial の順に開き、natality_model をクリックします。

  2. [Model stats] タブをクリックします。結果は次のようになります。

    ML.TRAINING_INFO の出力

    [Training Data Loss] 列は、トレーニング データセットでモデルのトレーニングを行った後に計算された損失指標を表します。線形回帰を行ったので、この列は平均二乗誤差になります。[Evaluation Data Loss] 列は、ホールドアウト データセット(モデルを検証するためにトレーニングから返され、保存されているデータ)で計算された損失指標と同じになります。ここでは「normal_equation」最適化戦略が自動的にトレーニングに使用されるため、最終モデルに変換するために必要な繰り返しは 1 回だけです。optimize_strategy オプションの詳細については、CREATE MODEL ステートメントをご覧ください。

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

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

モデルを作成したら、ML.EVALUATE 関数を使用して分類子の性能を評価します。ML.EVALUATE 関数は、実際のデータに対する予測値を評価します。分類子は、列挙されたラベルのターゲット値の 1 つです。

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

#standardSQL
SELECT
  *
FROM
  ML.EVALUATE(MODEL `bqml_tutorial.natality_model`,
    (
    SELECT
      weight_pounds,
      is_male,
      gestation_weeks,
      mother_age,
      CAST(mother_race AS STRING) AS mother_race
    FROM
      `bigquery-public-data.samples.natality`
    WHERE
      weight_pounds IS NOT NULL))

クエリの詳細

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

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

このクエリでネストしている SELECT ステートメントと FROM 句は CREATE MODEL クエリと同じです。

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

ML.EVALUATE クエリを実行する

モデルを評価する ML.EVALUATE クエリを実行するには:

  1. BigQuery ウェブ UI で、[クエリを新規作成] ボタンをクリックします。

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

    #standardSQL
    SELECT
      *
    FROM
      ML.EVALUATE(MODEL `bqml_tutorial.natality_model`,
        (
        SELECT
          weight_pounds,
          is_male,
          gestation_weeks,
          mother_age,
          CAST(mother_race AS STRING) AS mother_race
        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
      is_male,
      gestation_weeks,
      mother_age,
      CAST(mother_race AS STRING) AS mother_race
    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 クエリと同じです。

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

ML.PREDICT クエリを実行する

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

  1. BigQuery ウェブ UI で、[クエリを新規作成] ボタンをクリックします。

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

    #standardSQL
    SELECT
      predicted_weight_pounds
    FROM
      ML.PREDICT(MODEL `bqml_tutorial.natality_model`,
        (
        SELECT
          is_male,
          gestation_weeks,
          mother_age,
          CAST(mother_race AS STRING) AS mother_race
        FROM
          `bigquery-public-data.samples.natality`
        WHERE
          state = "WY"))
    
  3. (任意)処理を行うロケーションを設定するには、[詳細] > [クエリの設定] の順にクリックします。[処理を行うロケーション] には US を選択します。処理のロケーションはデータセットのロケーションに基づいて自動的に検出されるため、この手順は省略できます。

    クエリの設定

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

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

    ML.PREDICT の出力

クリーンアップ

このチュートリアルで使用したリソースについて、Google Cloud Platform アカウントに課金されないようにする手順は次のとおりです。

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

データセットの削除

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

  1. 必要に応じて、BigQuery ウェブ UI を開きます。

    BigQuery ウェブ UI に移動

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

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

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

プロジェクトの削除

プロジェクトを削除する手順は次のとおりです。

  1. GCP Console で [プロジェクト] ページに移動します。

    プロジェクト ページに移動

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

次のステップ

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

BigQuery ML のドキュメント