国勢調査データに基づいた分類モデルを構築して使用する


BigQuery ML は、ロジスティック回帰モデルタイプでの教師あり学習をサポートしています。2 つのカテゴリのどちらに値が分類されるかを予測するには 2 項ロジスティック回帰モデルタイプを使用し、複数のカテゴリのうちのどれに値が分類されるかを予測するには多項回帰モデルタイプを使用します。これらはデータを 2 つ以上のカテゴリに分類するため、分類問題と呼ばれます。

このチュートリアルでは、BigQuery ML の 2 項ロジスティック回帰モデルを使用して、米国国勢調査データセットの回答者の所得階層を予測します。このデータセットには、2000 年と 2010 年の米国居住者のユーザー属性と所得情報が含まれています。このデータには、就業状況、職種、教育レベル、所得の情報が含まれています。

目標

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

  • ロジスティック回帰モデルを作成する。
  • ロジスティック回帰モデルを評価する。
  • ロジスティック回帰モデルを使用して予測を行う。

費用

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

  • BigQuery
  • BigQuery ML

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

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

始める前に

  1. Google Cloud アカウントにログインします。Google Cloud を初めて使用する場合は、アカウントを作成して、実際のシナリオでの Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
  2. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

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

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

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

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

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

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

    BigQuery API を有効にします。

    API を有効にする

    にアクセスします。

はじめに

機械学習の一般的な問題は、ラベルと呼ばれる 2 つのタイプのいずれかにデータを分類することです。たとえば、小売業者は特定の顧客が新しい製品を購入するかどうかを、その顧客に関するその他の情報に基づいて予測したい場合があります。この場合、2 つのラベルは「購入する」と「購入しない」になります。データセットを構築する際にはこれらのラベルを表す列を 1 つ用意します。このような 2 項ロジスティック回帰モデルのトレーニングに使用できるデータとして、顧客の場所、以前の購入、報告された顧客の好みなどがあります。

このチュートリアルでは、BigQuery ML を使用して、米国国勢調査の回答者のユーザー属性に基づいて、その回答者の所得が 2 つの範囲のどちらに分類されるかを予測する 2 項ロジスティック回帰モデルを作成します。

ロジスティック回帰モデルの作成は、次の手順で行われます。

  • ステップ 1: モデルを格納するためのデータセットを作成する。
    最初のステップとして、モデルを格納する BigQuery データセットを作成します。
  • ステップ 2: データを確認する。
    このステップでは、データセットを確認して、ロジスティック回帰モデルのトレーニング データとして使用する列を特定します。
  • ステップ 3: トレーニング データを選択する。
    次に、census_adult_income テーブルに対してクエリを実行して、2 項ロジスティック回帰モデルのトレーニングに使用するデータを準備します。 このステップでは、関連性のある特徴を特定し、その後のクエリで入力データとして使用するためにビューに保存します。
  • ステップ 4: ロジスティック回帰モデルを作成する。
    ステップ 4 では、CREATE MODEL ステートメントを使用してロジスティック回帰モデルを作成します。
  • ステップ 5: ML.EVALUATE 関数を使用してモデルを評価する。
    次に、ML.EVALUATE 関数でモデルの性能に関する統計を取得します。
  • ステップ 6: ML.PREDICT 関数を使用して回答者の所得を予測する。
    最後に、ML.PREDICT 関数を使用して、特定の国勢調査回答者の所得階層を予測します。

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

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

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

    [BigQuery] ページに移動

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

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

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

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

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

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

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

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

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

ステップ 2: データを確認する

次に、データセットを確認して、ロジスティック回帰モデルのトレーニング データとして使用する列を特定します。GoogleSQL クエリを使用して、データセットから行を返すことができます。

次のクエリでは、米国国勢調査データセットから 100 行が返されます。

SELECT
  age,
  workclass,
  marital_status,
  education_num,
  occupation,
  hours_per_week,
  income_bracket
FROM
  `bigquery-public-data.ml_datasets.census_adult_income`
LIMIT
  100;

クエリを実行する

データセットから行を返すクエリを実行するには:

  1. Google Cloud コンソールで、[クエリを新規作成] ボタンをクリックします。

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

    SELECT
      age,
      workclass,
      marital_status,
      education_num,
      occupation,
      hours_per_week,
      income_bracket
    FROM
      `bigquery-public-data.ml_datasets.census_adult_income`
    LIMIT
      100;
    
  3. [実行] をクリックします。

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

    国勢調査データ

    クエリ結果から、census_adult_income テーブルの income_bracket 列には <=50K または >50K の 2 つの値のどちらかしかないことがわかります。また、census_adult_income テーブルの列 educationeducation_num は同じデータを異なる形式で表したものであることがわかります。functional_weight 列は、国勢調査機関が特定の行に対応すると考えている人数で、この列の値は、特定の行の income_bracket の値とは関連性がないと思われます。

ステップ 3: トレーニング データを選択する

次に、ロジスティック回帰モデルのトレーニングに使用するデータを選択します。このチュートリアルでは、次の属性に基づいて国勢調査回答者の所得を予測します。

  • 年齢
  • 業務のタイプ
  • 婚姻状況
  • 教育水準
  • 職業
  • 週あたりの労働時間

次のクエリでは、トレーニング データをまとめるビューを作成します。このビューは、チュートリアルの後半で CREATE MODEL ステートメントで使われます。

CREATE OR REPLACE VIEW
  `census.input_view` AS
SELECT
  age,
  workclass,
  marital_status,
  education_num,
  occupation,
  hours_per_week,
  income_bracket,
  CASE
    WHEN MOD(functional_weight, 10) < 8 THEN 'training'
    WHEN MOD(functional_weight, 10) = 8 THEN 'evaluation'
    WHEN MOD(functional_weight, 10) = 9 THEN 'prediction'
  END AS dataframe
FROM
  `bigquery-public-data.ml_datasets.census_adult_income`

クエリの詳細

このクエリは、回答者の教育水準を表す education_num や、回答者が行う業務のタイプを表す workclass など、国勢調査回答者に関するデータを抽出します。このクエリでは、データが重複するカテゴリは除外しています。たとえば、census_adult_income テーブルの列 educationeducation_num は同じデータを異なる形式で表しているため、このクエリでは education 列を除外しています。dataframe 列では、除外された functional_weight 列を使用して、データソースの 80% にトレーニング用としてラベルを付け、残りのデータを評価用と予測用として予約しています。クエリでこれらの列を含むビューを作成し、後でそれを使用してトレーニングと予測を行えるようにします。

クエリを実行する

モデル用のトレーニング データをまとめるクエリを実行するには:

  1. Google Cloud コンソールで、[クエリを新規作成] ボタンをクリックします。

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

    CREATE OR REPLACE VIEW
      `census.input_view` AS
    SELECT
      age,
      workclass,
      marital_status,
      education_num,
      occupation,
      hours_per_week,
      income_bracket,
      CASE
        WHEN MOD(functional_weight, 10) < 8 THEN 'training'
        WHEN MOD(functional_weight, 10) = 8 THEN 'evaluation'
        WHEN MOD(functional_weight, 10) = 9 THEN 'prediction'
      END AS dataframe
    FROM
      `bigquery-public-data.ml_datasets.census_adult_income`
    
  3. [実行] をクリックします。

  4. ナビゲーション パネルの [リソース] セクションで、プロジェクト名をクリックします。ビューがその下に表示されます。

  5. ビューをクリックします。ビューのスキーマが、クエリエディタの下の [スキーマ] タブに表示されます。

    クエリ結果

ステップ 4: ロジスティック回帰モデルを作成する

トレーニング データを確認したら、次のステップでは、そのデータを使用してロジスティック回帰モデルを作成します。

CREATE MODEL ステートメントを 'LOGISTIC_REG' オプション付きで使用することで、ロジスティック回帰モデルの作成とトレーニングが行えます。次のクエリでは、CREATE MODEL ステートメントを使用して、前のクエリで作成したビューで新しい 2 項ロジスティック回帰モデルをトレーニングしています。

CREATE OR REPLACE MODEL
  `census.census_model`
OPTIONS
  ( model_type='LOGISTIC_REG',
    auto_class_weights=TRUE,
    input_label_cols=['income_bracket']
  ) AS
SELECT
  * EXCEPT(dataframe)
FROM
  `census.input_view`
WHERE
  dataframe = 'training'

クエリの詳細

CREATE MODEL ステートメントは、SELECT ステートメントのトレーニング データを使用してモデルをトレーニングしています。

OPTIONSは、モデルタイプとトレーニング オプションを指定します。ここでは、LOGISTIC_REG オプションでロジスティック回帰モデルタイプを指定しています。2 項ロジスティック回帰モデルか多項ロジスティック回帰モデルかを指定する必要はありません。BigQuery はラベル列の一意の値の数に基づいてどちらをトレーニングするかを判断できます。

input_label_cols オプションは、SELECT ステートメントでラベル列として使用する列を指定します。ここでは、ラベル列は income_bracket であるため、モデルは他の行の値に基づいて、income_bracket の 2 つの値のどちらに分類される可能性が高いかを学習します。

'auto_class_weights=TRUE' オプションは、トレーニング データ内のクラスラベルのバランスをとります。デフォルトでは、トレーニング データは重み付けされません。トレーニング データ内のラベルが不均衡である場合、モデルは最も出現回数の多いラベルクラスをより重視して予測するように学習することがあります。この場合、データセット内の回答者の大多数は低い方の所得階層に属します。このため、低い方の所得階層を過度に重視して予測するモデルになる可能性があります。クラスの重みは、各クラスの頻度に反比例した重みを計算して、クラスラベルのバランスを取ります。

SELECT ステートメントは、ステップ 2 で作成したビューに対してクエリを実行します。このビューには、モデルをトレーニングするための特徴データの列のみが含まれます。WHERE 句は input_view の行をフィルタして、トレーニング データフレームに属する行のみがトレーニング データに含まれるようにします。

CREATE MODEL クエリを実行する

ロジスティック回帰モデルを作成するクエリを実行するには、次の手順を行います。

  1. Google Cloud コンソールで、[クエリを新規作成] ボタンをクリックします。

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

CREATE OR REPLACE MODEL
  `census.census_model`
OPTIONS
  ( model_type='LOGISTIC_REG',
    auto_class_weights=TRUE,
    data_split_method='NO_SPLIT',
    input_label_cols=['income_bracket'],
    max_iterations=15) AS
SELECT
  * EXCEPT(dataframe)
FROM
  `census.input_view`
WHERE
  dataframe = 'training'
  1. [実行] をクリックします。

  2. ナビゲーション パネルの [リソース] セクションで、[PROJECT_ID] > [census] を展開し、[census_model] をクリックします。

  3. [スキーマ] タブをクリックします。モデルスキーマには、BigQuery ML がロジスティック回帰の実行に使用した属性がリストされます。スキーマは次のように表示されます。

    クラスタ スキーマ情報

ステップ 5: ML.EVALUATE 関数を使用してモデルを評価する。

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

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

SELECT
  *
FROM
  ML.EVALUATE (MODEL `census.census_model`,
    (
    SELECT
      *
    FROM
      `census.input_view`
    WHERE
      dataframe = 'evaluation'
    )
  )

クエリの詳細

ML.EVALUATE 関数は、ステップ 4 でトレーニングされたモデルと、SELECT サブクエリによって返された評価データを取得します。この関数は、モデルに関する統計を単一行で返します。このクエリは、input_view のデータを評価データとして使用します。WHERE 句で、サブクエリに evaluation データフレームの行のみが含まれるように入力データをフィルタします。

ML.EVALUATE クエリを実行する

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

  1. Google Cloud コンソールで、[クエリを新規作成] ボタンをクリックします。

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

    SELECT
      *
    FROM
      ML.EVALUATE (MODEL `census.census_model`,
        (
        SELECT
          *
        FROM
          `census.input_view`
        WHERE
          dataframe = 'evaluation'
        )
      )
    
  3. (省略可)処理を行うロケーションを設定するには、[展開] > [クエリ設定] をクリックします。[処理を行うロケーション] には US を選択します。処理を行うロケーションはデータセットのロケーションに基づいて自動的に検出されるため、この手順は省略できます。

    クエリの設定

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

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

    ML.EVALUATE の出力

    ロジスティック回帰を使用しているため、結果には次の列が含まれます。

    • precision
    • recall
    • accuracy
    • f1_score
    • log_loss
    • roc_auc

また、入力データを指定せずに ML.EVALUATE を呼び出すこともできます。ML.EVALUATE はトレーニング中に計算された評価指標を取得します。これは、自動的に予約された評価データセットを使用します。CREATE MODEL クエリで data_split_method トレーニング オプションに NO_SPLIT を指定すると、入力データセット全体がトレーニングと評価の両方に使用されます。入力データなしで ML.EVALUATE を呼び出すと、トレーニング データセットの評価指標が取得されます。この評価は、モデルのトレーニング データとは別に保持されたデータセットで実行した評価よりも効率的ではありません。

Google Cloud コンソールを使用して、トレーニング中に計算された評価指標を表示することもできます。結果は次のようになります。

ML.EVALUATE の出力

ステップ 6: ML.PREDICT 関数を使用して所得階層を予測する

特定の回答者が属する所得階層を特定するには、ML.PREDICT 関数を使用します。次のクエリは、prediction データフレーム内のすべての回答者の所得階層を予測します。

SELECT
  *
FROM
  ML.PREDICT (MODEL `census.census_model`,
    (
    SELECT
      *
    FROM
      `census.input_view`
    WHERE
      dataframe = 'prediction'
     )
  )

クエリの詳細

ML.PREDICT 関数は、モデルと、「prediction」データフレームの行のみを含めるようにフィルタされた input_view のデータを使用して、結果を予測します。先頭の SELECT ステートメントで、ML.PREDICT 関数の出力を取得します。

ML.PREDICT クエリを実行する

ML.PREDICT クエリを実行するには、次の手順を行います。

  1. Google Cloud コンソールで、[クエリを新規作成] ボタンをクリックします。

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

SELECT
  *
FROM
  ML.PREDICT (MODEL `census.census_model`,
    (
    SELECT
      *
    FROM
      `census.input_view`
    WHERE
      dataframe = 'prediction'
     )
  )
  1. [実行] をクリックします。

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

    ML.PREDICT の結果

    predicted_income_bracketincome_bracket の予測値です。

ステップ 7: Explainable AI メソッドを使用して予測結果を説明する

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

ML.EXPLAIN_PREDICTML.PREDICT の拡張バージョンです。ML.EXPLAIN_PREDICT は、予測結果だけでなく、予測結果の説明に使用する追加の列も出力します。このため、実際には ML.PREDICT の実行をスキップして ML.EXPLAIN_PREDICT を実行するだけで済みます。BigQuery ML の Shapley 値と Explainable AI サービスの詳細については、BigQuery ML Explainable AI の概要をご覧ください。

説明の生成に使用するクエリは次のとおりです。

#standardSQL
SELECT
  *
FROM
  ML.EXPLAIN_PREDICT(MODEL `census.census_model`,
    (
    SELECT
      *
    FROM
      `census.input_view`
    WHERE
      dataframe = 'evaluation'),
    STRUCT(3 as top_k_features))

ML.EXPLAIN_PREDICT クエリを実行する

モデルを説明する ML.EXPLAIN_PREDICT クエリを実行するには:

  1. Google Cloud コンソールで、[クエリを新規作成] ボタンをクリックします。

  2. クエリエディタに次の GoogleSQL クエリを入力します。

    #standardSQL
    SELECT
    *
    FROM
    ML.EXPLAIN_PREDICT(MODEL `census.census_model`,
      (
      SELECT
        *
      FROM
        `census.input_view`
      WHERE
        dataframe = 'evaluation'),
      STRUCT(3 as top_k_features))
    
  3. [実行] をクリックします。

  4. クエリが完了したら、クエリエディタの下にある [結果] タブをクリックします。結果は次のようになります。

    ML.EXPLAIN_PREDICT の出力

ロジスティック回帰モデルでは、Shapley 値を使用して、モデル内の各特徴の特徴アトリビューション値を生成します。クエリで top_k_features が 3 に設定されているため、ML.EXPLAIN_PREDICT は指定されたテーブルの行ごとに上位 3 つの特徴アトリビューションを出力します。これらのアトリビューションは、アトリビューションの絶対値の降順で並べ替えられます。この例の 1 行目では、特徴 hours_per_week が予測全体に最も大きく影響していますが、この例の 2 行目では、occupation が予測全体に最も大きく影響しています。ML.EXPLAIN_PREDICT クエリの出力列の詳細については、ML.EXPLAIN_PREDICT 構文のドキュメントをご覧ください。

ステップ 8(省略可): モデルをグローバルに説明する

所得階層を判断するうえで最も重要な特徴を特定するには、ML.GLOBAL_EXPLAIN 関数を使用します。ML.GLOBAL_EXPLAIN を使用するには、オプション ENABLE_GLOBAL_EXPLAIN=TRUE を指定してモデルを再トレーニングする必要があります。次のクエリを使用して、このオプションを指定してトレーニング クエリを再実行します。

CREATE OR REPLACE MODEL
  census.census_model
OPTIONS
  ( model_type='LOGISTIC_REG',
    auto_class_weights=TRUE,
    enable_global_explain=TRUE,
    input_label_cols=['income_bracket']
  ) AS
SELECT
  * EXCEPT(dataframe)
FROM
  census.input_view
WHERE
  dataframe = 'training'
  

ML.GLOBAL_EXPLAIN によってグローバルな説明にアクセスする

グローバルな説明の生成に使用するクエリは次のとおりです。

#standardSQL
SELECT
  *
FROM
  ML.GLOBAL_EXPLAIN(MODEL `census.census_model`)

ML.GLOBAL_EXPLAIN クエリを実行する

ML.GLOBAL_EXPLAIN クエリを実行するには:

  1. Google Cloud コンソールで、[クエリを新規作成] ボタンをクリックします。

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

#standardSQL
SELECT
  *
FROM
  ML.GLOBAL_EXPLAIN(MODEL `census.census_model`)
  1. (省略可)処理を行うロケーションを設定するには、[展開] > [クエリ設定] をクリックします。[処理を行うロケーション] には US を選択します。処理を行うロケーションはデータセットのロケーションに基づいて自動的に検出されるため、この手順は省略できます。

    クエリの設定

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

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

    ML.GLOBAL_EXPLAIN の出力

クリーンアップ

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

データセットを削除する

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

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

    [BigQuery] ページに移動

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

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

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

プロジェクトを削除する

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

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

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

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

次のステップ