このチュートリアルでは、データ アナリストの方を対象に BigQuery ML を紹介します。BigQuery ML を使用すると、BigQuery で SQL クエリを使用して機械学習モデルを作成して実行できます。このチュートリアルでは、TRANSFORM
句を使用した特徴量エンジニアリングを紹介します。TRANSFORM
句を使用して、モデル作成時にすべての前処理を指定できます。前処理は、機械学習の予測と評価の段階で自動的に適用されます。
このチュートリアルでは、natality
サンプル テーブルを使用して、新生児の性別、妊娠期間、および母親に関するバケット化された人口統計情報に基づいて、出生時体重を予測するモデルを作成します。natality
サンプル テーブルには、米国での新生児に関する 40 年以上の情報が格納されています。
目標
このチュートリアルでは、次のものを使用します。
- BigQuery ML。
CREATE MODEL
ステートメントとTRANSFORM
句を使用して線形回帰モデルを作成します。 ML.FEATURE_CROSS
とML.QUANTILE_BUCKETIZE
前処理関数。ML.EVALUATE
関数。ML モデルを評価します。ML.PREDICT
関数。ML モデルを使用して予測を行います。
料金
このチュートリアルでは、Google Cloud の課金対象となる以下のコンポーネントを使用します。
- BigQuery
- BigQuery ML
BigQuery の費用の詳細については、BigQuery の料金ページをご覧ください。
始める前に
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
- 新しいプロジェクトでは、BigQuery が自動的に有効になります。既存のプロジェクトで BigQuery を有効にするには、
Enable the BigQuery API.
に移動します。
ステップ 1: データセットを作成する
ML モデルを保存する BigQuery データセットを作成します。
Google Cloud コンソールで [BigQuery] ページに移動します。
[エクスプローラ] ペインで、プロジェクト名をクリックします。
「アクションを表示」> [データセットを作成] をクリックします。
[データセットを作成する] ページで、次の操作を行います。
[データセット ID] に「
bqml_tutorial
」と入力します。[ロケーション タイプ] で [マルチリージョン] を選択してから、[US (米国の複数のリージョン)] を選択します。
一般公開データセットは
US
マルチリージョンに保存されています。わかりやすくするため、データセットを同じロケーションに保存します。残りのデフォルトの設定は変更せず、[データセットを作成] をクリックします。
ステップ 2: モデルを作成する
次に、BigQuery の natality サンプル テーブルを使用して線形回帰モデルを作成します。子供の出生時体重の予測に使用するモデルを作成するために、次の GoogleSQL クエリを使用します。
#standardSQL CREATE MODEL `bqml_tutorial.natality_model` TRANSFORM(weight_pounds, is_male, gestation_weeks, ML.QUANTILE_BUCKETIZE(mother_age, 5) OVER() AS bucketized_mother_age, CAST(mother_race AS string) AS mother_race, ML.FEATURE_CROSS(STRUCT(is_male, CAST(mother_race AS STRING) AS mother_race)) is_male_mother_race) OPTIONS (model_type='linear_reg', input_label_cols=['weight_pounds']) AS SELECT * 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
列は入力ラベルの列です。線形回帰モデルの場合、ラベル列は実数にする必要があります(列の値は実数でなければなりません)。
このクエリの TRANSFORM
句は、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 型にキャストします。人種は、(順序とスケールを持つ)整数として扱うよりも、カテゴリとして扱ったほうが良い場合が多いため、この処理は重要になります。
TRANSFORM
句により、元の機能は前処理されてトレーニングに使用されます。生成される列は次のとおりです。
weight_pounds
: 変更なしでそのまま渡されます。is_male
: そのまま渡され、トレーニングに使用されます。gestation_weeks
: そのまま渡され、トレーニングに使用されます。bucketized_mother_age
:ML.QUANTILE_BUCKETIZE()
分析関数を使用して、変位値に基づいてmother_age
をバケット化することにより、mother_age
から生成されます。mother_race
: 元のmother_race
の文字列の形式です。is_male_mother_race
:ML.FEATURE_CROSS
関数を使用して、is_male
とmother_race
の交差から生成されます。
クエリの SELECT
ステートメントは、TRANSFORM
句で使用できる列を提供します。ただし、TRANSFORM
句の列のすべてを使用する必要はありません。その結果、TRANSFORM
句内で機能の選択と前処理の両方を行うことができます。
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
クエリを実行するには:
Google Cloud コンソールで、[クエリを新規作成] ボタンをクリックします。
[クエリエディタ] のテキスト領域に、次の GoogleSQL クエリを入力します。
#standardSQL CREATE MODEL `bqml_tutorial.natality_model` TRANSFORM(weight_pounds, is_male, gestation_weeks, ML.QUANTILE_BUCKETIZE(mother_age, 5) OVER() AS bucketized_mother_age, CAST(mother_race AS string) AS mother_race, ML.FEATURE_CROSS(STRUCT(is_male, CAST(mother_race AS STRING) AS mother_race)) is_male_mother_race) OPTIONS (model_type='linear_reg', input_label_cols=['weight_pounds']) AS SELECT * FROM `bigquery-public-data.samples.natality` WHERE weight_pounds IS NOT NULL AND RAND() < 0.001
[実行] をクリックします。
クエリが完了するまでに約 30 秒かかります。完了後、モデル(
natality_model
)がナビゲーション パネルに表示されます。クエリはCREATE MODEL
ステートメントを使用してテーブルを作成するため、クエリの結果は表示されません。
ステップ 3(省略可): トレーニングの統計情報を取得する
モデルのトレーニング結果を確認するには、ML.TRAINING_INFO
関数を使用するか、Google Cloud コンソールで統計情報を表示します。このチュートリアルでは、Google Cloud コンソールを使用します。
機械学習アルゴリズムは、多くのサンプルを検査し、損失を最小限に抑えるモデルを見つけることでモデルを構築します。このプロセスを「経験損失最小化」と呼びます。
損失とは、精度の低い予測に対するペナルティです。これは、1 つのサンプルで予測の精度がどのくらい低いかで表します。モデルの予測が完璧であれば、損失はゼロになります。それ以外の場合、精度に応じて損失が大きくなります。モデルをトレーニングする目的は、すべてのサンプルで平均的に損失の少ない重みとバイアスの組み合わせを見つけることです。
CREATE MODEL
クエリで生成したモデルのトレーニング統計を確認するには:
Google Cloud コンソールのナビゲーション パネルの [リソース] セクションで、[project-name] > [bqml_tutorial] と開き、[natality_model] をクリックします。
[トレーニング] タブをクリックし、[表示形式] で [テーブル] オプションを選択します。結果は次のようになります。
+-----------+--------------------+----------------------+--------------------+ | Iteration | Training data loss | Evaluation data loss | Duration (seconds) | +-----------+--------------------+----------------------+--------------------+ | 0 | 1.6640 | 1.7352 | 6.27 | +-----------+--------------------+----------------------+--------------------+
[トレーニング データの損失] 列は、トレーニング データセットでモデルのトレーニングを行った後に計算された損失指標を表します。線形回帰を行ったので、この列は平均二乗誤差になります。
[評価データの損失] 列は、ホールドアウト データセット(モデルを検証するためにトレーニングから返され、保存されているデータ)で計算された損失指標と同じになります。トレーニングで使用されるデフォルトの最適化戦略は「normal_equation」なので、最終モデルに変換するために必要なイテレーションは 1 回だけです。
optimize_strategy
オプションの詳細についてはCREATE MODEL
ステートメントをご覧ください。ML.TRAINING_INFO
関数と「optimize_strategy」トレーニング オプションの詳細については、BigQuery ML 構文リファレンスをご覧ください。
ステップ 4: モデルを評価する
モデルを作成したら、ML.EVALUATE
関数を使用して識別子の性能を評価します。ML.EVALUATE
関数は、実際のデータに対する予測値を評価します。
モデルの評価に使用するクエリは次のとおりです。
#standardSQL SELECT * FROM ML.EVALUATE(MODEL `bqml_tutorial.natality_model`, ( SELECT * FROM `bigquery-public-data.samples.natality` WHERE weight_pounds IS NOT NULL))
クエリの詳細
上部の SELECT
ステートメントで、モデルから列を取得します。
FROM
句で、モデル bqml_tutorial.natality_model
に対して ML.EVALUATE
関数を使用します。
このクエリでネストしている SELECT
ステートメントと FROM
句は CREATE MODEL
クエリと同じです。トレーニングでは TRANSFORM
句が使用されるため、特定の列と変換を指定する必要はありません。自動的に復元されます。
WHERE
句(WHERE weight_pounds IS NOT NULL
)は、重みが NULL の行を除外します。
#standardSQL SELECT * FROM ML.EVALUATE(MODEL `bqml_tutorial.natality_model`)
ML.EVALUATE
クエリを実行する
モデルを評価する ML.EVALUATE
クエリを実行するには、次の操作を行います。
Google Cloud コンソールで、[クエリを新規作成] ボタンをクリックします。
[クエリエディタ] のテキスト領域に、次の GoogleSQL クエリを入力します。
#standardSQL SELECT * FROM ML.EVALUATE(MODEL `bqml_tutorial.natality_model`, ( SELECT * FROM `bigquery-public-data.samples.natality` WHERE weight_pounds IS NOT NULL))
(省略可)処理のロケーションを設定するには、settings_applications [その他] プルダウン リストで [クエリの設定] をクリックします。[処理を行うロケーション] で [米国(US)] を選択します。処理を行うロケーションはデータセットのロケーションに基づいて自動的に検出されるため、この手順は省略できます。
[実行] をクリックします。
クエリが完了したら、クエリテキスト領域の下にある [結果] タブをクリックします。結果は次のようになります。
+---------------------+--------------------+------------------------+---------------------+---------------------+----------------------+ | mean_absolute_error | mean_squared_error | mean_squared_log_error | mean_absolute_error | r2_score | explained_variance | +---------------------+--------------------+------------------------+---------------------+---------------------+----------------------+ | 0.9566580179970666 | 1.6756289722442677 | 0.034241471462096516 | 0.7385590721661188 | 0.04650972930257946 | 0.046516832131241026 | +---------------------+--------------------+------------------------+---------------------+---------------------+----------------------+
線形回帰を使用しているため、結果には次の列が含まれます。
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 * FROM `bigquery-public-data.samples.natality` WHERE state = "WY"))
クエリの詳細
先頭の SELECT
ステートメントで、predicted_weight_pounds
列を取得します。この列は、ML.PREDICT
関数によって生成されます。ML.PREDICT
関数を使用した場合は、モデルの出力列名は predicted_label_column_name
です。線形回帰モデルの場合、predicted_label
は label
の推定値になります。ロジスティック回帰モデルの場合、predicted_label
は予測可能性が高いラベルに応じて、2 つの入力値のいずれかになります。
ML.PREDICT
関数は、モデル bqml_tutorial.natality_model
を使用して結果を予測するために使われます。
このクエリでネストしている SELECT
ステートメントと FROM
句は CREATE MODEL
クエリと同じです。トレーニングでは必ずしもすべての列を渡す必要はなく、TRANSFORM
句で使用される列のみが必須ですので注意してください。ML.EVALUATE
と同じように、TRANSFORM
内部の変換は自動的に復元されます。
WHERE
句(WHERE state = "WY"
)は、予測をワイオミング州に限定していることを示します。
ML.PREDICT
クエリを実行する
モデルを使用して結果を予測するクエリを実行するには:
Google Cloud コンソールで、[クエリを新規作成] ボタンをクリックします。
[クエリエディタ] のテキスト領域に、次の GoogleSQL クエリを入力します。
#standardSQL SELECT predicted_weight_pounds FROM ML.PREDICT(MODEL `bqml_tutorial.natality_model`, ( SELECT * FROM `bigquery-public-data.samples.natality` WHERE state = "WY"))
(省略可)処理のロケーションを設定するには、settings_applications [その他] プルダウン リストで [クエリの設定] をクリックします。[処理を行うロケーション] で [米国(US)] を選択します。処理を行うロケーションはデータセットのロケーションに基づいて自動的に検出されるため、この手順は省略できます。
[実行] をクリックします。
クエリが完了したら、クエリテキスト領域の下にある [結果] タブをクリックします。結果は次のようになります。
+----------------------------+ | predicted_weight_pounds | +----------------------------+ | 7.735962399307027 | +----------------------------+ | 7.728855793480761 | +----------------------------+ | 7.383850250400428 | +----------------------------+ | 7.4132677633242565 | +----------------------------+ | 7.734971309702814 | +----------------------------+
クリーンアップ
このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。
- 作成したプロジェクトを削除する。
- または、プロジェクトを保存して、データセットを削除する。
データセットを削除する
プロジェクトを削除すると、プロジェクト内のデータセットとテーブルがすべて削除されます。プロジェクトを再利用する場合は、このチュートリアルで作成したデータセットを削除できます。
必要に応じて、Google Cloud コンソールで [BigQuery] ページを開きます。
ナビゲーション パネルで、作成した bqml_tutorial データセットをクリックします。
ウィンドウの右側の [データセットを削除] をクリックします。この操作を行うと、データセット、テーブル、すべてのデータが削除されます。
[データセットの削除] ダイアログ ボックスでデータセットの名前(
bqml_tutorial
)を入力して、[削除] をクリックします。
プロジェクトを削除する
プロジェクトを削除するには:
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
次のステップ
- 機械学習集中講座で機械学習について学習する。
- BigQuery ML の概要で BigQuery ML の概要を確認する。
- Google Cloud コンソールの使用で、Google Cloud コンソールの詳細を確認する。