使用 SQL 在 BigQuery ML 中建立機器學習模型
本教學課程說明如何使用 BigQuery ML SQL 查詢建立邏輯迴歸模型。
BigQuery ML 可讓您使用 SQL 查詢,在 BigQuery 中建立及訓練機器學習模型。這樣一來,您就能使用 BigQuery SQL 編輯器等熟悉的工具,更輕鬆地運用機器學習技術,並省去將資料移至獨立機器學習環境的麻煩,進而加快開發速度。
在本教學課程中,不論網站訪客是否確實完成交易,都可以使用 BigQuery 專用的 Google Analytics 樣本資料集來建立一個預測模型。如要瞭解 Analytics 資料集的結構定義,請參閱 Analytics 說明中心內的「BigQuery 匯出結構定義」。
如要瞭解如何使用 Google Cloud 控制台使用者介面建立模型,請參閱使用使用者介面處理模型。
目標
本教學課程說明如何執行下列工作:
- 使用
CREATE MODEL陳述式建立二元邏輯迴歸模型。 - 使用
ML.EVALUATE函式評估模型。 - 使用
ML.PREDICT函式,透過模型進行預測。
費用
本教學課程使用 Google Cloud的計費元件,包括:
- BigQuery
- BigQuery ML
如要進一步瞭解 BigQuery 費用,請參閱 BigQuery 定價頁面。
如要進一步瞭解 BigQuery ML 費用,請參閱 BigQuery ML 定價。
必要的角色
如要建立模型及執行推論,您必須具備下列角色:
- BigQuery 資料編輯者 (
roles/bigquery.dataEditor) - BigQuery 使用者 (
roles/bigquery.user)
- BigQuery 資料編輯者 (
事前準備
- 登入 Google Cloud 帳戶。如果您是 Google Cloud新手,歡迎 建立帳戶,親自評估產品在實際工作環境中的成效。新客戶還能獲得價值 $300 美元的免費抵免額,可用於執行、測試及部署工作負載。
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
Make sure that you have the following role or roles on the project: BigQuery Data Editor, BigQuery Job User, Service Usage Admin
Check for the roles
-
In the Google Cloud console, go to the IAM page.
Go to IAM - Select the project.
-
In the Principal column, find all rows that identify you or a group that you're included in. To learn which groups you're included in, contact your administrator.
- For all rows that specify or include you, check the Role column to see whether the list of roles includes the required roles.
Grant the roles
-
In the Google Cloud console, go to the IAM page.
Go to IAM - Select the project.
- Click Grant access.
-
In the New principals field, enter your user identifier. This is typically the email address for a Google Account.
- Click Select a role, then search for the role.
- To grant additional roles, click Add another role and add each additional role.
- Click Save.
-
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
Make sure that you have the following role or roles on the project: BigQuery Data Editor, BigQuery Job User, Service Usage Admin
Check for the roles
-
In the Google Cloud console, go to the IAM page.
Go to IAM - Select the project.
-
In the Principal column, find all rows that identify you or a group that you're included in. To learn which groups you're included in, contact your administrator.
- For all rows that specify or include you, check the Role column to see whether the list of roles includes the required roles.
Grant the roles
-
In the Google Cloud console, go to the IAM page.
Go to IAM - Select the project.
- Click Grant access.
-
In the New principals field, enter your user identifier. This is typically the email address for a Google Account.
- Click Select a role, then search for the role.
- To grant additional roles, click Add another role and add each additional role.
- Click Save.
-
- 新專案會自動啟用 BigQuery。如要在現有專案中啟用 BigQuery,請前往
啟用 BigQuery API。
啟用 API 時所需的角色
如要啟用 API,您需要服務使用情形管理員 IAM 角色 (
roles/serviceusage.serviceUsageAdmin),其中包含serviceusage.services.enable權限。瞭解如何授予角色。
建立資料集
建立 BigQuery 資料集來儲存機器學習模型。控制台
前往 Google Cloud 控制台的「BigQuery」頁面。
在「Explorer」窗格中,按一下專案名稱。
依序點按 「View actions」(查看動作) >「Create dataset」(建立資料集)
在「建立資料集」頁面中,執行下列操作:
在「Dataset ID」(資料集 ID) 中輸入
bqml_tutorial。針對「位置類型」選取「多區域」,然後選取「美國」。
其餘設定請保留預設狀態,然後按一下「建立資料集」。
bq
如要建立新的資料集,請使用 bq mk --dataset 指令。
建立名為
bqml_tutorial的資料集,並將資料位置設為US。bq mk --dataset \ --location=US \ --description "BigQuery ML tutorial dataset." \ bqml_tutorial
確認資料集已建立完成:
bq ls
API
請呼叫 datasets.insert 方法,搭配已定義的資料集資源。
{ "datasetReference": { "datasetId": "bqml_tutorial" } }
BigQuery DataFrames
在嘗試這個範例之前,請按照使用 BigQuery DataFrames 的 BigQuery 快速入門導覽課程中的 BigQuery DataFrames 設定說明操作。 詳情請參閱 BigQuery DataFrames 參考說明文件。
如要向 BigQuery 進行驗證,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定 ADC」。
建立邏輯迴歸模型
使用 BigQuery 的 Analytics 範例資料集建立邏輯迴歸模型。
SQL
前往 Google Cloud 控制台的「BigQuery」頁面。
在查詢編輯器中執行下列陳述式:
CREATE OR REPLACE 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陳述式建立模型,因此您不會看到查詢結果。
查詢詳細資料
CREATE MODEL 陳述式會建立模型,然後使用查詢的 SELECT 陳述式擷取的資料訓練模型。
OPTIONS(model_type='logistic_reg') 子句會建立邏輯迴歸模型。邏輯迴歸模型會將輸入資料分成兩個類別,然後估算資料屬於其中一個類別的機率。您要偵測的內容 (例如電子郵件是否為垃圾郵件) 以 1 表示,其他值則以 0 表示。介於 0 到 1 之間的值,表示指定值屬於您嘗試偵測的類別的可能性。舉例來說,如果電子郵件的機率估計值為 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_analytics_sample.ga_sessions_*。
WHERE 子句 (_TABLE_SUFFIX BETWEEN '20160801' AND '20170630') 會限制查詢掃描的資料表數量。而所掃描的日期區間則是從 2016 年 8 月 1 日到 2017 年 6 月 30 日。
BigQuery DataFrames
在嘗試這個範例之前,請按照使用 BigQuery DataFrames 的 BigQuery 快速入門導覽課程中的 BigQuery DataFrames 設定說明操作。 詳情請參閱 BigQuery DataFrames 參考說明文件。
如要向 BigQuery 進行驗證,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定 ADC」。
查看模型的損失統計資料
機器學習是指建立一個可透過資料進行預測的模型,此模型是一個可接收資料輸入的功能,並且能夠針對輸入資料進行運算,進而產生輸出,也就是預測。
機器學習演算法是透過若干已知預測結果的範例 (像是使用者購買次數的歷史資料) 以及藉由迭代法來不斷調整模型中的各式權重,使得模型預測得以與真實數值吻合。能達到這個目標,是因為機器學習演算法透過「遺失」指標降低模型的錯誤預測。
預期每次疊代時,損失應會減少,最好是降至零。遺失值 0,代表模型具有 100% 的正確率。
訓練模型時,BigQuery ML 會自動將輸入資料拆分為訓練集和評估集,避免模型過度擬合。這是必要步驟,因為訓練演算法不能過度貼近訓練資料,否則就無法歸納新樣本。
使用 Google Cloud 控制台,查看模型在訓練疊代期間的損失變化:
前往 Google Cloud 控制台的「BigQuery」頁面。
點選左側窗格中的 「Explorer」。

如果沒有看到左側窗格,請按一下「展開左側窗格」圖示 開啟窗格。
在「Explorer」窗格中展開專案,按一下「Datasets」,然後按一下
bqml_tutorial資料集。按一下「模型」分頁標籤,然後點選
sample_model模型。按一下「訓練」分頁標籤,然後查看「損失」圖表。「損失」圖表會顯示訓練資料集疊代期間的損失指標變化。將游標懸停在圖表上,您會看到「訓練損失」和「評估損失」的線條。由於您執行的是邏輯迴歸,因此訓練損失值是使用訓練資料計算出的對數損失。評估損失是在評估資料上計算的對數損失。這兩種損失類型都代表平均損失值,是針對每次疊代中各資料集的所有範例計算平均值。
您也可以使用 ML.TRAINING_INFO 函式查看模型訓練結果。
評估模型
使用 ML.EVALUATE 函式評估模型效能。ML.EVALUATE 函式會根據實際資料來評估模型產生的預測值,如要計算邏輯迴歸專用的指標,可以使用 ML.ROC_CURVE SQL 函式或 bigframes.ml.metrics.roc_curve BigQuery DataFrames 函式。
在本教學課程中,您會使用偵測交易的二元分類模型。「label」欄中的值是模型產生的兩個類別:「0」(無交易) 和「1」(已完成交易)。
SQL
前往 Google Cloud 控制台的「BigQuery」頁面。
在查詢編輯器中執行下列陳述式:
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.468503937007874 | 0.11080074487895716 | 0.98534315834767638 | 0.17921686746987953 | 0.04624221101176898 | 0.98174125874125873 | +--------------------+---------------------+---------------------+---------------------+---------------------+--------------------+
由於您執行了邏輯迴歸,因此結果包含以下資料欄:
precision:分類模型的指標,該指標可確認當模型預測到正向類別時的正確發生頻率。recall:分類模型的指標,可用來回答下列問題:在所有可能的正向標籤中,模型可以正確辨識出多少個標籤?accuracy:準確率就是分類模型預測成功的比例。f1_score: 衡量模型準確率的指標,f1 是準確率與喚回度的調和平均數,f1 分數的最佳值為 1,最差值為 0。log_loss:用於邏輯迴歸中的損失函式,可衡量模型預測結果與正確標籤之間的差距。roc_auc: ROC 曲線下的面積。也就是分類器對於隨機挑選的正向樣本確實是正向的信心,高於隨機挑選的負向樣本其實是正向的情況發生機率。詳情請參閱機器學習密集課程中的「分類」一文。
查詢詳細資料
初始 SELECT 陳述式會擷取模型中的資料欄。
FROM 子句會對模型使用 ML.EVALUATE 函式。
巢狀 SELECT 陳述式和 FROM 子句與 CREATE MODEL 查詢中的相同。
WHERE 子句 (_TABLE_SUFFIX BETWEEN '20170701' AND '20170801') 會限制查詢掃描的資料表數量。而所掃描的日期區間則是從 2017 年 7 月 1 日到 2017 年 8 月 1 日,這正是您用來評估模型預測效能的資料。上述資料收集的時間點是在訓練資料所橫跨的時間區段之後、緊接著的隔月。
BigQuery DataFrames
在嘗試這個範例之前,請按照使用 BigQuery DataFrames 的 BigQuery 快速入門導覽課程中的 BigQuery DataFrames 設定說明操作。 詳情請參閱 BigQuery DataFrames 參考說明文件。
如要向 BigQuery 進行驗證,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定 ADC」。
使用模型預測結果
使用模型預測各國家/地區網站訪客的交易次數。
SQL
前往 Google Cloud 控制台的「BigQuery」頁面。
在查詢編輯器中執行下列陳述式:
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 | 220 | | Taiwan | 8 | | Canada | 7 | | India | 2 | | Turkey | 2 | | Japan | 2 | | Italy | 1 | | Brazil | 1 | | Singapore | 1 | | Australia | 1 | +----------------+---------------------------+
查詢詳細資料
初始 SELECT 陳述式會擷取 country 資料欄,並加總 predicted_label 資料欄。predicted_label 資料欄是由 ML.PREDICT 函式產生。使用 ML.PREDICT 函式時,模型的輸出資料欄名稱為 predicted_<label_column_name>。對線性迴歸模型來說,predicted_label 是 label 的估計值。對於邏輯迴歸模型,predicted_label 是最能描述指定輸入資料值的標籤,也就是 0 或 1。
ML.PREDICT 函式用於透過模型預測結果。
巢狀 SELECT 陳述式和 FROM 子句與 CREATE MODEL 查詢中的相同。
WHERE 子句 (_TABLE_SUFFIX BETWEEN '20170701' AND '20170801') 會限制查詢掃描的資料表數量。而所掃描的日期區間則是從 2017 年 7 月 1 日到 2017 年 8 月 1 日,這正是您執行預測所使用的資料。每當時間區段橫跨訓練資料之後,就會立刻收集月份資料。
GROUP BY 和 ORDER BY 子句會依國家/地區將結果分組,並依預測購買量總和遞減排序。
LIMIT 子句在此處的用途是僅顯示前 10 筆查詢結果。
BigQuery DataFrames
在嘗試這個範例之前,請按照使用 BigQuery DataFrames 的 BigQuery 快速入門導覽課程中的 BigQuery DataFrames 設定說明操作。 詳情請參閱 BigQuery DataFrames 參考說明文件。
如要向 BigQuery 進行驗證,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定 ADC」。
預測各使用者的購買量
預測每一位網站訪客的交易次數。
SQL
這項查詢與前一節的查詢相同,只有 GROUP BY 子句不同。這裡的 GROUP BY 子句 GROUP BY fullVisitorId
是用來依訪客 ID 分組結果。
前往 Google Cloud 控制台的「BigQuery」頁面。
在查詢編輯器中執行下列陳述式:
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 | | 112288330928895942 | 2 | | 2158257269735455737 | 2 | | 489038402765684003 | 2 | | 057693500927581077 | 2 | | 2969418676126258798 | 2 | | 5073919761051630191 | 2 | | 7420300501523012460 | 2 | | 0456807427403774085 | 2 | | 2105122376016897629 | 2 | +---------------------+---------------------------+
BigQuery DataFrames
在嘗試這個範例之前,請按照使用 BigQuery DataFrames 的 BigQuery 快速入門導覽課程中的 BigQuery DataFrames 設定說明操作。 詳情請參閱 BigQuery DataFrames 參考說明文件。
如要向 BigQuery 進行驗證,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定 ADC」。
清除所用資源
為了避免系統向您的 Google Cloud 帳戶收取本頁面所用資源的費用,請按照下列步驟操作。
您可以刪除建立的專案,或保留專案並刪除資料集。
刪除資料集
刪除專案將移除專案中所有的資料集與資料表。若您希望重新使用專案,您可以刪除本教學課程中所建立的資料集。
前往 Google Cloud 控制台的「BigQuery」頁面。
點選左側窗格中的 「Explorer」。

在「Explorer」窗格中展開專案,按一下「Datasets」(資料集),然後點選您建立的
bqml_tutorial資料集。點選「刪除」。
在「Delete dataset」(刪除資料集) 對話方塊中,輸入
delete來確認刪除指令。點選「刪除」。
刪除專案
如要刪除專案,請進行以下操作:
- 前往 Google Cloud 控制台的「Manage resources」(管理資源) 頁面。
- 在專案清單中選取要刪除的專案,然後點選「Delete」(刪除)。
- 在對話方塊中輸入專案 ID,然後按一下 [Shut down] (關閉) 以刪除專案。
後續步驟
- 如要進一步瞭解機器學習,請參閱機器學習速成課程。
- 如需 BigQuery ML 的總覽,請參閱 BigQuery ML 簡介。
- 如要進一步瞭解 Google Cloud 控制台,請參閱「使用 Google Cloud 控制台」。