模型正規化要先分還是先算?
資料科學團隊在模型訓練前,需對數值特徵進行正規化(Normalization)或標準化(Standardization)。為確保模型評估結果具真實性並避免資料洩漏(Data Leakage),下列何者為最適當的作法?
資料科學團隊在模型訓練前,需要對數值特徵進行正規化(Normalization)或標準化(Standardization)。他們的目標是確保模型評估結果具真實性,並避免資料洩漏(Data Leakage)。
問你:下列哪種做法最適當?
一句話總結
正規化的正確步驟:先分割訓練集和測試集,再用訓練集計算統計量,最後把同一組統計量套用到測試集。讓測試集的統計量影響訓練就是資料洩漏。
先感受問題:考試前偷看考題,成績算不算數?
假設你是「智評教育」的資料工程師,正在建立學生成績預測模型。資料集裡有學生的各科成績(數值差異很大,數學 0-100 分,作文字數 0-3000 字),你需要做正規化讓所有特徵在相同尺度上。
你準備了 8000 筆訓練資料和 2000 筆測試資料。問題:「我要拿哪些資料計算正規化的參數(平均值、標準差)?」
這個問題的核心邏輯是:測試集模擬的是「未來要遇到的新數據」,如果計算統計量時把測試集也算進去,就等於考試前偷看了考題,成績不能反映真實能力。這就是資料洩漏(Data Leakage)。
三種錯誤做法,每個都有不同的問題
「智評教育」的工程師曾嘗試過以下錯誤方式:
- 分割前就算(選項 A 的問題):把全部 10000 筆資料一起算平均值和標準差,然後才分割。測試集的統計資訊已經「洩漏」進了訓練流程,評估結果過於樂觀
- 訓練測試各自算(選項 B 的問題):訓練集用訓練集的統計量,測試集用測試集的統計量。問題是:實際上線後你不知道未來數據的統計量,而且兩份資料用不同的縮放標準,模型學的尺度和預測的尺度不一致
- 只處理訓練集(選項 D 的問題):訓練集做了標準化,測試集保持原始數值。訓練時數學成績是 0-1 的標準化值,測試時卻是 0-100 的原始值,模型看到的「語言」完全不同,預測結果毫無意義
- 忘記記錄統計量:處理完訓練集後忘了存下平均值和標準差,之後無法用同一組參數轉換新數據
- 驗證集也忘了處理:只處理了訓練集和測試集,忘記驗證集(validation set)也要套用訓練集的統計量,不能另算
正確的正規化流程,三步搞定
「智評教育」建立了標準作業流程:
第一步:先分割。把 10000 筆資料分成訓練集(8000 筆)和測試集(2000 筆)。分割之後,訓練集和測試集就不能再互相「看到」對方了。
第二步:只用訓練集算統計量。用 8000 筆訓練資料計算每個特徵的平均值和標準差(或最大最小值)。這組統計量「代表」模型訓練時所認識的世界,要儲存起來備用。
第三步:用同一組統計量套用到測試集。用第二步算出的訓練集統計量,對 2000 筆測試資料做同樣的轉換。測試資料在模型眼裡用的是「同一把尺」,評估才有意義。
正式上線後,新來的每一筆預測數據,也要套用這同一組訓練集統計量,確保生產環境和訓練環境尺度一致。
這就是選項 C 正確的原因:先分割,僅以訓練資料計算統計量,再套用至測試資料。
技術版:資料洩漏的常見形式與預防
資料洩漏(Data Leakage)是機器學習中最容易犯但後果嚴重的錯誤之一。它讓模型在訓練或評估過程中接觸到「現實中不應存在的信息」。
正規化/標準化中的洩漏(本題考點):在分割前就用全部數據算統計量,等於讓訓練集「看到」測試集的分佈信息。模型評估時表現很好,但部署後遇到真實新數據表現就下降(泛化能力被高估)。
其他常見洩漏形式:
- 時間序列洩漏:用未來的資料預測過去(例如:用 2025 年資料訓練,卻用 2024 年資料測試,但測試集的時序早於訓練集)
- 目標洩漏:特徵中包含直接推導自標籤的資訊(例如:預測「是否住院」的模型特徵裡包含「住院天數」)
- 分組洩漏:同一個用戶的數據同時出現在訓練集和測試集(應該按用戶分割,不是按記錄分割)
正規化 vs. 標準化的區別:正規化(Normalization)通常指 Min-Max 縮放到 [0,1];標準化(Standardization)指 Z-score 轉換(減平均除標準差)。兩者的洩漏防範原則相同:只用訓練集計算參數。
為什麼出題者要考這題:資料前處理的正確順序是 AI 應用規劃師的基本能力,混淆了分割前後的操作順序,會讓整個模型評估流程失效,是系統設計中的嚴重錯誤。
為什麼其他選項是錯的
A於資料分割前,先對完整資料集計算統計量並進行標準化處理
先對所有資料(包含訓練集和測試集)一起計算均值和標準差,標準化完成後再分割。
這是最典型的資料洩漏。計算統計量時納入了測試集,意味著訓練過程間接「看到」了測試集的數據分佈。最終評估結果會比實際好看,模型部署後表現會下降。
「先把數據整理乾淨再分割感覺比較合理」的初學者。這個直覺錯了:分割必須發生在任何基於標籤或統計量的操作之前。
B先分割訓練資料和測試資料,並各自獨立計算統計量後進行標準化
分割後,訓練集用自己的均值標準差,測試集用自己的均值標準差,互不干涉。
訓練集和測試集用了不同的縮放標準,兩者的「語言」不一致。模型在訓練集學的數值分佈,跟測試集送進去的數值分佈不同,就像用台斤訓練後,測試時改用公斤,比較結果失去意義。
以為「各自獨立才不會洩漏」的人。洩漏問題是「訓練集看到測試集信息」,B 確實沒有洩漏,但它造成了另一個更嚴重的問題:縮放標準不一致。
D僅對訓練資料進行標準化處理,測試資料保持原始數值
訓練集做了標準化,但測試集保留原始數值,不做任何轉換。
訓練時模型看到的是標準化後的數值(如 0-1 或 z-score),測試時看到的是原始數值(如 0-100),尺度完全不同,預測結果毫無意義。測試集和未來新數據都必須套用同一組統計量做轉換。
認為「只要訓練集標準化就夠了,測試集保持原始比較公平」的人。實際上兩邊尺度一致才是公平的,不一致反而讓評估完全失真。
同個考點下次怎麼變形
正規化(Normalization)和標準化(Standardization)有什麼不同?
這兩個詞常常交替使用,但意思一樣嗎?
正規化(Min-Max Normalization)把數值縮放到固定範圍(通常 0-1),公式是 (x-min)/(max-min),對離群值敏感。標準化(Z-score Standardization)把數值轉成均值為 0、標準差為 1 的分佈,公式是 (x-mean)/std,對離群值更穩健。兩者的洩漏防範原則相同:只用訓練集的參數。
交叉驗證(Cross-validation)中,正規化應該怎麼做才不會洩漏?
交叉驗證有多折,正規化參數怎麼計算?
每一折都要重新用「當前這折的訓練部分」計算統計量,再套用到「當前這折的驗證部分」。不能用所有折的數據一起算統計量。正確做法通常是在交叉驗證的 Pipeline 裡包含前處理步驟,確保每折的統計量計算和應用邏輯一致。
部署上線後,新的預測請求應該用什麼統計量做正規化?
模型訓練好部署了,用戶送來新數據要怎麼處理?
必須用當時訓練時計算的那組統計量(訓練集的均值和標準差),不能重新計算。這組統計量要隨模型一起儲存和部署,確保生產環境的轉換邏輯與訓練時完全相同。這也是為什麼資料前處理步驟要存成 Pipeline 或 Scaler 物件。
什麼情況下不需要做正規化?
所有模型都需要正規化嗎?
基於距離或梯度的模型(KNN、SVM、神經網路、線性迴歸)對特徵尺度敏感,需要正規化。決策樹、隨機森林等基於規則分裂的模型對特徵尺度不敏感,不需要正規化。但做了正規化也不會讓這類模型變差,只是多此一舉。
資料洩漏的最常見後果是什麼?
資料洩漏很嚴重,但實際後果是什麼?
最常見後果:模型在測試集評估時表現很好,但部署到生產環境後性能大幅下降。這個差距(gap)讓團隊花很多時間調試模型,最後才發現根本原因是訓練流程的洩漏。越早在資料流程中防範洩漏,越能避免後期昂貴的調試成本。
想再往下看,這 5 個
- 正規化(Normalization)Min-Max 縮放到 [0,1] 範圍,計算最大最小值時只能用訓練集,避免測試集資訊洩入
- 訓練集(Training Set)模型學習的數據集,正規化與標準化的統計量必須只從訓練集計算,再套用到測試集
- 交叉驗證(Cross-Validation)把數據切成多折輪流做訓練與驗證,同樣需在每折內部獨立計算正規化統計量以防洩漏
- 特徵縮放(Feature Scaling)正規化與標準化的統稱,讓不同量級的特徵處於可比較的範圍,加速梯度下降收斂
- 資料管線(Data Pipeline)將前處理與模型訓練封裝為一體,確保每次預測時的統計量來源一致,有效預防資料洩漏