GSP246
總覽
BigQuery 是 Google
推出的全代管數據分析資料庫,具備免維運 (NoOps)
與低成本的優勢。有了這項產品,您不必管理基礎架構,也不需要資料庫管理員,就能查詢
TB 規模的資料。
BigQuery ML
讓資料分析師只需編寫少量程式碼,就能建立、訓練、評估機器學習模型,並將模型用於預測結果。
在本實驗室,您將運用 BigQuery
公開資料集內數百萬筆紐約市黃色計程車的載客行程資料,在 BigQuery
建立機器學習模型,讓模型根據輸入內容預測車資,並評估模型成效及實際預測。
學習重點
本實驗室將引導您完成下列工作:
- 使用 BigQuery 尋找公開資料集
- 查詢及探索公開計程車資料集
- 建立訓練和評估資料集,供批次預測使用
- 在 BigQuery ML 建立預測 (線性迴歸) 模型
- 評估機器學習模型成效
設定和需求
瞭解以下事項後,再點選「Start Lab」按鈕
請詳閱以下操作說明。實驗室活動會計時,且中途無法暫停。點選「Start Lab」後就會開始計時,顯示可使用 Google Cloud 資源的時間。
您將在真正的雲端環境完成實作實驗室活動,而不是模擬或示範環境。為此,我們會提供新的暫時憑證,供您在實驗室活動期間登入及存取 Google Cloud。
為了順利完成這個實驗室,請先確認:
- 可以使用標準的網際網路瀏覽器 (Chrome 瀏覽器為佳)。
注意事項:請使用無痕模式 (建議選項) 或私密瀏覽視窗執行此實驗室,這可以防止個人帳戶和學員帳戶之間的衝突,避免個人帳戶產生額外費用。
- 是時候完成實驗室活動了!別忘了,活動一旦開始將無法暫停。
注意事項:務必使用實驗室專用的學員帳戶。如果使用其他 Google Cloud 帳戶,可能會產生額外費用。
如何開始實驗室及登入 Google Cloud 控制台
-
按一下「Start Lab」按鈕。如果實驗室會產生費用,請在開啟的對話方塊中選取付款方式。右側的「Lab setup and access」面板會顯示下列項目:
- 「Open Google Cloud console」按鈕
- 此實驗室所需的臨時憑證 (使用者名稱和密碼)
- 完成此實驗室所需的其他資訊 (如有)
請注意,實驗室計時器位於頁面頂端附近,會顯示剩餘時間。
-
按一下「Open Google Cloud console」。如果使用 Chrome 瀏覽器,也可以按一下滑鼠右鍵,選取「在無痕視窗中開啟連結」。
接著,實驗室會啟動相關資源,並開啟另一個分頁,顯示「登入」頁面。
提示:您可以在不同的視窗並排開啟分頁。
注意:頁面顯示「選擇帳戶」對話方塊時,請點選「使用其他帳戶」。
-
如有必要,請將下方的 Username 貼到「登入」對話方塊。
{{{user_0.username | "Username"}}}
您也可以在「Lab setup and access」面板找到「Username」。
-
點選「下一步」。
-
複製下方的 Password,並貼到「歡迎使用」對話方塊。
{{{user_0.password | "Password"}}}
您也可以在「Lab setup and access」面板找到「Password」。
-
點選「下一步」。
重要事項:請務必使用實驗室提供的憑證,而非自己的 Google Cloud 帳戶憑證。
注意:如果使用自己的 Google Cloud 帳戶來進行這個實驗室,可能會產生額外費用。
-
繼續點按後續頁面:
- 接受條款及細則。
- 由於這是臨時帳戶,請勿新增救援選項或雙重驗證機制。
- 請勿申請免費試用。
Google Cloud 控制台稍後會在這個分頁開啟。
注意:如要使用 Google Cloud 產品和服務,請按一下「導覽選單」,或在「搜尋」欄位輸入服務或產品名稱。
開啟 BigQuery 控制台
- 在 Google Cloud 控制台中,依序選取「導覽選單」>「BigQuery」。
接著,畫面中會顯示「歡迎使用 Cloud 控制台中的 BigQuery」訊息方塊,當中會列出快速入門導覽課程指南的連結和版本資訊。
- 點選「完成」。
BigQuery 控制台會隨即開啟。
工作 1:探索紐約市計程車資料
問題:2015 年黃色計程車每個月的載客次數是多少?
- 複製下列 SQL 程式碼,並貼入「查詢編輯器」:
#standardSQL
SELECT
TIMESTAMP_TRUNC(pickup_datetime,
MONTH) month,
COUNT(*) trips
FROM
`bigquery-public-data.new_york.tlc_yellow_trips_2015`
GROUP BY
1
ORDER BY
1
- 然後點選「執行」。
畫面上會顯示下列結果:
如表所示,在 2015 年,紐約市計程車每個月的載客次數都超過 1,000
萬次,數量相當驚人!
確認工作完成情況
點選「Check my progress」確認工作已完成。如果順利完成,就會看見評估分數。
計算 2015 年黃色計程車各月份的載客次數
問題:2015 年黃色計程車載客的平均時速是多少?
#standardSQL
SELECT
EXTRACT(HOUR
FROM
pickup_datetime) hour,
ROUND(AVG(trip_distance / TIMESTAMP_DIFF(dropoff_datetime,
pickup_datetime,
SECOND))*3600, 1) speed
FROM
`bigquery-public-data.new_york.tlc_yellow_trips_2015`
WHERE
trip_distance > 0
AND fare_amount/trip_distance BETWEEN 2
AND 10
AND dropoff_datetime > pickup_datetime
GROUP BY
1
ORDER BY
1
畫面上會顯示下列結果:
日間平均時速約 11-12 英里,但到了清晨 5 點,平均時速幾乎翻倍,達到 21
英里。這很合理,因為凌晨 5 點時通常車流量較低。
確認工作完成情況
點選「Check my progress」確認工作已完成。如果順利完成,就會看見評估分數。
計算 2015 年黃色計程車的載客平均時速
工作 2:確定目標
接下來,您將在 BigQuery
建立機器學習模型,利用歷來的載客行程資料集與相關數據,預測紐約市計程車的車資。無論是對乘客還是計程車業者而言,能在出發前預測車資,對行程規劃都非常有幫助。
工作 3:選取特徵並建立訓練資料集
「紐約市黃色計程車」資料集為市府提供的公開資料集,目前已在 BigQuery 中開放自由使用。
您可以先瀏覽完整欄位清單,再預覽資料集,從中尋找實用特徵,協助機器學習模型理解過往「載客行程」資料與「車資」之間的關聯。
您的團隊決定測試下列欄位,看看是否適合做為車資預測模型的輸入特徵:
- 將查詢換成下列內容:
#standardSQL
WITH params AS (
SELECT
1 AS TRAIN,
2 AS EVAL
),
daynames AS
(SELECT ['Sun', 'Mon', 'Tues', 'Wed', 'Thurs', 'Fri', 'Sat'] AS daysofweek),
taxitrips AS (
SELECT
(tolls_amount + fare_amount) AS total_fare,
daysofweek[ORDINAL(EXTRACT(DAYOFWEEK FROM pickup_datetime))] AS dayofweek,
EXTRACT(HOUR FROM pickup_datetime) AS hourofday,
pickup_longitude AS pickuplon,
pickup_latitude AS pickuplat,
dropoff_longitude AS dropofflon,
dropoff_latitude AS dropofflat,
passenger_count AS passengers
FROM
`nyc-tlc.yellow.trips`, daynames, params
WHERE
trip_distance > 0 AND fare_amount > 0
AND MOD(ABS(FARM_FINGERPRINT(CAST(pickup_datetime AS STRING))),1000) = params.TRAIN
)
SELECT *
FROM taxitrips
關於以上查詢,有幾點需要注意:
- 查詢的主要內容位於最下方 (
SELECT * from taxitrips)。
-
taxitrips 負責從 NYC 資料集中擷取主要資料,其中的
SELECT 包含您的訓練特徵與標籤。
-
WHERE 會過濾掉您不想用於訓練的資料。
-
WHERE 也包含取樣子句,只擷取 1/1000 的資料。
-
定義名為
TRAIN 的變數,以便快速建構獨立的
EVAL 資料集。
- 瞭解這個查詢的用途後,請點選「執行」。
畫面上會顯示類似下方的結果:

何者為標籤 (正確答案)?
total_fare 是本模型的標籤 (也就是要預測的目標)。這個欄位是由
tolls_amount 和
fare_amount
計算而來。由於小費金額取決於乘客意願,因此可以忽略不計,不納入模型。
確認工作完成情況
點選「Check my progress」確認工作已完成。如果順利完成,就會看見評估分數。
測試各欄位是否適合做為車資預測模型的輸入特徵
工作 4:建立用於儲存模型的 BigQuery 資料集
在本節中,您將建立新的 BigQuery 資料集,用來儲存機器學習模型。
-
在左側的「Explorer」面板中,依序點選專案 ID
旁的「查看動作」圖示和「建立資料集」。
-
在「建立資料集」對話方塊中,輸入下列資訊:
- 在「資料集 ID」部分,輸入 taxi。
-
在「位置類型」部分,選取「us(multiple regions in United States)」。
- 其他設定保留預設值。
- 接著點選「建立資料集」。
確認工作完成情況
點選「Check my progress」確認工作已完成。如果順利完成,就會看見評估分數。
建立用於儲存模型的 BigQuery 資料集
工作 5:選擇 BigQuery ML 模型類型並指定選項
選定初步特徵後,即可開始在 BigQuery 建立第一個機器學習模型。
目前有多種模型可供選擇:
-
預測模型:使用線性迴歸 (linear_reg) 預測數值,例如下個月的銷售量。
-
二元/多類別分類模型:使用邏輯迴歸 (logistic_reg)
進行分類,例如判別郵件是否為垃圾郵件。
-
k-means 分群模型:想透過非監督式學習探索內容時,即可使用此模型。
注意:機器學習領域還有許多種模型 (例如類神經網路或決策樹),通常可透過 TensorFlow 等程式庫使用。目前 BQML 僅支援上述三種類型,詳情請參閱 BQML 藍圖。
- 輸入下列查詢來建立模型,並指定模型選項:
CREATE or REPLACE MODEL taxi.taxifare_model
OPTIONS
(model_type='linear_reg', labels=['total_fare']) AS
WITH params AS (
SELECT
1 AS TRAIN,
2 AS EVAL
),
daynames AS
(SELECT ['Sun', 'Mon', 'Tues', 'Wed', 'Thurs', 'Fri', 'Sat'] AS daysofweek),
taxitrips AS (
SELECT
(tolls_amount + fare_amount) AS total_fare,
daysofweek[ORDINAL(EXTRACT(DAYOFWEEK FROM pickup_datetime))] AS dayofweek,
EXTRACT(HOUR FROM pickup_datetime) AS hourofday,
pickup_longitude AS pickuplon,
pickup_latitude AS pickuplat,
dropoff_longitude AS dropofflon,
dropoff_latitude AS dropofflat,
passenger_count AS passengers
FROM
`nyc-tlc.yellow.trips`, daynames, params
WHERE
trip_distance > 0 AND fare_amount > 0
AND MOD(ABS(FARM_FINGERPRINT(CAST(pickup_datetime AS STRING))),1000) = params.TRAIN
)
SELECT *
FROM taxitrips
-
接著點選「執行」來訓練模型。
-
等模型訓練完成 (5 至 10 分鐘)。
訓練完成後,畫面會顯示下列訊息:「This statement will create a new model named
qwiklabs-gcp-03-xxxxxxxx:taxi.taxifare_model」,表示訓練成功。
- 查看計程車資料集,確認「taxifare_model」已出現。
接下來,您將使用模型從未見過的全新資料,評估模型成效。
確認工作完成情況
點選「Check my progress」確認工作已完成。如果順利完成,就會看見評估分數。
建立計程車資模型
工作 6:評估分類模型的成效
選取評估標準
針對線性迴歸模型,通常會使用均方根誤差 (RMSE)
等損失指標,透過持續訓練與調整,將模型的 RMSE 降至最低。
在 BQML 評估訓練好的機器學習模型時,可以查詢
mean_squared_error 欄位,並套用 SQRT() 函式來計算
RMSE。
模型訓練完成後,您可以執行以下 ML.EVALUATE 查詢來評估模型成效。
-
複製下列指令並貼入「查詢編輯器」,然後點選「執行」:
#standardSQL
SELECT
SQRT(mean_squared_error) AS rmse
FROM
ML.EVALUATE(MODEL taxi.taxifare_model,
(
WITH params AS (
SELECT
1 AS TRAIN,
2 AS EVAL
),
daynames AS
(SELECT ['Sun', 'Mon', 'Tues', 'Wed', 'Thurs', 'Fri', 'Sat'] AS daysofweek),
taxitrips AS (
SELECT
(tolls_amount + fare_amount) AS total_fare,
daysofweek[ORDINAL(EXTRACT(DAYOFWEEK FROM pickup_datetime))] AS dayofweek,
EXTRACT(HOUR FROM pickup_datetime) AS hourofday,
pickup_longitude AS pickuplon,
pickup_latitude AS pickuplat,
dropoff_longitude AS dropofflon,
dropoff_latitude AS dropofflat,
passenger_count AS passengers
FROM
`nyc-tlc.yellow.trips`, daynames, params
WHERE
trip_distance > 0 AND fare_amount > 0
AND MOD(ABS(FARM_FINGERPRINT(CAST(pickup_datetime AS STRING))),1000) = params.EVAL
)
SELECT *
FROM taxitrips
))
接下來,您將使用
params.EVAL 篩選出的另一組計程車載客資料來評估模型。
- 執行完畢後,請檢視模型結果 (RMSE 值可能有些微差異)。
|
Row
|
rmse
|
1 |
9.477056435999074 |
模型評估後的 RMSE 為 9.47。由於 RMSE
是均方誤差的平方根,單位與 total_fare 相同,因此 9.47 的誤差值即代表 ±$9.47
美元。
這項損失指標是否達到讓模型正式上線的標準,完全取決於您在訓練開始前設定的評估基準。建立基準即是針對模型成效與準確度,確立一個可接受的最低門檻。
確認工作完成情況
點選「Check my progress」確認工作已完成。如果順利完成,就會看見評估分數。
評估分類模型的成效
工作 7:預測計程車資
接下來請編寫查詢,使用新模型預測。
-
複製下列指令並貼入「查詢編輯器」,然後點選「執行」:
#standardSQL
SELECT
*
FROM
ml.PREDICT(MODEL `taxi.taxifare_model`,
(
WITH params AS (
SELECT
1 AS TRAIN,
2 AS EVAL
),
daynames AS
(SELECT ['Sun', 'Mon', 'Tues', 'Wed', 'Thurs', 'Fri', 'Sat'] AS daysofweek),
taxitrips AS (
SELECT
(tolls_amount + fare_amount) AS total_fare,
daysofweek[ORDINAL(EXTRACT(DAYOFWEEK FROM pickup_datetime))] AS dayofweek,
EXTRACT(HOUR FROM pickup_datetime) AS hourofday,
pickup_longitude AS pickuplon,
pickup_latitude AS pickuplat,
dropoff_longitude AS dropofflon,
dropoff_latitude AS dropofflat,
passenger_count AS passengers
FROM
`nyc-tlc.yellow.trips`, daynames, params
WHERE
trip_distance > 0 AND fare_amount > 0
AND MOD(ABS(FARM_FINGERPRINT(CAST(pickup_datetime AS STRING))),1000) = params.EVAL
)
SELECT *
FROM taxitrips
));
現在,模型預測的計程車資會與實際車資及其他特徵並列顯示,方便您比對。畫面上會顯示類似下方的結果:

確認工作完成情況
點選「Check my progress」確認工作已完成。如果順利完成,就會看見評估分數。
預測計程車資
工作 8:利用特徵工程改良模型
建構機器學習模型是一項需要反覆調整的工作。評估完初始模型的成效後,我們通常會回頭刪減特徵與資料列,看看是否能進一步提升模型表現。
篩選訓練資料集
接著,請查看計程車資的常用統計資料。
-
複製下列指令並貼入「查詢編輯器」,然後點選「執行」:
SELECT
COUNT(fare_amount) AS num_fares,
MIN(fare_amount) AS low_fare,
MAX(fare_amount) AS high_fare,
AVG(fare_amount) AS avg_fare,
STDDEV(fare_amount) AS stddev
FROM
`nyc-tlc.yellow.trips`
# 1,108,779,463 fares
輸出內容應與下方類似:

如您所見,資料集中有一些明顯的離群值,像是負數車資或超過 $50,000
美元的極端金額。我們應運用專業知識排除這些異常資料,確保模型不會受到離群值的干擾。
限制資料範圍,僅保留介於 $6 美元至 $200 美元之間的車資。
-
複製下列指令並貼入「查詢編輯器」,然後點選「執行」:
SELECT
COUNT(fare_amount) AS num_fares,
MIN(fare_amount) AS low_fare,
MAX(fare_amount) AS high_fare,
AVG(fare_amount) AS avg_fare,
STDDEV(fare_amount) AS stddev
FROM
`nyc-tlc.yellow.trips`
WHERE trip_distance > 0 AND fare_amount BETWEEN 6 and 200
# 843,834,902 fares
輸出內容應與下方類似:

這樣稍微好一些。與此同時,我們也可以限制行駛距離,讓模型學習時完全鎖定紐約市內的行程資料。
-
複製下列指令並貼入「查詢編輯器」,然後點選「執行」:
SELECT
COUNT(fare_amount) AS num_fares,
MIN(fare_amount) AS low_fare,
MAX(fare_amount) AS high_fare,
AVG(fare_amount) AS avg_fare,
STDDEV(fare_amount) AS stddev
FROM
`nyc-tlc.yellow.trips`
WHERE trip_distance > 0 AND fare_amount BETWEEN 6 and 200
AND pickup_longitude > -75 #limiting of the distance the taxis travel out
AND pickup_longitude < -73
AND dropoff_longitude > -75
AND dropoff_longitude < -73
AND pickup_latitude > 40
AND pickup_latitude < 42
AND dropoff_latitude > 40
AND dropoff_latitude < 42
# 827,365,869 fares
輸出內容應與下方類似:

目前仍有超過 8
億筆載客資料可供新模型學習。請套用這些新的限制條件再重新訓練模型,看看模型表現如何。
重新訓練模型
將新的線性迴歸模型命名為
taxi.taxifare_model_2,然後重新訓練模型來預測總車資。您會發現,這次的指令也加入了幾項計算得出的特徵,也就是上下車地點之間的歐幾里得距離
(直線距離)。
-
複製下列指令並貼入「查詢編輯器」,然後點選「執行」:
CREATE OR REPLACE MODEL taxi.taxifare_model_2
OPTIONS
(model_type='linear_reg', labels=['total_fare']) AS
WITH params AS (
SELECT
1 AS TRAIN,
2 AS EVAL
),
daynames AS
(SELECT ['Sun', 'Mon', 'Tues', 'Wed', 'Thurs', 'Fri', 'Sat'] AS daysofweek),
taxitrips AS (
SELECT
(tolls_amount + fare_amount) AS total_fare,
daysofweek[ORDINAL(EXTRACT(DAYOFWEEK FROM pickup_datetime))] AS dayofweek,
EXTRACT(HOUR FROM pickup_datetime) AS hourofday,
SQRT(POW((pickup_longitude - dropoff_longitude),2) + POW(( pickup_latitude - dropoff_latitude), 2)) as dist, #Euclidean distance between pickup and drop off
SQRT(POW((pickup_longitude - dropoff_longitude),2)) as longitude, #Euclidean distance between pickup and drop off in longitude
SQRT(POW((pickup_latitude - dropoff_latitude), 2)) as latitude, #Euclidean distance between pickup and drop off in latitude
passenger_count AS passengers
FROM
`nyc-tlc.yellow.trips`, daynames, params
WHERE trip_distance > 0 AND fare_amount BETWEEN 6 and 200
AND pickup_longitude > -75 #limiting of the distance the taxis travel out
AND pickup_longitude < -73
AND dropoff_longitude > -75
AND dropoff_longitude < -73
AND pickup_latitude > 40
AND pickup_latitude < 42
AND dropoff_latitude > 40
AND dropoff_latitude < 42
AND MOD(ABS(FARM_FINGERPRINT(CAST(pickup_datetime AS STRING))),1000) = params.TRAIN
)
SELECT *
FROM taxitrips
重新訓練模型可能需時數分鐘。在控制台收到下列訊息後,即可繼續下一步:

評估新模型的成效
模型調整完成後,請利用資料集評估模型表現。
-
複製下列指令並貼入「查詢編輯器」,然後點選「執行」:
SELECT
SQRT(mean_squared_error) AS rmse
FROM
ML.EVALUATE(MODEL taxi.taxifare_model_2,
(
WITH params AS (
SELECT
1 AS TRAIN,
2 AS EVAL
),
daynames AS
(SELECT ['Sun', 'Mon', 'Tues', 'Wed', 'Thurs', 'Fri', 'Sat'] AS daysofweek),
taxitrips AS (
SELECT
(tolls_amount + fare_amount) AS total_fare,
daysofweek[ORDINAL(EXTRACT(DAYOFWEEK FROM pickup_datetime))] AS dayofweek,
EXTRACT(HOUR FROM pickup_datetime) AS hourofday,
SQRT(POW((pickup_longitude - dropoff_longitude),2) + POW(( pickup_latitude - dropoff_latitude), 2)) as dist, #Euclidean distance between pickup and drop off
SQRT(POW((pickup_longitude - dropoff_longitude),2)) as longitude, #Euclidean distance between pickup and drop off in longitude
SQRT(POW((pickup_latitude - dropoff_latitude), 2)) as latitude, #Euclidean distance between pickup and drop off in latitude
passenger_count AS passengers
FROM
`nyc-tlc.yellow.trips`, daynames, params
WHERE trip_distance > 0 AND fare_amount BETWEEN 6 and 200
AND pickup_longitude > -75 #limiting of the distance the taxis travel out
AND pickup_longitude < -73
AND dropoff_longitude > -75
AND dropoff_longitude < -73
AND pickup_latitude > 40
AND pickup_latitude < 42
AND dropoff_latitude > 40
AND dropoff_latitude < 42
AND MOD(ABS(FARM_FINGERPRINT(CAST(pickup_datetime AS STRING))),1000) = params.EVAL
)
SELECT *
FROM taxitrips
))
輸出內容應與下方類似:

如您所見,RMSE 已下降至 ±$5.12 美元,相較於第一個模型的 ±$9.47
美元有顯著進步。
由於 RMSE
代表預測誤差的標準差,這顯示重新訓練後的線性迴歸模型已大幅提升準確度。
工作 9:隨堂測驗
完成下列選擇題有助於加深對本實驗室概念的理解,請盡力作答。
工作 10:探索其他資料集
如想嘗試用其他資料集建模,比如預測芝加哥的計程車資,可以使用
bigquery-public-data 專案。
-
前往「Explorer」面板,依序點選「+ 新增資料」 >「依據名稱為專案加上星號」>「輸入專案名稱」,然後輸入名稱
bigquery-public-data,即可開啟
bigquery-public-data 資料集。
-
點選「加上星號」。
bigquery-public-data 專案會列在「Explorer」專區。
恭喜!
您已成功在 BigQuery 建構機器學習模型,可以用來預測紐約市的計程車資了。
後續行動/瞭解詳情
Google Cloud 教育訓練與認證
協助您瞭解如何充分運用 Google Cloud 的技術。我們的課程會介紹專業技能和最佳做法,讓您可以快速掌握要領並持續進修。我們提供從基本到進階等級的訓練課程,並有隨選、線上和虛擬課程等選項,方便您抽空參加。認證可協助您驗證及證明自己在 Google Cloud 技術方面的技能和專業知識。
使用手冊上次更新日期:2026 年 1 月 7 日
實驗室上次測試日期:2026 年 1 月 7 日
Copyright 2026 Google LLC 保留所有權利。Google 和 Google 標誌是 Google LLC 的商標,其他公司和產品名稱則有可能是其關聯公司的商標。