BigQuery ML で ML モデルを作成する
このチュートリアルでは、Google Cloud コンソールを使用して BigQuery ML を利用する方法を紹介します。
BigQuery ML を利用すると、BigQuery で SQL クエリと Python コードを使って ML モデルを作成、実行できます。ここでは、SQL のユーザーが簡単に ML を利用できるようにすることを目標としています。使い慣れたツールを使用してモデルを構築でき、データ移動の必要もないため、開発スピードを向上させることができます。
このチュートリアルでは、BigQuery 用の Google アナリティクス サンプル データセットを使用して、ウェブサイト訪問者がトランザクションを行うかどうかを予測するモデルを作成します。アナリティクス データセットのスキーマについては、Google アナリティクス ヘルプセンターで BigQuery Export スキーマをご覧ください。
目標
このチュートリアルでは、次のものを使用します。
- BigQuery ML。
CREATE MODEL
ステートメントを使用して、2 項ロジスティック回帰モデルを作成します。 ML.EVALUATE
関数。ML モデルを評価します。ML.PREDICT
関数。ML モデルを使用して予測を行います。
費用
このチュートリアルでは、Google Cloud の課金対象となる次のコンポーネントを使用します。
- BigQuery
- BigQuery ML
BigQuery の費用の詳細については、BigQuery の料金ページをご覧ください。
BigQuery ML の費用の詳細については、BigQuery ML の料金をご覧ください。
始める前に
- 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.
-
Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。
-
Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。
- 新しいプロジェクトでは、BigQuery が自動的に有効になります。既存のプロジェクトで BigQuery を有効にするには、
BigQuery API を有効にします。
に移動します。
データセットを作成する
ML モデルを保存する BigQuery データセットを作成します。
Google Cloud コンソールで [BigQuery] ページに移動します。
[エクスプローラ] ペインで、プロジェクト名をクリックします。
「アクションを表示」> [データセットを作成] をクリックします。
[データセットの作成] ページで、次の操作を行います。
[データセット ID] に「
bqml_tutorial
」と入力します。[ロケーション タイプ] で [マルチリージョン] を選択してから、[US (米国の複数のリージョン)] を選択します。
一般公開データセットは
US
マルチリージョンに保存されています。わかりやすくするため、データセットを同じロケーションに保存します。残りのデフォルトの設定は変更せず、[データセットを作成] をクリックします。
モデルを作成する
次に、BigQuery 用のアナリティクス サンプル データセットを使用して、ロジスティック回帰モデルを作成します。
SQL
次の GoogleSQL クエリを使用して、ウェブサイト訪問者がトランザクションを行うかどうかを予測するモデルを作成します。
#standardSQL CREATE MODEL `bqml_tutorial.sample_model` OPTIONS(model_type='logistic_reg') AS SELECT IF(totals.transactions IS NULL, 0, 1) AS label, IFNULL(device.operatingSystem, "") AS os, device.isMobile AS is_mobile, IFNULL(geoNetwork.country, "") AS country, IFNULL(totals.pageviews, 0) AS pageviews FROM `bigquery-public-data.google_analytics_sample.ga_sessions_*` WHERE _TABLE_SUFFIX BETWEEN '20160801' AND '20170630'
モデルを作成するだけでなく、CREATE MODEL
ステートメントを含むクエリを実行し、クエリの SELECT
ステートメントから得られたデータでモデルをトレーニングします。
クエリの詳細
CREATE MODEL
句は、bqml_tutorial.sample_model
という名前のモデルを作成し、トレーニングするために使用されます。
OPTIONS(model_type='logistic_reg')
句を指定すると、ロジスティック回帰モデルを作成することを意味します。ロジスティック回帰モデルは、入力データを 2 つのクラスに分割し、データが各クラスに分類される確率を示します。通常、検出対象(たとえば、スパムメール)は 1 で表され、それ以外は 0 で表されます。ロジスティック回帰モデルの出力が 0.9 の場合、入力が検出対象である確率(スパムメールの確率)が 90% であることを意味します。
このクエリの SELECT
ステートメントで次の列を取得します。作成したモデルは、この列を使用して訪問者がトランザクションを完了する確率を予測します。
totals.transactions
- セッション内の電子商取引の合計数。トランザクション数がNULL
の場合、label
列の値は0
に設定されます。それ以外の場合は1
に設定されます。これらの値は結果の確率を表します。CREATE MODEL
ステートメントでinput_label_cols=
オプションを設定する代わりに、label
というエイリアスを作成することもできます。device.operatingSystem
- ユーザーのデバイスのオペレーティング システムです。device.isMobile
- ユーザーのデバイスがモバイル デバイスかどうかを示します。geoNetwork.country
- セッションが発生した国。IP アドレスに基づいて特定されます。totals.pageviews
- セッション内のページビューの合計数です。
FROM
句 - bigquery-public-data.google_analytics_sample.ga_sessions_*
- Google アナリティクスのサンプル データセットにクエリを実行していることを示します。このデータセットは bigquery-public-data
プロジェクト中にあります。ここでは、日付によってシャーディングされた一連のテーブルにクエリを実行します。これを指定するため、テーブル名 google_analytics_sample.ga_sessions_*
にワイルドカードを使用しています。
WHERE
句 - _TABLE_SUFFIX BETWEEN '20160801' AND '20170630'
- クエリによってスキャンされるテーブルの数を制限します。スキャンする日付の範囲は 2016 年 8 月 1 日から 2017 年 6 月 30 日までです。
CREATE MODEL
クエリを実行する
モデルを作成してトレーニングする CREATE MODEL
クエリを実行するには:
- Google Cloud コンソールで、[クエリを新規作成] ボタンをクリックします。このテキストをクリックできない場合、クエリエディタはすでに開いています。
[クエリエディタ] のテキスト領域に、次の GoogleSQL クエリを入力します。
#standardSQL CREATE MODEL `bqml_tutorial.sample_model` OPTIONS(model_type='logistic_reg') AS SELECT IF(totals.transactions IS NULL, 0, 1) AS label, IFNULL(device.operatingSystem, "") AS os, device.isMobile AS is_mobile, IFNULL(geoNetwork.country, "") AS country, IFNULL(totals.pageviews, 0) AS pageviews FROM `bigquery-public-data.google_analytics_sample.ga_sessions_*` WHERE _TABLE_SUFFIX BETWEEN '20160801' AND '20170630'
[実行] をクリックします。
クエリが完了するまでに数分かかります。最初のイテレーションが完了すると、モデル(
sample_model
)がナビゲーション パネルに表示されます。クエリはCREATE MODEL
ステートメントを使用してモデルを作成するため、クエリの結果は表示されません。[モデルの統計情報] タブを表示すると、トレーニング中のモデルを確認できます。最初のイテレーションが完了すると、タブが更新されます。イテレーションが完了するたびに、統計情報が更新されます。
BigQuery DataFrames
このサンプルを試す前に、BigQuery DataFrames を使用した BigQuery クイックスタートの手順に沿って BigQuery DataFrames を設定してください。詳細については、BigQuery DataFrames のリファレンス ドキュメントをご覧ください。
BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。
トレーニングの統計情報を取得する
モデルのトレーニング結果を確認するには、ML.TRAINING_INFO
関数を使用するか、Google Cloud コンソールで統計情報を表示します。このチュートリアルでは、Google Cloud コンソールを使用します。
機械学習では、データを使用して予測を行うモデルを作成します。モデルは、入力データを取得して計算を行い、出力(予測)を生成する関数です。
ML アルゴリズムは、すでに判明している複数のデータ(ユーザーの購入履歴データなど)を取得し、モデルの予測結果が実際の値と一致するように、モデルのさまざまな重み付けを繰り返し調整します。具体的には、モデルで誤った指標の使用(損失)回数を減らしていくことで調整します。
繰り返し調整を行うことで、損失を減らしていきます(ゼロになるのが理想的です)。損失ゼロは、モデルが 100% 正確であることを意味します。
CREATE MODEL
クエリで生成したモデルのトレーニング統計を確認するには:
Google Cloud コンソールのナビゲーション パネルの [リソース] セクションで、[PROJECT_ID] > [bqml_tutorial] と開き、[sample_model] をクリックします。
[モデルの統計情報] タブをクリックします。結果は次のようになります。
[トレーニング データの損失] 列は、トレーニング データセットで所定の回数のイテレーションを行った後に計算された損失指標を表します。ロジスティック回帰モデルのため、この列は対数損失になります。[評価データの損失] 列は、ホールドアウト データセット(モデルを検証するためにトレーニングから返され、保存されているデータ)で計算された損失指標と同じになります。
BigQuery ML は、入力データをトレーニング セットとホールドアウト セットに自動的に分割し、モデルの過学習を防ぎます。この処理は、トレーニング アルゴリズムが既知のデータに合わせすぎて、新しい未確認のサンプルに対応できなくなることを防ぐために行われます。
[トレーニング データの損失] と [評価データの損失] 列の値は平均の損失値で、それぞれのセットのすべてのサンプルの平均値になります。
ML.TRAINING_INFO
関数の詳細については、BigQuery ML 構文リファレンスをご覧ください。
モデルを評価する
モデルを作成したら、ML.EVALUATE
関数を使用して分類子の性能を評価します。ML.EVALUATE
関数は、実際のデータに対する予測値を評価します。ロジスティック回帰固有の指標を計算するには、ML.ROC_CURVE
SQL 関数または bigframes.ml.metrics.roc_curve
BigQuery DataFrames 関数を使用します。
このチュートリアルでは、トランザクションを検出する 2 項分類モデルを使用しています。label
列にクラスの値が示されます。0
は「トランザクションなし」、1
は「トランザクションあり」です。
SQL
モデルの評価に使用するクエリは次のとおりです。
#standardSQL SELECT * FROM ML.EVALUATE(MODEL `bqml_tutorial.sample_model`, ( SELECT IF(totals.transactions IS NULL, 0, 1) AS label, IFNULL(device.operatingSystem, "") AS os, device.isMobile AS is_mobile, IFNULL(geoNetwork.country, "") AS country, IFNULL(totals.pageviews, 0) AS pageviews FROM `bigquery-public-data.google_analytics_sample.ga_sessions_*` WHERE _TABLE_SUFFIX BETWEEN '20170701' AND '20170801'))
クエリの詳細
先頭の SELECT
ステートメントで、モデルから列を取得します。
FROM
句で、モデル bqml_tutorial.sample_model
に対して ML.EVALUATE
関数を使用します。
このクエリでネストしている SELECT
ステートメントと FROM
句は CREATE MODEL
クエリと同じです。
WHERE
句 - _TABLE_SUFFIX BETWEEN '20170701' AND '20170801'
- クエリによってスキャンされるテーブルの数を制限します。スキャンする日付の範囲は 2017 年 7 月 1 日から 2017 年 8 月 1 日までです。このデータは、モデルの予測性能の評価に使用します。これは、トレーニング データの期間の直後の月に収集されています。
ML.EVALUATE
クエリを実行する
モデルを評価する ML.EVALUATE
クエリを実行するには:
Google Cloud コンソールで、[クエリを新規作成] ボタンをクリックします。
[クエリエディタ] のテキスト領域に、次の GoogleSQL クエリを入力します。
#standardSQL SELECT * FROM ML.EVALUATE(MODEL `bqml_tutorial.sample_model`, ( SELECT IF(totals.transactions IS NULL, 0, 1) AS label, IFNULL(device.operatingSystem, "") AS os, device.isMobile AS is_mobile, IFNULL(geoNetwork.country, "") AS country, IFNULL(totals.pageviews, 0) AS pageviews FROM `bigquery-public-data.google_analytics_sample.ga_sessions_*` WHERE _TABLE_SUFFIX BETWEEN '20170701' AND '20170801'))
[実行] をクリックします。
クエリが完了したら、クエリテキスト領域の下にある [結果] タブをクリックします。結果は次のようになります。
+--------------------+---------------------+--------------------+--------------------+---------------------+----------+ | precision | recall | accuracy | f1_score | log_loss | roc_auc | +--------------------+---------------------+--------------------+--------------------+---------------------+----------+ | 0.4451901565995526 | 0.08879964301651048 | 0.9716829479411401 | 0.1480654761904762 | 0.07921781778780206 | 0.970706 | +--------------------+---------------------+--------------------+--------------------+---------------------+----------+
ロジスティック回帰を使用しているため、結果には次の列が含まれます。
precision
- 分類モデルの指標。陽性のクラスの予測でモデルが正しかった確率を表します。recall
- 「全陽性のラベルの中でモデルが正しく識別したラベルの数は?」という質問に回答する分類モデルの指標。accuracy
- 分類モデルの予測のうち、正解の割合。f1_score
- モデルの精度を表す尺度。f1 値は適合率と再現率の調和平均を表します。最も精度の高い f1 値は 1 で、最も精度の悪い値は 0 です。log_loss
- ロジスティック回帰で使用される損失関数。モデルの予測が正しいラベルからどのくらい離れているかを表します。roc_auc
- ROC 曲線の下の面積。これは、無作為に選択した陽性のサンプルが陽性に分類される確率が、無作為に選択した陰性のサンプルが陽性に分類される確率よりも高い可能性を表します。詳細については、ML 集中講座の分類をご覧ください。
BigQuery DataFrames
このサンプルを試す前に、BigQuery DataFrames を使用した BigQuery クイックスタートの手順に沿って BigQuery DataFrames を設定してください。詳細については、BigQuery DataFrames のリファレンス ドキュメントをご覧ください。
BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。
モデルを使用して結果を予測する
モデルの評価を行ったので、モデルを使用して結果を予測します。このモデルを使用して、ウェブサイトの訪問者が行ったトランザクションの数を国別に予測します。
SQL
結果の予測に使用するクエリは次のとおりです。
#standardSQL SELECT country, SUM(predicted_label) as total_predicted_purchases FROM ML.PREDICT(MODEL `bqml_tutorial.sample_model`, ( SELECT IFNULL(device.operatingSystem, "") AS os, device.isMobile AS is_mobile, IFNULL(totals.pageviews, 0) AS pageviews, IFNULL(geoNetwork.country, "") AS country FROM `bigquery-public-data.google_analytics_sample.ga_sessions_*` WHERE _TABLE_SUFFIX BETWEEN '20170701' AND '20170801')) GROUP BY country ORDER BY total_predicted_purchases DESC LIMIT 10
クエリの詳細
先頭の SELECT
ステートメントで、country
列を取得し、predicted_label
列を合計します。この列は、ML.PREDICT
関数によって生成されます。ML.PREDICT
関数を使用した場合は、モデルの出力列名は predicted_<label_column_name>
です。線形回帰モデルの場合、predicted_label
は label
の推定値になります。ロジスティック回帰モデルでは、predicted_label
が最も可能性の高いラベルで、この場合、0
または 1
になります。
ML.PREDICT
関数は、モデル bqml_tutorial.sample_model
を使用して結果を予測するために使われます。
このクエリでネストしている SELECT
ステートメントと FROM
句は CREATE MODEL
クエリと同じです。
WHERE
句 - _TABLE_SUFFIX BETWEEN '20170701' AND '20170801'
- クエリによってスキャンされるテーブルの数を制限します。スキャンする日付の範囲は 2017 年 7 月 1 日から 2017 年 8 月 1 日までです。このデータは予測に使用されます。これは、トレーニング データの期間の直後の月に収集されています。
GROUP BY
と ORDER BY
句は、結果を国別に分類し、予測された購入回数の合計を降順で並べ替えます。
ここでは、LIMIT
句を使用して上位 10 件のみを表示します。
ML.PREDICT
クエリを実行する
モデルを使用して結果を予測するクエリを実行するには:
Google Cloud コンソールで、[クエリを新規作成] ボタンをクリックします。
[クエリエディタ] のテキスト領域に、次の GoogleSQL クエリを入力します。
#standardSQL SELECT country, SUM(predicted_label) as total_predicted_purchases FROM ML.PREDICT(MODEL `bqml_tutorial.sample_model`, ( SELECT IFNULL(device.operatingSystem, "") AS os, device.isMobile AS is_mobile, IFNULL(totals.pageviews, 0) AS pageviews, IFNULL(geoNetwork.country, "") AS country FROM `bigquery-public-data.google_analytics_sample.ga_sessions_*` WHERE _TABLE_SUFFIX BETWEEN '20170701' AND '20170801')) GROUP BY country ORDER BY total_predicted_purchases DESC LIMIT 10
[実行] をクリックします。
クエリが完了したら、クエリテキスト領域の下にある [結果] タブをクリックします。結果は次のようになります。
+----------------+---------------------------+ | country | total_predicted_purchases | +----------------+---------------------------+ | United States | 209 | | Taiwan | 6 | | Canada | 4 | | Turkey | 2 | | India | 2 | | Japan | 2 | | Indonesia | 1 | | United Kingdom | 1 | | Guyana | 1 | +----------------+---------------------------+
BigQuery DataFrames
このサンプルを試す前に、BigQuery DataFrames を使用した BigQuery クイックスタートの手順に沿って BigQuery DataFrames を設定してください。詳細については、BigQuery DataFrames のリファレンス ドキュメントをご覧ください。
BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。
ユーザーごとの購入数を予測する
この例では、ウェブサイトの訪問者が行うトランザクションの数を予測します。
SQL
GROUP BY
句を除くと、このクエリは前のクエリと同じです。ここでは、GROUP BY
句(GROUP BY fullVisitorId
)を使用して、結果を訪問者 ID で分類します。
クエリを実行するには:
Google Cloud コンソールで、[クエリを新規作成] ボタンをクリックします。
[クエリエディタ] のテキスト領域に、次の GoogleSQL クエリを入力します。
#standardSQL SELECT fullVisitorId, SUM(predicted_label) as total_predicted_purchases FROM ML.PREDICT(MODEL `bqml_tutorial.sample_model`, ( SELECT IFNULL(device.operatingSystem, "") AS os, device.isMobile AS is_mobile, IFNULL(totals.pageviews, 0) AS pageviews, IFNULL(geoNetwork.country, "") AS country, fullVisitorId FROM `bigquery-public-data.google_analytics_sample.ga_sessions_*` WHERE _TABLE_SUFFIX BETWEEN '20170701' AND '20170801')) GROUP BY fullVisitorId ORDER BY total_predicted_purchases DESC LIMIT 10
[実行] をクリックします。
クエリが完了したら、クエリテキスト領域の下にある [結果] タブをクリックします。結果は次のようになります。
+---------------------+---------------------------+ | fullVisitorId | total_predicted_purchases | +---------------------+---------------------------+ | 9417857471295131045 | 4 | | 2158257269735455737 | 3 | | 5073919761051630191 | 3 | | 7104098063250586249 | 2 | | 4668039979320382648 | 2 | | 1280993661204347450 | 2 | | 7701613595320832147 | 2 | | 0376394056092189113 | 2 | | 9097465012770697796 | 2 | | 4419259211147428491 | 2 | +---------------------+---------------------------+
BigQuery DataFrames
このサンプルを試す前に、BigQuery DataFrames を使用した BigQuery クイックスタートの手順に沿って BigQuery DataFrames を設定してください。詳細については、BigQuery DataFrames のリファレンス ドキュメントをご覧ください。
BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。
クリーンアップ
このページで使用したリソースに関して 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 コンソールの詳細を確認する。