資料洩漏是什麼?就是訓練時模型偷看到預測當下拿不到的資訊,測試分數漂亮、上線就翻車,像考試前偷看到答案。
這篇繼續用手搖飲料店當例子,把最常見的 3 種「作弊」方式一個一個算給你看:偷看未來、答案藏在題目裡、考卷混進練習題,最後教你怎麼在 GCP 上防範。

為什麼你需要知道
- 它是最會騙人的錯誤:上一篇講的過度擬合,至少驗證分數會變差,你還看得出來;資料洩漏是連驗證、測試分數都一起變好,直到上線才翻車
- 分數越漂亮,越要懷疑:準確率 99%、AUC 0.99,很多時候不是模型厲害,是模型作弊
- 專業團隊也常踩:洩漏常常藏在一個看起來很合理的欄位、一行前處理程式裡,不是粗心的人才會犯
- 證照必考:PMLE 考題很愛描述「測試分數極高,上線後表現很差」,問你原因
資料洩漏(Data Leakage)
白話是什麼
資料洩漏:訓練模型時,用到了正式上線預測那一刻拿不到的資訊。模型靠這些資訊考高分,但上線後這些資訊不存在,表現就崩了。
比喻
像考試前偷看到答案。模擬考考 100 分,大家都以為你很強;正式考試答案沒有外流,你就原形畢露。
麻煩的是,作弊的那個人常常不知道自己在作弊。資料洩漏通常不是故意的,而是資料整理過程中不小心「漏」進去的。
來龍去脈
Leak 是「漏水」的意思。資料像水一樣,從不該流過去的地方(未來、答案、測試集)滲進了訓練過程。
第 4 篇〈訓練集、驗證集、測試集怎麼切?〉講時間序列為什麼不能亂切時,已經碰過一次:隨機切飲料店的 1,000 天資料,測試集裡有 96% 的日子,模型練習時看過它隔壁那天的答案。那就是資料洩漏的一種。
為什麼要學
第 7 篇〈過度擬合是什麼?〉講的問題,驗證集抓得到;資料洩漏,驗證集抓不到,因為驗證集本身也被污染了。
| 過度擬合 | 資料洩漏 | |
|---|---|---|
| 白話 | 模型死背 | 模型作弊 |
| 訓練分數 | 很好 | 很好 |
| 驗證、測試分數 | 變差(看得出來) | 也很好(看不出來) |
| 上線後 | 差 | 差,而且常常差很多 |
| 怎麼發現 | 比較訓練和驗證的差距 | 分數好到不像真的、檢查每個特徵的來源 |
先看全貌:3 種常見的作弊方式
| 情況 | 白話 | 考試比喻 | 飲料店例子 |
|---|---|---|---|
| 1. 偷看未來 | 用到預測時間點之後才有的資料 | 考前拿到明天的報紙 | 用「這週平均銷量」預測週三 |
| 2. 答案藏在題目裡 | 某個特徵其實就是答案的分身,或預測時還不存在 | 題目裡直接寫了答案 | 用「今天開了幾張發票」預測今天賣幾杯 |
| 3. 考卷混進練習題 | 測試資料的資訊,在訓練過程被用到 | 模擬考題目先拿去練習 | 先用全部資料算平均,再切訓練、測試 |
下面一個一個算給你看。
情況 1:偷看未來(時間洩漏)
白話是什麼
模型在預測某個時間點時,用到了那個時間點之後才會知道的資料。
比喻
就像拿明天的報紙預測明天的股價。當然準,但現實中你不可能有明天的報紙。
來龍去脈
最常見的兩種:
- 切資料時亂切:時間序列隨機洗牌,訓練集裡混進了「未來的日子」(第 4 篇講過)
- 算特徵時偷用未來:資料切得很正確,但某個特徵在計算時,用到了未來的數字。這種更難發現
算一次給你看:「這週平均銷量」的陷阱
店長想預測週三賣幾杯,覺得「這週的生意好不好」是個好線索,就加了一個特徵:本週平均銷量。
假設(教學用的數字)這週的實際銷量是:
| 週一 | 週二 | 週三 | 週四 | 週五 | 週六 | 週日 |
|---|---|---|---|---|---|---|
| 100 | 110 | 130 | 150 | 160 | 200 | 190 |
整理歷史資料時,算出來的「本週平均」:
(100 + 110 + 130 + 150 + 160 + 200 + 190) ÷ 7 = 1,040 ÷ 7 ≈ 149 杯
但週三早上真正要預測時,你只知道週一、週二:
(100 + 110) ÷ 2 = 105 杯
數字怎麼看
- 訓練時的「本週平均」149 杯,裡面包含了週三自己的答案(130),還有週四到週日的未來
- 模型學到的是「本週平均 149 時,週三大約賣 130」,等於拿著答案在練習
- 上線時這個欄位只會是 105 這種數字,模型從沒看過這種情況,預測就亂掉了
解法:每個特徵都要問一句「在預測的那一刻,這個數字算得出來嗎?」只能用那一刻之前的資料算。這叫做時間點正確(Point-in-time Correctness)。
情況 2:答案藏在題目裡(標籤洩漏)
白話是什麼
標籤洩漏(Label Leakage):某個特徵其實是答案的分身,或是要等答案出來之後才會有的資訊。
依照 Google 機器學習詞彙表,標籤洩漏是一種模型設計上的缺陷:某個特徵替代了標籤。(標籤就是要預測的答案,第 3 篇講過。)
比喻
像考卷的題目寫著:「請問 2 + 3 等於多少?(提示:答案是 5)」。學生全部答對,但這張考卷完全測不出實力。
來龍去脈
Google 速成課程舉過兩個例子,很值得記住:
- 預測今天的營收,卻用了「今天來店的人數」當特徵:這個數字非常準,但在一天結束前根本不知道(速成課程:監控資料管線)
- 預測病人有沒有癌症,卻用了「醫院名稱」當特徵:有些醫院專門治療癌症,模型學到「在這間醫院的人大多有癌症」。但模型本來的用途,就是先判斷有沒有癌症,再決定要送去哪間醫院,預測時根本還沒有醫院名稱
算一次給你看:「發票張數」的陷阱
店長想在每天早上 9 點預測今天會賣幾杯,好決定要備多少料。資料表裡剛好有一欄「今天開了幾張發票」,加進去之後分數超好。
假設(教學用的數字)平均每張發票買 1.3 杯,某一天開了 120 張發票、實際賣了 158 杯:
模型預測 = 120 × 1.3 = 156 杯
誤差 = 158 − 156 = 2 杯
| 用了哪些特徵 | 測試誤差 | 早上 9 點上線時 |
|---|---|---|
| 氣溫+假日 | 14 杯 | 一樣約 14 杯 |
| 氣溫+假日+今天發票張數 | 2 杯 | 9 點還沒開店,發票是 0 張 |
上線時:
模型預測 = 0 × 1.3 = 0 杯
誤差 = 158 − 0 = 158 杯

數字怎麼看
- 測試誤差從 14 杯「進步」到 2 杯,進步太多本身就是警訊
- 發票張數和賣出杯數,幾乎是同一件事的兩種記法,它就是答案的分身
- Google 速成課程也提醒:評估分數好得驚人時(例如 AUC 0.99),要回頭找這種會「滲進」標籤的特徵
其他常見的例子
| 要預測 | 洩漏的特徵 | 為什麼是洩漏 |
|---|---|---|
| 客戶會不會退訂 | 「退訂原因」欄位 | 只有退訂之後才會填 |
| 貸款會不會違約 | 「催收次數」 | 違約之後才開始催收 |
| 病人有沒有某種病 | 「有沒有開某種藥」 | 確診後才會開藥 |
情況 3:考卷混進練習題(訓練與測試污染)
白話是什麼
測試集(或驗證集)的資訊,在訓練過程的某個步驟被用到了。資料本身切得沒錯,但「整理資料」或「挑模型」的步驟偷看了考卷。
比喻
老師出模擬考之前,先拿模擬考的題目給學生練習。模擬考成績很高,但那不是實力。
來龍去脈
最常見的三種:
- 先算統計值,再切資料(前處理洩漏)
- 同一筆資料出現在兩份(重複資料,第 4 篇講過)
- 用同一份資料挑超參數,又拿來報最終分數(選模型洩漏)
算一次給你看 1:先算平均再切,平均值偷看了未來
標準化(Standardization)是常見的前處理:把數字換算成「跟平均差了幾個標準差」,讓不同單位的特徵可以放在一起比較(第 10 篇會細講)。它的第一步是算平均值。
假設(教學用的數字)飲料店 1,000 天裡,前 800 天是訓練集,平均氣溫 22 度;最後 200 天(驗證集+測試集)剛好是夏天,平均氣溫 30 度。
錯誤做法:先用全部 1,000 天算平均,再切資料
平均氣溫 = (800 × 22 + 200 × 30) ÷ 1,000
= (17,600 + 6,000) ÷ 1,000
= 23.6 度
正確做法:先切資料,只用訓練集的 800 天算
平均氣溫 = 22 度

數字怎麼看
- 差的 1.6 度,就是「最後 200 天比較熱」這件事,偷偷流進了訓練過程
- 這個例子的影響不大,重點是原則:任何從資料「算出來」的東西(平均、標準差、最大最小值、要保留哪些特徵),都只能用訓練集算,再拿去套用到驗證集、測試集和上線資料
- 同樣的錯如果發生在「用全部資料挑出最有用的特徵」,分數會被灌水得非常明顯
算一次給你看 2:巢狀交叉驗證,挑模型和打分數要分開
先認識交叉驗證(Cross-Validation):資料不多時,把訓練資料分成 5 份,輪流拿其中 1 份當驗證、其他 4 份訓練,做 5 次,把 5 次的分數平均。比喻:同一本講義,輪流抽不同的章節來小考,比只考一次公平。
問題來了:假設你有 4 組超參數要比較,每組都做 5 份交叉驗證,最後挑分數最高的那組,又直接拿那個分數當「模型實力」報告。
這也是偷看。就像同一份模擬考考 4 次,挑最高分當實力,一定會高估。scikit-learn 官方範例的說法是:用沒有巢狀的交叉驗證挑參數,分數會過度樂觀。
巢狀交叉驗證(Nested Cross-Validation)的做法是把兩件事拆開:
- 外層(5 份):只負責打分數
- 內層(每次外層的 4 份訓練資料裡,再切 3 份):只負責挑超參數
要訓練幾次?
內層挑超參數:外層 5 次 × 內層 3 份 × 4 組超參數 = 60 次
外層用挑出的超參數重新訓練:5 次
總共 = 60 + 5 = 65 次
一般交叉驗證:5 份 × 4 組 = 20 次

數字怎麼看
- 巢狀交叉驗證要訓練 65 次,大約是一般做法的 3 倍,換來一個不灌水的分數
- 資料夠多時,不一定要這麼麻煩:直接照第 4 篇的做法,切出一份完全不碰的測試集,最後只用一次,效果一樣
- 資料很少、切不出獨立測試集時,巢狀交叉驗證就很有用
另外兩個常見的污染
- 重複資料:同一筆資料出現在訓練集和測試集,模型考到練習過的原題(第 4 篇陷阱 1)
- 先複製再切:處理類別不平衡時,常會把少數類別的資料複製好幾份(過取樣)。如果先複製、再切資料,同一筆的分身就會跨到兩份裡。正確順序是先切,再只對訓練集複製(第 9 篇會講)
怎麼發現資料洩漏:4 個警訊
| 警訊 | 白話 | 怎麼查 |
|---|---|---|
| 分數好到不像真的 | 準確率 99%、AUC 0.99、誤差幾乎是 0 | 回頭檢查每個特徵 |
| 某一個特徵特別重要 | 模型幾乎只靠一個欄位做判斷 | 看特徵重要度(第 21 篇的可解釋 AI 會講) |
| 上線後表現暴跌 | 測試很好,上線很差 | 比對訓練資料和上線資料(第 20 篇的模型監控會講) |
| 預測當下拿不到 | 這個欄位要等事情發生後才有 | 每個特徵都問:「預測那一刻,拿得到嗎?」 |
最後一個是最有用的習慣:把每個特徵列出來,旁邊寫上「它在什麼時間點、由誰產生」。比預測時間點晚的,全部拿掉。
在 GCP 上怎麼做
GCP(Google Cloud Platform) 是 Google 的雲端服務,白話說就是租用 Google 機房裡的電腦和工具。
1. BigQuery ML:照時間切,前處理寫在 TRANSFORM 裡
- BigQuery:Google 的大型資料倉庫,專門存放和分析超大量的表格資料
- BigQuery ML:讓你用 SQL(跟資料庫說話的語言)直接在 BigQuery 裡訓練模型
防情況 1(偷看未來):有時間順序的資料,用 DATA_SPLIT_METHOD='SEQ' 照時間切,舊的訓練、新的評估。第 4 篇有完整範例。依照官方文件,拿來排序的那一欄(DATA_SPLIT_COL)會自動被排除,不會被當成特徵。
防情況 3(前處理洩漏):把前處理寫在 TRANSFORM 裡,而且只拿訓練期間的資料來建模型(教學用的範例):
CREATE MODEL `shop.daily_cups_tf`
TRANSFORM(
ML.STANDARD_SCALER(temperature) OVER() AS temperature_scaled,
is_holiday,
cups_sold)
OPTIONS(model_type='LINEAR_REG',
input_label_cols=['cups_sold']) AS
SELECT temperature, is_holiday, cups_sold
FROM `shop.daily_sales_train`; -- 只放訓練期間的資料
依照 ML.STANDARD_SCALER 官方文件,寫在 TRANSFORM 裡時,訓練時算出來的平均和標準差,預測時會自動沿用。所以之後用 ML.PREDICT 預測新的一天,它會拿訓練期間的 22 度當平均,不會偷看任何新資料,也不用你自己再算一次。
這也解決了另一個相關的問題:訓練和上線時前處理不一致(Training-Serving Skew),第 20 篇會細講。
2. AutoML on Agent Platform:用時間欄位切
AutoML:只要把資料丟進去,Google 自動幫你挑模型、調超參數的服務,不用寫程式。
舊題庫可能還會看到 Vertex AI AutoML,現在叫 AutoML on Gemini Enterprise Agent Platform。
Google Cloud 在 2026 年 4 月 22 日把 Vertex AI 改名為 Gemini Enterprise Agent Platform(簡稱 Agent Platform),底下功能跟著改名(官方對照表)。功能本身是延續的。
依照官方文件:
- 資料跟時間有關時,預設的隨機切法不是最好的選擇,要改用時間切分(Chronological split):指定一欄當 Time column,最早的當訓練、接著當驗證、最新的當測試
- 時間欄位最好有至少 20 個不同的值,驗證集和測試集才不會是空的
- 也可以自己加一欄,填
TRAIN、VALIDATE、TEST來手動切,例如照分店切,避免同一間店跨兩份 - 預測型(forecasting)模型預設就照時間切,而且會丟掉預測範圍橫跨兩份資料的那些列,避免資料洩漏
3. Feature Store on Agent Platform:取回「當時」的特徵值
Feature Store:把整理好的特徵集中存放、讓不同模型共用的服務,第 3 篇比喻成「全公司共用的線索倉庫」(舊名 Vertex AI Feature Store)。
防範情況 1 最有用的功能是離線取用歷史特徵:依照官方文件,你可以指定時間點,取回「那個時間點當下」的特徵值來組訓練資料。等於自動幫你做到「週三早上只拿得到週一、週二的資料」。這個功能目前是預先發布(Preview)階段。
| 舊名稱 | 現在的名稱 |
|---|---|
| Vertex AI | Gemini Enterprise Agent Platform(Agent Platform) |
| Vertex AI AutoML | AutoML on Gemini Enterprise Agent Platform |
| Vertex AI Feature Store | Feature Store on Gemini Enterprise Agent Platform |
考試會怎麼考
Google Cloud Professional Machine Learning Engineer(PMLE,專業機器學習工程師) 證照,2026 年 6 月 1 日起的官方考試指南裡,這篇的內容對應到:
| 考試區塊 | 跟這篇有關的項目 |
|---|---|
| 第 2 區:跨團隊管理資料與模型(約 16%) | 探索與前處理資料、在 Feature Store 建立特徵 |
| 第 3 區:把原型擴展成正式模型(約 21%) | 排除模型訓練的問題 |
| 第 5 區:自動化與協調 ML 管線(約 18%) | 驗證資料與模型、確保訓練和上線的前處理一致 |

看到這些字,就想到這個
| 題目出現的關鍵字 | 想到 |
|---|---|
| 「測試分數極高,上線後很差」 | 資料洩漏(或訓練與上線不一致) |
| 「AUC 0.99」「準確率接近 100%」 | 先懷疑資料洩漏 |
| 「有時間順序的資料」「預測未來」 | 照時間切,BigQuery ML 用 SEQ、AutoML 用時間欄位 |
| 「某個欄位要等結果出來才有」 | 標籤洩漏,拿掉該特徵 |
| 「標準化、正規化、填補遺失值」 | 先切再算,只用訓練集的統計值 |
| 「確保訓練和預測的前處理一致」 | BigQuery ML 的 TRANSFORM |
| 「同時要調超參數又要估計實力」「資料很少」 | 巢狀交叉驗證 |
| 「取回某個時間點當下的特徵值」 | Feature Store 的歷史特徵(時間點正確) |
三個常見陷阱
- 以為隨機切最公平:有時間順序的資料,隨機切就是在偷看未來
- 把「跟答案超相關」的特徵當寶:相關到不合理,通常是答案的分身
- 看到分數低才檢查,分數高就不檢查:資料洩漏讓分數變高,所以分數異常好時更要檢查
練習情境(自己出的練習,不是真實考題)
一家電信公司要預測「下個月哪些用戶會解約」。資料科學家用 BigQuery ML 訓練邏輯迴歸,特徵包括月租費、使用年資、近 3 個月客服來電次數,以及「是否已提出攜碼申請」。測試集 AUC 高達 0.99,但上線後幾乎抓不到要解約的人。最可能的原因和修正方式是什麼?
判斷過程:
- 「AUC 0.99」→ 好到不像真的,先懷疑資料洩漏
- 「是否已提出攜碼申請」→ 用戶通常是決定解約之後才會申請攜碼,等於答案的分身,而且在「預測下個月」那一刻,大多數人還沒申請
- 修正:拿掉這個特徵,並檢查其他特徵在預測時間點是否拿得到;資料要照時間切,用過去的月份訓練、最近的月份測試
常見問答
資料洩漏是什麼?
資料洩漏是訓練模型時,用到了正式上線預測那一刻拿不到的資訊。模型靠這些資訊在驗證和測試時拿到很高的分數,但上線後這些資訊不存在,表現就大幅下降。就像考試前偷看到答案。
資料洩漏和過度擬合差在哪?
過度擬合是模型死背,訓練分數好、驗證分數差,比較兩者就看得出來。資料洩漏是模型作弊,連驗證和測試分數都一起變好,要等上線才發現,所以更難察覺。
資料洩漏有哪幾種?
常見有三種:偷看未來(用到預測時間點之後的資料,例如時間序列隨機切)、答案藏在題目裡(標籤洩漏,特徵是答案的分身或要等結果出來才有)、考卷混進練習題(測試資料的資訊在前處理、挑模型時被用到)。
怎麼知道模型有沒有資料洩漏?
注意四個警訊:分數好到不像真的、模型幾乎只靠一個特徵、測試很好但上線暴跌、某個特徵在預測當下根本拿不到。最實用的方法是把每個特徵列出來,寫上它在什麼時間點產生,比預測時間點晚的都要拿掉。
標籤洩漏是什麼?
標籤洩漏是某個特徵其實替代了要預測的答案。Google 速成課程的例子是:用「今天來店的人數」預測今天的營收,這個數字很準,但要等一天結束才知道,預測當下根本拿不到。
標準化為什麼要先切資料再算?
因為標準化要用到平均值和標準差,如果用全部資料算,驗證集和測試集的資訊就混進了訓練過程。正確做法是只用訓練集算統計值,再套用到其他資料。BigQuery ML 把前處理寫在 TRANSFORM 裡,訓練時算的統計值預測時會自動沿用。
巢狀交叉驗證是什麼?什麼時候要用?
巢狀交叉驗證把「挑超參數」和「打分數」拆成內外兩層:外層負責估計模型實力,內層只負責挑超參數,避免挑最高分又拿它當實力的偷看問題。代價是訓練次數多很多,適合資料少、切不出獨立測試集的時候。
時間序列資料要怎麼避免資料洩漏?
照時間切資料,舊的訓練、新的測試,不要隨機洗牌;每個特徵都只能用預測時間點之前的資料計算。BigQuery ML 可以用 DATA_SPLIT_METHOD=’SEQ’,AutoML on Agent Platform 可以指定時間欄位做時間切分。
重點整理
- 資料洩漏=模型訓練時偷看到上線時拿不到的資訊;它讓驗證、測試分數一起變好,比過度擬合更難發現
- 偷看未來:時間資料要照時間切,每個特徵只能用預測時間點之前的資料算
- 答案藏在題目裡:問每個特徵「預測那一刻拿得到嗎?」,答案的分身要拿掉
- 考卷混進練習題:先切再算統計值、刪掉重複資料、挑超參數和打分數要分開(巢狀交叉驗證)
- GCP 上:BigQuery ML 用
SEQ照時間切、前處理寫進TRANSFORM;AutoML 用時間欄位切;Feature Store 取回時間點當下的特徵值
延伸閱讀
本系列
- 第 1 篇:機器學習有哪幾種?監督式、非監督式、強化學習一次看懂
- 第 2 篇:分類和迴歸差在哪?一個例子搞懂,附 MAE、RMSE 計算
- 第 3 篇:特徵、標籤、超參數是什麼?機器學習 5 個必懂名詞
- 第 4 篇:訓練集、驗證集、測試集怎麼切?時間序列為什麼不能亂切
- 第 5 篇:混淆矩陣是什麼?用快篩搞懂準確率、精確率、召回率、F1
- 第 6 篇:ROC 曲線和 AUC 怎麼看?門檻怎麼調、AUC-PR 差在哪
- 上一篇:第 7 篇:過度擬合是什麼?正則化、Dropout、提前停止 3 招解決
- 下一篇:第 9 篇:類別不平衡怎麼辦?過取樣、欠取樣與 Upweighting(撰寫中)
站上相關文章
- BigQuery 不就是查詢嗎?跟資料庫差在哪裡?能做什麼分析?
- Vertex AI 核心功能 Agent Builder、Model Builder 和 Model Garden 介紹
- iPAS AI 應用規劃師初級認證考試 人工智慧概論 重點整理&簡報下載
- GCP 學習路徑 Learning Roadmap 和八大關卡
資料洩漏最可怕的地方,是它會讓你對一個不能用的模型充滿信心。養成「每個特徵都問一句:預測那一刻拿得到嗎?」的習慣,就能避開大部分的坑。如果你想有系統地從雲端基礎一路學到在 GCP 上動手做機器學習,可以看看東東的 GCP 課程,或加 LINE 聊聊你現在的狀況,一起找出最適合你的學習順序。