資料洩漏是什麼?模型考試作弊的 3 種常見情況

資料洩漏是什麼?就是訓練時模型偷看到預測當下拿不到的資訊,測試分數漂亮、上線就翻車,像考試前偷看到答案。

這篇繼續用手搖飲料店當例子,把最常見的 3 種「作弊」方式一個一個算給你看:偷看未來、答案藏在題目裡、考卷混進練習題,最後教你怎麼在 GCP 上防範。

資料洩漏的 3 種情況:偷看未來、答案藏在題目裡、考卷混進練習題

為什麼你需要知道

  • 它是最會騙人的錯誤:上一篇講的過度擬合,至少驗證分數會變差,你還看得出來;資料洩漏是連驗證、測試分數都一起變好,直到上線才翻車
  • 分數越漂亮,越要懷疑:準確率 99%、AUC 0.99,很多時候不是模型厲害,是模型作弊
  • 專業團隊也常踩:洩漏常常藏在一個看起來很合理的欄位、一行前處理程式裡,不是粗心的人才會犯
  • 證照必考:PMLE 考題很愛描述「測試分數極高,上線後表現很差」,問你原因

資料洩漏(Data Leakage)

白話是什麼

資料洩漏:訓練模型時,用到了正式上線預測那一刻拿不到的資訊。模型靠這些資訊考高分,但上線後這些資訊不存在,表現就崩了。

比喻

像考試前偷看到答案。模擬考考 100 分,大家都以為你很強;正式考試答案沒有外流,你就原形畢露。

麻煩的是,作弊的那個人常常不知道自己在作弊。資料洩漏通常不是故意的,而是資料整理過程中不小心「漏」進去的。

來龍去脈

Leak 是「漏水」的意思。資料像水一樣,從不該流過去的地方(未來、答案、測試集)滲進了訓練過程。

第 4 篇〈訓練集、驗證集、測試集怎麼切?〉講時間序列為什麼不能亂切時,已經碰過一次:隨機切飲料店的 1,000 天資料,測試集裡有 96% 的日子,模型練習時看過它隔壁那天的答案。那就是資料洩漏的一種。

為什麼要學

第 7 篇〈過度擬合是什麼?〉講的問題,驗證集抓得到;資料洩漏,驗證集抓不到,因為驗證集本身也被污染了。

過度擬合資料洩漏
白話模型死背模型作弊
訓練分數很好很好
驗證、測試分數變差(看得出來)也很好(看不出來)
上線後差差,而且常常差很多
怎麼發現比較訓練和驗證的差距分數好到不像真的、檢查每個特徵的來源

先看全貌:3 種常見的作弊方式

情況白話考試比喻飲料店例子
1. 偷看未來用到預測時間點之後才有的資料考前拿到明天的報紙用「這週平均銷量」預測週三
2. 答案藏在題目裡某個特徵其實就是答案的分身,或預測時還不存在題目裡直接寫了答案用「今天開了幾張發票」預測今天賣幾杯
3. 考卷混進練習題測試資料的資訊,在訓練過程被用到模擬考題目先拿去練習先用全部資料算平均,再切訓練、測試

下面一個一個算給你看。


情況 1:偷看未來(時間洩漏)

白話是什麼

模型在預測某個時間點時,用到了那個時間點之後才會知道的資料。

比喻

就像拿明天的報紙預測明天的股價。當然準,但現實中你不可能有明天的報紙。

來龍去脈

最常見的兩種:

  1. 切資料時亂切:時間序列隨機洗牌,訓練集裡混進了「未來的日子」(第 4 篇講過)
  2. 算特徵時偷用未來:資料切得很正確,但某個特徵在計算時,用到了未來的數字。這種更難發現

算一次給你看:「這週平均銷量」的陷阱

店長想預測週三賣幾杯,覺得「這週的生意好不好」是個好線索,就加了一個特徵:本週平均銷量。

假設(教學用的數字)這週的實際銷量是:

週一週二週三週四週五週六週日
100110130150160200190

整理歷史資料時,算出來的「本週平均」:

(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 杯
標籤洩漏:用今天的發票張數預測今天賣幾杯,測試誤差只有 2 杯,但早上 9 點發票是 0 張,上線誤差 158 杯

數字怎麼看

  • 測試誤差從 14 杯「進步」到 2 杯,進步太多本身就是警訊
  • 發票張數和賣出杯數,幾乎是同一件事的兩種記法,它就是答案的分身
  • Google 速成課程也提醒:評估分數好得驚人時(例如 AUC 0.99),要回頭找這種會「滲進」標籤的特徵

其他常見的例子

要預測洩漏的特徵為什麼是洩漏
客戶會不會退訂「退訂原因」欄位只有退訂之後才會填
貸款會不會違約「催收次數」違約之後才開始催收
病人有沒有某種病「有沒有開某種藥」確診後才會開藥

情況 3:考卷混進練習題(訓練與測試污染)

白話是什麼

測試集(或驗證集)的資訊,在訓練過程的某個步驟被用到了。資料本身切得沒錯,但「整理資料」或「挑模型」的步驟偷看了考卷。

比喻

老師出模擬考之前,先拿模擬考的題目給學生練習。模擬考成績很高,但那不是實力。

來龍去脈

最常見的三種:

  1. 先算統計值,再切資料(前處理洩漏)
  2. 同一筆資料出現在兩份(重複資料,第 4 篇講過)
  3. 用同一份資料挑超參數,又拿來報最終分數(選模型洩漏)

算一次給你看 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 度
先切再算:用全部資料算平均氣溫是 23.6 度,偷看了夏天的測試資料;只用訓練集算是 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 次
巢狀交叉驗證:外層 5 份負責打分數,內層 3 份負責挑超參數,4 組超參數共訓練 65 次,一般交叉驗證 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 裡

防情況 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 AIGemini Enterprise Agent Platform(Agent Platform)
Vertex AI AutoMLAutoML on Gemini Enterprise Agent Platform
Vertex AI Feature StoreFeature 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%)驗證資料與模型、確保訓練和上線的前處理一致
PMLE 考試關鍵字:測試很好上線很差想到資料洩漏,時間資料想到照時間切,前處理要先切再算,挑超參數又要打分數想到巢狀交叉驗證

看到這些字,就想到這個

題目出現的關鍵字想到
「測試分數極高,上線後很差」資料洩漏(或訓練與上線不一致)
「AUC 0.99」「準確率接近 100%」先懷疑資料洩漏
「有時間順序的資料」「預測未來」照時間切,BigQuery ML 用 SEQ、AutoML 用時間欄位
「某個欄位要等結果出來才有」標籤洩漏,拿掉該特徵
「標準化、正規化、填補遺失值」先切再算,只用訓練集的統計值
「確保訓練和預測的前處理一致」BigQuery ML 的 TRANSFORM
「同時要調超參數又要估計實力」「資料很少」巢狀交叉驗證
「取回某個時間點當下的特徵值」Feature Store 的歷史特徵(時間點正確)

三個常見陷阱

  1. 以為隨機切最公平:有時間順序的資料,隨機切就是在偷看未來
  2. 把「跟答案超相關」的特徵當寶:相關到不合理,通常是答案的分身
  3. 看到分數低才檢查,分數高就不檢查:資料洩漏讓分數變高,所以分數異常好時更要檢查

練習情境(自己出的練習,不是真實考題)

一家電信公司要預測「下個月哪些用戶會解約」。資料科學家用 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 取回時間點當下的特徵值

延伸閱讀

本系列

站上相關文章


資料洩漏最可怕的地方,是它會讓你對一個不能用的模型充滿信心。養成「每個特徵都問一句:預測那一刻拿得到嗎?」的習慣,就能避開大部分的坑。如果你想有系統地從雲端基礎一路學到在 GCP 上動手做機器學習,可以看看東東的 GCP 課程,或加 LINE 聊聊你現在的狀況,一起找出最適合你的學習順序。

返回頂端