BigQuery ML は、ロジスティック回帰モデルタイプでの教師あり学習をサポートしています。2 つのカテゴリのどちらに値が分類されるかを予測するには 2 項ロジスティック回帰モデルタイプを使用し、複数のカテゴリのうちのどれに値が分類されるかを予測するには多項回帰モデルタイプを使用します。これらはデータを 2 つ以上のカテゴリに分類するため、分類問題と呼ばれます。
このチュートリアルでは、BigQuery ML の 2 項ロジスティック回帰モデルを使用して、米国国勢調査データセットの回答者の所得階層を予測します。このデータセットには、2000 年と 2010 年の米国居住者のユーザー属性と所得情報が含まれています。このデータには、就業状況、職種、教育レベル、所得の情報が含まれています。
目標
このチュートリアルでは、次のタスクを行います。- ロジスティック回帰モデルを作成する。
- ロジスティック回帰モデルを評価する。
- ロジスティック回帰モデルを使用して予測を行う。
費用
このチュートリアルでは、Google Cloud の課金対象となる次のコンポーネントを使用します。
- BigQuery
- BigQuery ML
BigQuery の費用の詳細については、BigQuery の料金ページをご覧ください。
BigQuery ML の費用の詳細については、BigQuery ML の料金をご覧ください。
始める前に
- Google Cloud アカウントにログインします。Google Cloud を初めて使用する場合は、アカウントを作成して、実際のシナリオでの Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
-
Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。
-
Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。
- 新しいプロジェクトでは、BigQuery が自動的に有効になります。既存のプロジェクトで BigQuery を有効にするには、
BigQuery 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
関数でモデルの性能に関する統計を取得します。
- ステップ 5:
- ステップ 6:
ML.PREDICT
関数を使用して回答者の所得を予測する。 - 最後に、
ML.PREDICT
関数を使用して、特定の国勢調査回答者の所得階層を予測します。
- ステップ 6:
ステップ 1: データセットを作成する
ML モデルを保存する BigQuery データセットを作成します。
Google Cloud コンソールで [BigQuery] ページに移動します。
[エクスプローラ] ペインで、プロジェクト名をクリックします。
[アクションを表示] > [データセットを作成] をクリックします。
[データセットの作成] ページで、次の操作を行います。
[データセット 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;
クエリを実行する
データセットから行を返すクエリを実行するには:
Google Cloud コンソールで、[クエリを新規作成] ボタンをクリックします。
クエリエディタのテキスト領域に、次の 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;
[実行] をクリックします。
クエリが完了したら、クエリテキスト領域の下にある [結果] タブをクリックします。結果は次のようになります。
クエリ結果から、
census_adult_income
テーブルのincome_bracket
列には<=50K
または>50K
の 2 つの値のどちらかしかないことがわかります。また、census_adult_income
テーブルの列education
とeducation_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
テーブルの列 education
と education_num
は同じデータを異なる形式で表しているため、このクエリでは education
列を除外しています。dataframe
列では、除外された functional_weight
列を使用して、データソースの 80% にトレーニング用としてラベルを付け、残りのデータを評価用と予測用として予約しています。クエリでこれらの列を含むビューを作成し、後でそれを使用してトレーニングと予測を行えるようにします。
クエリを実行する
モデル用のトレーニング データをまとめるクエリを実行するには:
Google Cloud コンソールで、[クエリを新規作成] ボタンをクリックします。
クエリエディタのテキスト領域に、次の 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`
[実行] をクリックします。
ナビゲーション パネルの [リソース] セクションで、プロジェクト名をクリックします。ビューがその下に表示されます。
ビューをクリックします。ビューのスキーマが、クエリエディタの下の [スキーマ] タブに表示されます。
ステップ 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
クエリを実行する
ロジスティック回帰モデルを作成するクエリを実行するには、次の手順を行います。
Google Cloud コンソールで、[クエリを新規作成] ボタンをクリックします。
クエリエディタのテキスト領域に、次の 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'
[実行] をクリックします。
ナビゲーション パネルの [リソース] セクションで、[PROJECT_ID] > [census] を展開し、[census_model] をクリックします。
[スキーマ] タブをクリックします。モデルスキーマには、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
クエリを実行するには、次の手順を行います。
Google Cloud コンソールで、[クエリを新規作成] ボタンをクリックします。
クエリエディタのテキスト領域に、次の GoogleSQL クエリを入力します。
SELECT * FROM ML.EVALUATE (MODEL `census.census_model`, ( SELECT * FROM `census.input_view` WHERE dataframe = 'evaluation' ) )
(省略可)処理を行うロケーションを設定するには、[展開] > [クエリ設定] をクリックします。[処理を行うロケーション] には
US
を選択します。処理を行うロケーションはデータセットのロケーションに基づいて自動的に検出されるため、この手順は省略できます。[実行] をクリックします。
クエリが完了したら、クエリテキスト領域の下にある [結果] タブをクリックします。結果は次のようになります。
ロジスティック回帰を使用しているため、結果には次の列が含まれます。
precision
recall
accuracy
f1_score
log_loss
roc_auc
また、入力データを指定せずに ML.EVALUATE
を呼び出すこともできます。ML.EVALUATE
はトレーニング中に計算された評価指標を取得します。これは、自動的に予約された評価データセットを使用します。CREATE MODEL
クエリで data_split_method
トレーニング オプションに NO_SPLIT
を指定すると、入力データセット全体がトレーニングと評価の両方に使用されます。入力データなしで ML.EVALUATE
を呼び出すと、トレーニング データセットの評価指標が取得されます。この評価は、モデルのトレーニング データとは別に保持されたデータセットで実行した評価よりも効率的ではありません。
Google Cloud コンソールを使用して、トレーニング中に計算された評価指標を表示することもできます。結果は次のようになります。
ステップ 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
クエリを実行するには、次の手順を行います。
Google Cloud コンソールで、[クエリを新規作成] ボタンをクリックします。
[クエリエディタ] のテキスト領域に、次の GoogleSQL クエリを入力します。
SELECT * FROM ML.PREDICT (MODEL `census.census_model`, ( SELECT * FROM `census.input_view` WHERE dataframe = 'prediction' ) )
[実行] をクリックします。
クエリが完了したら、クエリテキスト領域の下にある [結果] タブをクリックします。結果は次のようになります。
predicted_income_bracket
はincome_bracket
の予測値です。
ステップ 7: Explainable AI メソッドを使用して予測結果を説明する
モデルがこれらの予測結果を生成する理由を理解するには、ML.EXPLAIN_PREDICT
関数を使用します。
ML.EXPLAIN_PREDICT
は ML.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
クエリを実行するには:
Google Cloud コンソールで、[クエリを新規作成] ボタンをクリックします。
クエリエディタに次の 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))
[実行] をクリックします。
クエリが完了したら、クエリエディタの下にある [結果] タブをクリックします。結果は次のようになります。
ロジスティック回帰モデルでは、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 MODELcensus.census_model
OPTIONS ( model_type='LOGISTIC_REG', auto_class_weights=TRUE, enable_global_explain=TRUE, input_label_cols=['income_bracket'] ) AS SELECT * EXCEPT(dataframe) FROMcensus.input_view
WHERE dataframe = 'training'
ML.GLOBAL_EXPLAIN
によってグローバルな説明にアクセスする
グローバルな説明の生成に使用するクエリは次のとおりです。
#standardSQL SELECT * FROM ML.GLOBAL_EXPLAIN(MODEL `census.census_model`)
ML.GLOBAL_EXPLAIN
クエリを実行する
ML.GLOBAL_EXPLAIN
クエリを実行するには:
Google Cloud コンソールで、[クエリを新規作成] ボタンをクリックします。
クエリエディタのテキスト領域に、次の GoogleSQL クエリを入力します。
#standardSQL SELECT * FROM ML.GLOBAL_EXPLAIN(MODEL `census.census_model`)
(省略可)処理を行うロケーションを設定するには、[展開] > [クエリ設定] をクリックします。[処理を行うロケーション] には
US
を選択します。処理を行うロケーションはデータセットのロケーションに基づいて自動的に検出されるため、この手順は省略できます。[実行] をクリックします。
クエリが完了したら、クエリテキスト領域の下にある [結果] タブをクリックします。結果は次のようになります。
クリーンアップ
このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。
データセットを削除する
プロジェクトを削除すると、プロジェクト内のデータセットとテーブルがすべて削除されます。プロジェクトを再利用する場合は、このチュートリアルで作成したデータセットを削除できます。
必要に応じて、Google Cloud コンソールで [BigQuery] ページを開きます。
ナビゲーションで、作成した census データセットをクリックします。
ウィンドウの右側にある [データセットを削除] をクリックします。この操作を行うと、データセットとモデルが削除されます。
[データセットの削除] ダイアログ ボックスでデータセットの名前(
census
)を入力して、[削除] をクリックします。
プロジェクトを削除する
プロジェクトを削除するには:
- Google Cloud コンソールで、[リソースの管理] ページに移動します。
- プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
- ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。
次のステップ
- BigQuery ML の概要で BigQuery ML の概要を確認する。
CREATE MODEL
構文ページでモデルの作成方法を確認する。