本教學課程說明如何建立矩陣分解模型,並使用公開GA360_test.ga_sessions_sample資料表中的 Google Analytics 360 使用者工作階段資料訓練模型。接著,您可以使用矩陣分解模型,為網站使用者產生內容推薦。
使用間接顧客偏好資訊 (例如使用者工作階段持續時間) 訓練模型,稱為使用「隱含回饋」訓練。使用隱含回饋做為訓練資料時,系統會使用加權交替最小平方法演算法訓練矩陣分解模型。
目標
本教學課程會逐步引導您完成下列工作:
- 使用
CREATE MODEL陳述式建立矩陣分解模型。 - 使用
ML.EVALUATE函式評估模型。 - 使用模型搭配
ML.RECOMMEND函式,為使用者產生內容推薦。
費用
本教學課程使用 Google Cloud的計費元件,包括:
- BigQuery
- BigQuery ML
如要進一步瞭解 BigQuery 費用,請參閱「BigQuery 定價」頁面。
如要進一步瞭解 BigQuery ML 費用,請參閱「BigQuery ML 定價」。
事前準備
-
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.
- 新專案會自動啟用 BigQuery。如要在現有專案中啟用 BigQuery,請前往
啟用 BigQuery API (如果尚未啟用)。
啟用 API 所需的角色
您必須具備
serviceusage.services.enable權限,才能啟用 API。如果您建立了專案,可能已透過擁有者角色 (roles/owner) 取得這項權限。否則,您可以透過 Service Usage 管理員角色 (roles/serviceusage.serviceUsageAdmin) 取得這項權限。瞭解如何授予角色。
所需權限
如要建立資料集,您必須具備
bigquery.datasets.createIAM 權限。如要建立模型,您必須具備下列權限:
bigquery.jobs.createbigquery.models.createbigquery.models.getDatabigquery.models.updateData
如要執行推論,您必須具備下列權限:
bigquery.models.getDatabigquery.jobs.create
如要進一步瞭解 BigQuery 的 IAM 角色和權限,請參閱「IAM 簡介」。
建立資料集
如要建立 BigQuery 資料集,請選取下列其中一個選項:
控制台
前往 Google Cloud 控制台的「BigQuery」頁面。
點選左側窗格中的 「Explorer」。

如果沒有看到左側窗格,請按一下 「Expand left pane」(展開左側窗格),開啟窗格。
在「Explorer」中展開專案,然後按一下「資料集」。
在「Datasets」(資料集) 頁面,按一下「Create dataset」(建立資料集)。
在「建立資料集」窗格中,執行下列操作:
在「Dataset ID」(資料集 ID) 中輸入
bqml_tutorial。在「資料位置」部分,選取「US」。
其餘預設設定則保持不變。
點選「建立資料集」。
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" } }
準備範例資料
將 GA360_test.ga_sessions_sample 資料表中的資料轉換為更適合模型訓練的結構,然後將這些資料寫入 BigQuery 資料表。下列查詢會計算每位使用者在每項內容的工作階段持續時間,您可以將其做為隱含回饋,推論使用者對該內容的偏好。
請按照下列步驟建立訓練資料表:
前往 Google Cloud 控制台的「BigQuery」頁面。
建立訓練資料表。在查詢編輯器中貼上以下查詢,然後點選「Run」(執行):
CREATE OR REPLACE TABLE `bqml_tutorial.analytics_session_data` AS WITH visitor_page_content AS ( SELECT fullVisitorID, ( SELECT MAX( IF( index = 10, value, NULL)) FROM UNNEST(hits.customDimensions) ) AS latestContentId, (LEAD(hits.time, 1) OVER (PARTITION BY fullVisitorId ORDER BY hits.time ASC) - hits.time) AS session_duration FROM `cloud-training-demos.GA360_test.ga_sessions_sample`, UNNEST(hits) AS hits WHERE # only include hits on pages hits.type = 'PAGE' GROUP BY fullVisitorId, latestContentId, hits.time ) # aggregate web stats SELECT fullVisitorID AS visitorId, latestContentId AS contentId, SUM(session_duration) AS session_duration FROM visitor_page_content WHERE latestContentId IS NOT NULL GROUP BY fullVisitorID, latestContentId HAVING session_duration > 0 ORDER BY latestContentId;
查看部分訓練資料。在查詢編輯器中貼上以下查詢,然後點選「Run」(執行):
SELECT * FROM `bqml_tutorial.analytics_session_data` LIMIT 5;
結果應大致如下:
+---------------------+-----------+------------------+ | visitorId | contentId | session_duration | +---------------------+-----------+------------------+ | 7337153711992174438 | 100074831 | 44652 | +---------------------+-----------+------------------+ | 5190801220865459604 | 100170790 | 121420 | +---------------------+-----------+------------------+ | 2293633612703952721 | 100510126 | 47744 | +---------------------+-----------+------------------+ | 5874973374932455844 | 100510126 | 32109 | +---------------------+-----------+------------------+ | 1173698801255170595 | 100676857 | 10512 | +---------------------+-----------+------------------+
建立模型
建立矩陣分解模型,並使用 analytics_session_data 資料表中的資料訓練模型。模型經過訓練,可預測每個 visitorId-contentId 配對的可信度評分。可信度評分是根據工作階段持續時間中位數,進行置中和縮放後產生。如果工作階段持續時間超過中位數的 3.33 倍,系統會將該記錄視為離群值並篩除。
下列 CREATE MODEL 陳述式會使用這些資料欄產生建議:
visitorId:訪客 ID。contentId:Content ID。rating:為每組訪客內容計算的隱含評分,範圍介於 0 到 1 之間,並經過置中和縮放。
前往 Google Cloud 控制台的「BigQuery」頁面。
在查詢編輯器中貼上以下查詢,然後點選「執行」:
CREATE OR REPLACE MODEL `bqml_tutorial.mf_implicit` OPTIONS ( MODEL_TYPE = 'matrix_factorization', FEEDBACK_TYPE = 'implicit', USER_COL = 'visitorId', ITEM_COL = 'contentId', RATING_COL = 'rating', L2_REG = 30, NUM_FACTORS = 15) AS SELECT visitorId, contentId, 0.3 * (1 + (session_duration - 57937) / 57937) AS rating FROM `bqml_tutorial.analytics_session_data` WHERE 0.3 * (1 + (session_duration - 57937) / 57937) < 1;
查詢約需 10 分鐘才能完成,完成後,
mf_implicit模型會顯示在「Explorer」窗格中。由於查詢使用CREATE MODEL陳述式建立模型,因此不會顯示查詢結果。
取得訓練統計資料
您也可以在Google Cloud 控制台查看模型的訓練統計資料。
機器學習演算法會使用不同參數,建立多個模型疊代,然後選取損失最低的模型版本。這項程序稱為經驗風險最小化。模型的訓練統計資料會顯示與模型各疊代相關聯的損失。
請按照下列步驟查看模型的訓練統計資料:
前往 Google Cloud 控制台的「BigQuery」頁面。
點選左側窗格中的 「Explorer」。

如果沒有看到左側窗格,請按一下 「Expand left pane」(展開左側窗格),開啟窗格。
在「Explorer」窗格中展開專案,然後點選「資料集」。
點選「
bqml_tutorial」資料集。您也可以使用搜尋功能或篩選器尋找資料集。點按「模型」分頁標籤。
依序點選「
mf_implicit」模型和「訓練」分頁標籤在「檢視方式」部分,按一下「表格」。結果應大致如下:
+-----------+--------------------+--------------------+ | Iteration | Training Data Loss | Duration (seconds) | +-----------+--------------------+--------------------+ | 5 | 0.0027 | 47.27 | +-----------+--------------------+--------------------+ | 4 | 0.0028 | 39.60 | +-----------+--------------------+--------------------+ | 3 | 0.0032 | 55.57 | +-----------+--------------------+--------------------+ | ... | ... | ... | +-----------+--------------------+--------------------+
「Training Data Loss」(訓練資料損失) 欄代表模型訓練後計算出的損失指標。由於這是矩陣分解模型,因此這個資料欄會顯示均方誤差。
評估模型
使用 ML.EVALUATE 函式評估模型效能。ML.EVALUATE 函式會根據訓練期間計算的評估指標,評估模型傳回的預測內容分級。
請按照下列步驟評估模型:
前往 Google Cloud 控制台的「BigQuery」頁面。
在查詢編輯器中貼上以下查詢,然後點選「執行」:
SELECT * FROM ML.EVALUATE(MODEL `bqml_tutorial.mf_implicit`);
結果應大致如下:
+------------------------+-----------------------+---------------------------------------+---------------------+ | mean_average_precision | mean_squared_error | normalized_discounted_cumulative_gain | average_rank | +------------------------+-----------------------+---------------------------------------+---------------------+ | 0.4434341257478137 | 0.0013381759837648962 | 0.9433280547112802 | 0.24031636088594222 | +------------------------+-----------------------+---------------------------------------+---------------------+
如要進一步瞭解
ML.EVALUATE函式輸出內容,請參閱「輸出內容」。
取得訪客與內容組合子集的預測評分
使用 ML.RECOMMEND 取得五位網站訪客對每項內容的預測評分。
請按照下列步驟取得預測評分:
前往 Google Cloud 控制台的「BigQuery」頁面。
在查詢編輯器中貼上以下查詢,然後點選「執行」:
SELECT * FROM ML.RECOMMEND( MODEL `bqml_tutorial.mf_implicit`, ( SELECT visitorId FROM `bqml_tutorial.analytics_session_data` LIMIT 5 ));
結果應大致如下:
+-------------------------------+---------------------+-----------+ | predicted_rating_confidence | visitorId | contentId | +-------------------------------+---------------------+-----------+ | 0.0033608418060270262 | 7337153711992174438 | 277237933 | +-------------------------------+---------------------+-----------+ | 0.003602395397293956 | 7337153711992174438 | 158246147 | +-------------------------------+---------------------+-- -------+ | 0.0053197670652785356 | 7337153711992174438 | 299389988 | +-------------------------------+---------------------+-----------+ | ... | ... | ... | +-------------------------------+---------------------+-----------+
生成建議
使用預測評分,為每個訪客 ID 產生前五個推薦 Content ID。
請按照下列步驟產生建議:
前往 Google Cloud 控制台的「BigQuery」頁面。
將預測評分寫入資料表。在查詢編輯器中,貼上以下查詢,然後點選「Run」(執行):
CREATE OR REPLACE TABLE `bqml_tutorial.recommend_content` AS SELECT * FROM ML.RECOMMEND(MODEL `bqml_tutorial.mf_implicit`);
選取每位訪客的前五項結果。在查詢編輯器中,貼上以下查詢,然後點選「Run」(執行):
SELECT visitorId, ARRAY_AGG( STRUCT(contentId, predicted_rating_confidence) ORDER BY predicted_rating_confidence DESC LIMIT 5) AS rec FROM `bqml_tutorial.recommend_content` GROUP BY visitorId;
結果應大致如下:
+---------------------+-----------------+---------------------------------+ | visitorId | rec:contentId | rec:predicted_rating_confidence | +---------------------+-----------------+------------------------- ------+ | 867526255058981688 | 299804319 | 0.88170525357178664 | | | 299935287 | 0.54699439944935124 | | | 299410466 | 0.53424780863188659 | | | 299826767 | 0.46949603950374219 | | | 299809748 | 0.3379991197434149 | +---------------------+-----------------+---------------------------------+ | 2434264018925667659 | 299824032 | 1.3903516407308065 | | | 299410466 | 0.9921995618196483 | | | 299903877 | 0.92333625294129218 | | | 299816215 | 0.91856701667757279 | | | 299852437 | 0.86973661454890561 | +---------------------+-----------------+---------------------------------+ | ... | ... | ... | +---------------------+-----------------+---------------------------------+
清除所用資源
為避免因為本教學課程所用資源,導致系統向 Google Cloud 帳戶收取費用,請刪除含有相關資源的專案,或者保留專案但刪除個別資源。
- 您可以刪除建立的專案。
- 或者您可以保留專案並刪除資料集。
刪除資料集
刪除專案將移除專案中所有的資料集與資料表。若您希望重新使用專案,您可以刪除本教學課程中所建立的資料集。
如有需要,請在Google Cloud 控制台開啟 BigQuery 頁面。
在導覽窗格中,按一下您建立的 bqml_tutorial 資料集。
按一下視窗右側的「刪除資料集」。這個動作將會刪除資料集、資料表,以及所有資料。
在「Delete dataset」(刪除資料集) 對話方塊中,輸入資料集名稱 (
bqml_tutorial) 來確認刪除指令,然後點選「Delete」(刪除)。
刪除專案
如要刪除專案,請進行以下操作:
- 前往 Google Cloud 控制台的「Manage resources」(管理資源) 頁面。
- 在專案清單中選取要刪除的專案,然後點選「Delete」(刪除)。
- 在對話方塊中輸入專案 ID,然後按一下 [Shut down] (關閉) 以刪除專案。
後續步驟
- 嘗試根據明確回饋建立矩陣分解模型。
- 如需 BigQuery ML 的總覽,請參閱 BigQuery ML 簡介。
- 如要進一步瞭解機器學習,請參閱機器學習密集課程。