ウェブ UI を使用した BigQuery ML スタートガイド

このチュートリアルでは、BigQuery ウェブ UI を使用した BigQuery ML について紹介します。このチュートリアルの Jupyter ノートブック版を見るには、Cloud Datalab を使った BigQuery ML スタートガイドにアクセスしてください。

BigQuery ML を使用すると、BigQuery で SQL クエリを使用して機械学習モデルを作成して実行できます。このチュートリアルでは、SQL のユーザーが簡単に機械学習を利用できるようにすることを目標としています。使い慣れたツールを使用してモデルを構築でき、データ移動の必要もないため、開発スピードを向上させることができます。

このチュートリアルでは、BigQuery 用の Google アナリティクス サンプル データセットを使用して、ウェブサイトの訪問者がトランザクションを完了するかどうかを予測するモデルを作成します。アナリティクス データセットのスキーマについては、Google アナリティクス ヘルプセンターで BigQuery Export スキーマをご覧ください。

目標

このチュートリアルでは、次のものを使用します。

  • BigQuery ML。CREATE MODEL ステートメントを使用して、2 項ロジスティック回帰モデルを作成します。
  • ML.EVALUATE 関数。ML モデルを評価します。
  • ML.PREDICT 関数。ML モデルを使用して予測を行います。

料金

このチュートリアルでは、以下を含む、Cloud Platform の有料コンポーネントを使用します。

  • BigQuery
  • BigQuery ML

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

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

始める前に

  1. Google アカウントにログインします。

    Google アカウントをまだお持ちでない場合は、新しいアカウントを登録します。

  2. GCP プロジェクトを選択または作成します。

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

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

    課金を有効にする方法について

  4. 新しいプロジェクトでは、BigQuery が自動的に有効になります。既存のプロジェクトで BigQuery を有効にするには、以下にアクセスします。 BigQuery API を有効にします。

    APIを有効にする

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

まず、ML モデルを格納する BigQuery データセットを作成します。データセットを作成するには、次の操作を行います。

  1. GCP Console の BigQuery ウェブ UI に移動します。

    BigQuery ウェブ UI に移動

  2. ナビゲーション パネルの [リソース] セクションで、プロジェクト名をクリックします。

  3. 右側の詳細パネルで、[データセットを作成] をクリックします。

    データセットを作成

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

    • [データセット ID] に「bqml_tutorial」と入力します。
    • [データのロケーション] で、[米国(US)] を選択します。現在、一般公開データセットは US マルチ リージョン ロケーションに格納されています。わかりやすくするため、データセットは同じロケーションに配置してください。

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

  5. その他のデフォルト設定はすべてそのままにし、[データセットを作成] をクリックします。

ステップ 2: モデルを作成する

次に、BigQuery 用の Google アナリティクス サンプル データセットを使用して、ロジスティック回帰モデルを作成します。次の標準 SQL クエリを使用して、ウェブサイトの訪問者がトランザクションを完了するかどうかを予測するモデルを作成します。

#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 - セッション内の e コマース トランザクションの合計数。トランザクション数が 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 クエリを実行するには:

  1. BigQuery ウェブ UI で、[クエリを新規作成] ボタンをクリックします。

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

    #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'
    
  3. [実行] をクリックします。

    クエリが完了するまでに数分かかります。最初の繰り返しが完了すると、BigQuery ウェブ UI のナビゲーション パネルにモデル(sample_model)が表示されます。このクエリでは、CREATE MODEL ステートメントを使用してモデルを作成しているため、クエリの結果は表示されません。

    BigQuery ウェブ UI の [Model stats] タブで、トレーニング中のモデルの状況を確認できます。最初の繰り返しが完了するとすぐに、このタブが更新されます。繰り返しが完了するたびに、統計情報が更新されます。

(省略可)ステップ 3: トレーニングの統計情報を取得する

モデルのトレーニング結果を確認するには、ML.TRAINING_INFO 関数を使用するか、BigQuery ウェブ UI で統計情報を表示します。このチュートリアルでは、BigQuery ウェブ UI を使用します。

機械学習では、データを使用して予測を行うモデルを作成します。モデルは、入力データを取得して計算を行い、出力(予測)を生成する関数です。

機械学習アルゴリズムは、すでに判明している複数のデータ(ユーザーの購入履歴データなど)を取得し、モデルの予測結果が実際の値と一致するように、モデルのさまざまな重み付けを繰り返し調整します。具体的には、モデルで誤った指標の使用(損失)回数を減らしていくことで調整します。

繰り返し調整を行うことで、損失を減らしていきます(ゼロになるのが理想的です)。損失ゼロは、モデルが 100% 正確であることを意味します。

CREATE MODEL クエリで生成したモデルのトレーニング統計を確認するには、次の操作を行います。

  1. BigQuery ウェブ UI の [リソース] セクションで、[PROJECT_ID] > bqml_tutorial の順に開き、sample_model をクリックします。

  2. [モデルの統計情報] タブをクリックします。結果は次のようになります。

    ML.TRAINING_INFO の出力

    [トレーニング データの損失] 列は、トレーニング データセットで所定の繰り返し回数を行った後に計算された損失指標を表します。ロジスティック回帰モデルのため、この列は対数損失になります。[評価データの損失] 列は、ホールドアウト データセット(モデルを検証するためにトレーニングから返され、保存されているデータ)で計算された損失指標と同じになります。

    BigQuery ML は、入力データをトレーニング セットとホールドアウト セットに自動的に分割し、モデルの過学習を防ぎます。この処理は、トレーニング アルゴリズムが既知のデータに合わせすぎて、新しい未確認のサンプルに対応できなくなることを防ぐために行われます。

    [トレーニング データの損失] と [評価データの損失] 列の値は平均の損失値で、それぞれのセットのすべてのサンプルの平均値になります。

    ML.TRAINING_INFO 関数の詳細については、BigQuery ML 構文リファレンスをご覧ください。

ステップ 4: モデルを評価する

モデルを作成したら、ML.EVALUATE 関数を使用して分類子の性能を評価します。ML.EVALUATE 関数は、実際のデータに対する予測値を評価します。また、ロジスティック回帰特有の指標については ML.ROC_CURVE 関数を使用します。

このチュートリアルでは、トランザクションを検出する 2 項分類モデルを使用しています。label 列にクラスの値が示されます。0 は「トランザクションなし」、1 は「トランザクションあり」です。

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

#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 ステートメントで、モデルから列を取得します。

The FROM clause uses the ML.EVALUATE function against your model: bqml_tutorial.sample_model.

このクエリでネストしている SELECT ステートメントと FROM 句は CREATE MODEL クエリと同じです。

WHERE 句(_TABLE_SUFFIX BETWEEN '20170701' AND '20170801')は、クエリでスキャンするテーブル数を制限しています。スキャンする日付の範囲は 2017 年 7 月 1 日から 2017 年 8 月 1 日までです。このデータは、モデルの予測性能の評価に使用します。これは、トレーニング データの期間の直後の月に収集されています。

ML.EVALUATE クエリを実行する

モデルを評価する ML.EVALUATE クエリを実行するには:

  1. BigQuery ウェブ UI で、[クエリを新規作成] ボタンをクリックします。

  2. [クエリエディタ] テキスト領域に、次の標準 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'))
    
  3. [実行] をクリックします。

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

    +--------------------+---------------------+--------------------+--------------------+---------------------+----------+
    |     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 曲線の下の面積。これは、無作為に選択した陽性のサンプルが陽性に分類される確率が、無作為に選択した陰性のサンプルが陽性に分類される確率よりも高い可能性を表します。詳細については、機械学習集中講座の分類をご覧ください。

ステップ 5: モデルを使用して結果を予測する

モデルの評価を行ったので、モデルを使用して結果を予測します。このモデルを使用して、ウェブサイトの訪問者が行ったトランザクションの数を国別に予測します。

結果の予測に使用するクエリは次のとおりです。

#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_labellabel の推定値になります。ロジスティック回帰モデルの場合、最も可能性が高いラベルは 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 クエリを実行する

モデルを使用して結果を予測するクエリを実行するには:

  1. BigQuery ウェブ UI で、[クエリを新規作成] ボタンをクリックします。

  2. [クエリエディタ] テキスト領域に、次の標準 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
    
  3. [実行] をクリックします。

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

    +----------------+---------------------------+
    |    country     | total_predicted_purchases |
    +----------------+---------------------------+
    | United States  |                       209 |
    | Taiwan         |                         6 |
    | Canada         |                         4 |
    | Turkey         |                         2 |
    | India          |                         2 |
    | Japan          |                         2 |
    | Indonesia      |                         1 |
    | United Kingdom |                         1 |
    | Guyana         |                         1 |
    +----------------+---------------------------+
    

(省略可)ユーザーあたりの購入数を予測する

この例では、ウェブサイトの訪問者が行うトランザクションの数を予測します。GROUP BY 句を除くと、このクエリは前のクエリと同じです。ここでは、GROUP BY 句(GROUP BY fullVisitorId)を使用して、結果を訪問者 ID で分類します。

クエリを実行するには:

  1. BigQuery ウェブ UI で、[クエリを新規作成] ボタンをクリックします。

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

    #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
    
  3. [実行] をクリックします。

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

    +---------------------+---------------------------+
    |    fullVisitorId    | total_predicted_purchases |
    +---------------------+---------------------------+
    | 9417857471295131045 |                         4 |
    | 2158257269735455737 |                         3 |
    | 5073919761051630191 |                         3 |
    | 7104098063250586249 |                         2 |
    | 4668039979320382648 |                         2 |
    | 1280993661204347450 |                         2 |
    | 7701613595320832147 |                         2 |
    | 0376394056092189113 |                         2 |
    | 9097465012770697796 |                         2 |
    | 4419259211147428491 |                         2 |
    +---------------------+---------------------------+
    

クリーンアップ

このチュートリアルで使用したリソースについて、Google Cloud Platform アカウントに課金されないようにする手順は次のとおりです。

  • 作成したプロジェクトを削除する。
  • または、プロジェクトを保存して、データセットを削除する。

データセットの削除

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

  1. 必要に応じて、BigQuery ウェブ UI を開きます。

    BigQuery ウェブ UI に移動

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

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

    データセットの削除

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

プロジェクトの削除

プロジェクトを削除する手順は次のとおりです。

  1. GCP Console で [プロジェクト] ページに移動します。

    プロジェクト ページに移動

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

次のステップ

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

BigQuery ML のドキュメント