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


このチュートリアルでは、BigQuery ML のバイナリ ロジスティック回帰モデルを使用して、ユーザー属性データに基づいて個人の収入の範囲を予測します。バイナリ ロジスティック回帰モデルは、値が 2 つのカテゴリのいずれかに該当するかどうか(この場合は、個人の年収が $50,000 を上回っているか下回っているか)を予測します。

このチュートリアルでは、bigquery-public-data.ml_datasets.census_adult_income データセットを使用します。このデータセットには、2000 年と 2010 年の米国居住者のユーザー属性と所得情報が含まれています。

目標

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

  • ロジスティック回帰モデルを作成する。
  • モデルを評価する。
  • モデルを使用して予測を行う。
  • モデルによって生成される結果を説明する。

費用

このチュートリアルでは、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 の一般的な問題は、ラベルと呼ばれる 2 つのタイプのいずれかにデータを分類することです。たとえば、小売業者は特定の顧客が新しい製品を購入するかどうかを、その顧客に関するその他の情報に基づいて予測したい場合があります。この場合、2 つのラベルは will buywon't buy になります。販売店は、1 つの列が両方のラベルを表し、顧客のロケーション、以前の購入、報告された好みなどの顧客情報を含むデータセットを構築できます。販売店は、この顧客情報を使用するバイナリ ロジスティック回帰モデルを使用して、各顧客を最もよく表すラベルを予測できます。

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

データセットを作成する

モデルを格納する BigQuery データセットを作成します。

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

    [BigQuery] に移動

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

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

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

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

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

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

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

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

データを検討する

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

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

    [BigQuery] に移動

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

    SELECT
      age,
      workclass,
      marital_status,
      education_num,
      occupation,
      hours_per_week,
      income_bracket,
      functional_weight
    FROM
      `bigquery-public-data.ml_datasets.census_adult_income`
    LIMIT
      100;
    
  3. 結果は次のようになります。

    国勢調査データ

クエリ結果から、census_adult_income テーブルの income_bracket 列には <=50K または >50K の 2 つの値のどちらかしかないことがわかります。functional_weight 列は、国勢調査機関が特定の行に対応すると考えている人数です。この列の値は、特定の行の income_bracket の値とは無関係に見えます。

サンプルデータを準備する

このチュートリアルでは、次の属性に基づいて国勢調査回答者の所得を予測します。

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

これを行うには、モデルのトレーニングと評価、および予測に使用するデータを含むビューを作成します。このビューは、このチュートリアルの後半の CREATE MODEL ステートメントで使用されます。

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

サンプルデータを準備するクエリを実行します。

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

    [BigQuery] に移動

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

    CREATE OR REPLACE VIEW
      `census.input_data` 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. [エクスプローラ] ペインで census データセットを開き、input_data ビューを見つけます。

  4. ビュー名をクリックして情報ペインを開きます。ビュースキーマが [スキーマ] タブに表示されます。

    クエリ結果

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

ロジスティック回帰モデルを作成するには、CREATE MODEL ステートメントを使用し、モデルタイプに LOGISTIC_REG を指定します。モデルの作成には、前のセクションでラベル付けしたトレーニング データでモデルをトレーニングすることが含まれます。

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

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

  • ロジスティック回帰モデルがバイナリかマルチクラスかを指定する必要はありません。BigQuery は、ラベル列の一意の値の数に基づいて、トレーニングするモデルのタイプを決定できます。

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

  • SELECT ステートメントは、トレーニング データを含む input_data ビューをクエリします。WHERE 句は input_data の行をフィルタリングし、トレーニング データとしてラベル付けされた行のみがモデルのトレーニングに使用されるようにします。

ロジスティック回帰モデルを作成するクエリを実行します。

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

    [BigQuery] に移動

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

    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_data`
    WHERE
      dataframe = 'training'
    
  3. [エクスプローラ] ペインで、census データセットを開き、[モデル] フォルダを開きます。

  4. census_model モデルをクリックして、情報ペインを開きます。

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

    クラスタ スキーマ情報

ML.EVALUATE 関数を使用してモデルを評価する

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

入力では、ML.EVALUATE 関数はトレーニング済みモデルと、dataframe 列の値が evaluation である input_data ビューの行を取得します。この関数は、モデルに関する統計を単一行で返します。

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

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

    [BigQuery] に移動

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

    SELECT
      *
    FROM
      ML.EVALUATE (MODEL `census.census_model`,
        (
        SELECT
          *
        FROM
          `census.input_data`
        WHERE
          dataframe = 'evaluation'
        )
      )
    
  3. 結果は次のようになります。

    ML.EVALUATE の出力

Google Cloud コンソールのモデルの情報ペインで、トレーニング中に計算された評価指標を確認することもできます。

ML.EVALUATE の出力

ML.PREDICT 関数を使用して所得階層を予測する

特定の回答者が属する所得階層を特定するには、ML.PREDICT 関数を使用します。

入力では、ML.PREDICT 関数はトレーニング済みモデルと、dataframe 列の値が prediction である input_data ビューの行を取得します。

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

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

    [BigQuery] に移動

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

    SELECT
      *
    FROM
      ML.PREDICT (MODEL `census.census_model`,
        (
        SELECT
          *
        FROM
          `census.input_data`
        WHERE
          dataframe = 'prediction'
        )
      )
    
  3. 結果は次のようになります。

    ML.PREDICT の結果

    predicted_income_bracketincome_bracket の予測値です。

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

モデルがこれらの予測結果を生成する理由を理解するには、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 `census.census_model`,
      (
      SELECT
        *
      FROM
        `census.input_data`
      WHERE
        dataframe = 'evaluation'),
      STRUCT(3 as top_k_features))
    
  3. 結果は次のようになります。

    ML.EXPLAIN_PREDICT の出力

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

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

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

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

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

    [BigQuery] に移動

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

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

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

    ML.GLOBAL_EXPLAIN の出力

クリーンアップ

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

データセットを削除する

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

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

    [BigQuery] ページに移動

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

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

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

プロジェクトを削除する

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

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

次のステップ