BigQuery ML でペンギンの体重を予測する


このチュートリアルでは、BigQuery ML の線形回帰モデルを使用し、ペンギンの属性情報に基づいてペンギンの体重を予測します。線形回帰は、入力する特徴量の線型結合から連続値を生成する回帰モデルです。

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

目標

このチュートリアルでは、次のタスクを行います。

  • 線形回帰モデルを作成する。
  • モデルを評価する。
  • モデルを使用して予測を行う。

費用

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

  • BigQuery
  • BigQuery ML

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

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

始める前に

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

    プロジェクト セレクタに移動

  2. Google Cloud プロジェクトで課金が有効になっていることを確認します

  3. BigQuery API を有効にします。

    API を有効にする

必要な権限

BigQuery ML を使用してモデルを作成するには、次の IAM 権限が必要です。

  • bigquery.jobs.create
  • bigquery.models.create
  • bigquery.models.getData
  • bigquery.models.updateData
  • bigquery.models.updateMetadata

推論を実行するには、次の権限が必要です。

  • モデルに対する bigquery.models.getData
  • bigquery.jobs.create

データセットを作成する

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

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

    [BigQuery] ページに移動

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

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

    データセットを作成する。

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

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

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

      一般公開データセットは US マルチリージョンに保存されています。わかりやすくするため、データセットを同じロケーションに保存します。

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

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

モデルを作成する

線形回帰モデルを作成するには、CREATE MODEL ステートメントを使用し、モデルタイプに LINEAR_REG を指定します。モデルの作成にはモデルのトレーニングも含まれます。

CREATE MODEL ステートメントについては、次の点に注意してください。

  • input_label_cols オプションは、SELECT ステートメントでラベル列として使用する列を指定します。ここで、ラベル列は body_mass_g です。線形回帰モデルの場合、ラベル列は実数にする必要があります。つまり、列の値は実数でなければなりません。
  • このクエリの SELECT ステートメントでは、bigquery-public-data.ml_datasets.penguins テーブルの次の列を使用して、ペンギンの体重を予測します。

    • species: ペンギンの種類。
    • island: ペンギンが生息する島。
    • culmen_length_mm: ペンギンのくちばしの長さ(ミリメートル)。
    • culmen_depth_mm: ペンギンのくちばしの高さ(ミリメートル)。
    • flipper_length_mm: ペンギンの翼の長さ(ミリメートル)。
    • sex: ペンギンの性別。
  • このクエリの SELECT ステートメントの WHERE 句(WHERE body_mass_g IS NOT NULL)は、body_mass_g 列が NULL である行を除外します。

線形回帰モデルを作成するクエリを実行します。

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

    [BigQuery] に移動

  2. [クエリエディタ] ペインで、次のクエリを実行します。

    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;
    
  3. penguins_model モデルの作成には約 30 秒かかります。モデルを表示するには、[エクスプローラ] ペインに移動し、bqml_tutorial データセットを開き、[モデル] フォルダを開きます。

トレーニングの統計情報を取得する

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

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

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

CREATE MODEL クエリで生成したモデルのトレーニング統計を確認します。

  1. [エクスプローラ] ペインで、bqml_tutorial データセットを開き、[モデル] フォルダを開きます。[penguins_model] をクリックして、モデル情報ペインを開きます。

  2. [トレーニング] タブをクリックしてから、[テーブル] をクリックします。結果は次のようになります。

    ML.TRAINING_INFO の出力

    [トレーニング データの損失] 列は、トレーニング データセットでモデルのトレーニングを行った後に計算された損失指標を表します。線形回帰を行ったので、この列には平均二乗誤差の値が表示されます。このトレーニングでは normal_equation の最適化戦略が自動的に使用されるため、最終モデルに変換するために必要な反復処理は 1 回だけです。モデルの最適化戦略の設定の詳細については、optimize_strategy をご覧ください。

モデルを評価する

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

入力では、ML.EVALUATE 関数はトレーニング済みモデルと、モデルのトレーニングに使用したデータのスキーマに一致するデータセットを取得します。本番環境では、モデルのトレーニングに使用したデータとは異なるデータでモデルを評価する必要があります。入力データを提供せずに ML.EVALUATE を実行すると、関数はトレーニング中に計算された評価指標を取得します。これらの指標は、自動的に予約された評価データセットを使用して計算されます。

SELECT
  *
FROM
  ML.EVALUATE(MODEL `bqml_tutorial.penguins_model`);

ML.EVALUATE クエリを実行します。

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

    [BigQuery] に移動

  2. [クエリエディタ] ペインで、次のクエリを実行します。

    SELECT
      *
    FROM
      ML.EVALUATE(MODEL `bqml_tutorial.penguins_model`,
        (
        SELECT
          *
        FROM
          `bigquery-public-data.ml_datasets.penguins`
        WHERE
          body_mass_g IS NOT NULL));
    
  3. 結果は次のようになります。

    ML.EVALUATE の出力

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

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

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

Google Cloud コンソールのモデル情報ペインで、評価指標を確認することもできます。

ML.EVALUATE の出力

モデルを使用して結果を予測する

モデルの評価を行ったので、モデルを使用して結果を予測します。モデルに ML.PREDICT 関数を実行すると、ビスコー諸島に生息するすべてのペンギンの体重をグラム単位で予測できます。

入力では、ML.PREDICT 関数はラベル列を除き、トレーニング済みモデルと、モデルのトレーニングに使用したデータのスキーマに一致するデータセットを取得します。

ML.PREDICT クエリを実行します。

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

    [BigQuery] に移動

  2. [クエリエディタ] ペインで、次のクエリを実行します。

    SELECT
      *
    FROM
      ML.PREDICT(MODEL `bqml_tutorial.penguins_model`,
        (
        SELECT
          *
        FROM
          `bigquery-public-data.ml_datasets.penguins`
        WHERE island = 'Biscoe'));
    
  3. 結果は次のようになります。

    ML.PREDICT の出力

予測結果について説明する

モデルがこれらの予測結果を生成する理由を理解するには、ML.EXPLAIN_PREDICT 関数を使用します。

ML.EXPLAIN_PREDICT は、ML.PREDICT 関数の拡張バージョンです。ML.EXPLAIN_PREDICT は、予測結果だけでなく、予測結果の説明に使用する追加の列も出力します。実際には、ML.PREDICT の代わりに ML.EXPLAIN_PREDICT を実行できます。詳細については、BigQuery ML Explainable AI の概要をご覧ください。

ML.EXPLAIN_PREDICT クエリを実行します。

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

    [BigQuery] に移動

  2. [クエリエディタ] ペインで、次のクエリを実行します。

    SELECT
    *
    FROM
    ML.EXPLAIN_PREDICT(MODEL `bqml_tutorial.penguins_model`,
      (
      SELECT
        *
      FROM
        `bigquery-public-data.ml_datasets.penguins`
      WHERE island = 'Biscoe'),
      STRUCT(3 as top_k_features));
    
  3. 結果は次のようになります。

    ML.EXPLAIN_PREDICT の出力

線形回帰モデルでは、Shapley 値を使用して、モデル内の各特徴の特徴アトリビューション値を生成します。クエリで top_k_features3 に設定されているため、ML.EXPLAIN_PREDICTpenguins テーブルの行ごとに上位 3 つの特徴アトリビューションを出力します。これらのアトリビューションは、アトリビューションの絶対値の降順で並べ替えられます。すべての例で、特徴量 sex が予測全体に最も貢献しています。

モデルをグローバルに説明する

一般的にペンギンの体重を決定するうえで最も重要な特徴を特定するには、ML.GLOBAL_EXPLAIN 関数を使用します。ML.GLOBAL_EXPLAIN を使用するには、ENABLE_GLOBAL_EXPLAIN オプションを TRUE に設定してモデルを再トレーニングする必要があります。

モデルを再トレーニングしてグローバルな説明を取得します。

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

    [BigQuery] に移動

  2. クエリエディタで、次のクエリを実行してモデルを再トレーニングします。

    #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;
    
  3. クエリエディタで次のクエリを実行して、グローバルな説明を取得します。

    SELECT
      *
    FROM
      ML.GLOBAL_EXPLAIN(MODEL `bqml_tutorial.penguins_model`)
    
  4. 結果は次のようになります。

    ML.GLOBAL_EXPLAIN の出力

クリーンアップ

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

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

データセットを削除する

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

  1. 必要に応じて、Google Cloud コンソールで [BigQuery] ページを開きます。

    [BigQuery] ページに移動

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

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

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

プロジェクトを削除する

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

  1. Google Cloud コンソールで、[リソースの管理] ページに移動します。

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

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

次のステップ