跳至主要內容

    訓練、驗證與測試:資料洩漏怎樣騙過你?

    把切分方式對準實際使用情境,分清模型學習、調整與最後評估,找出分數過好的原因

    sunny 桑尼· · 14 MIN READ · 85 次瀏覽

    訓練、驗證與測試:資料洩漏怎樣騙過你?
    本文目錄

    模型拿到新訂單,能不能做出可靠預測?要回答這個問題,不能只看它對已經學過的資料猜得多準。

    更麻煩的是,你可能確實把資料分成兩份,分數仍然過度樂觀:同一個人的相近紀錄分到兩邊、填補平均值時先看過所有資料,或把訂單完成後才知道的資訊當成輸入。程式照樣能執行,評估卻已經失去原本要測的能力。

    這篇先分清訓練、驗證與測試的用途,再沿著不同切分圖判斷:我們究竟在模擬哪一種「沒看過」?本文情境與表格都是教學設定,來源圖是原教材的示意與合成資料,不是本站模型實驗。

    先問:上線時遇到的是哪一種新資料?

    「新訂單」可能是熟客的下一筆訂單、新顧客的第一筆訂單,也可能是下個月、新城市或不同資料系統的訂單。它們不是同一種泛化問題。

    如果服務一直在同一批顧客中運作,過去顧客資訊可能是合法輸入;若要證明能服務完全沒見過的新顧客,就不能讓同一顧客的其他紀錄提前出現在訓練裡。切分方式需要反映你想做出的能力主張。

    因此,開始前先寫一句:「使用截至某時點可得的資訊,預測哪些對象、哪個未來結果。」這句話會決定切分單位、時間邊界與可用欄位。

    訓練、驗證、測試,各自影響哪些決定?

    訓練資料用來擬合模型參數;驗證資料用來比較方案,例如模型種類、特徵、超參數與停止時機;測試資料則保留到方案選定後,評估整套流程對新資料的表現。

    圖1|兩份資料可以隔開參數擬合與評估,但若每次看完測試結果都回頭調整,測試集就開始參與選擇。來源:Google,Dividing the original dataset,CC BY 4.0,原圖未改。
    圖2|增加驗證角色,讓開發過程的比較有固定位置。圖中的比例是示意,沒有規定所有問題都用相同比例。來源同圖1,原圖未改。

    資料多時,可以固定留出一份驗證集;資料較少時,也可以在開發資料內輪流切分做交叉驗證。核心是分工清楚,不是每個專案都必須建立三個同名檔案。

    圖3|驗證結果可以影響開發決定,最後保留測試則用來評估已選定的方案。把低分測試集換掉再報高分,不會改善驗證的可信度。來源同圖1,原圖未改。

    測試後若發現重大問題,當然可以修正;只是原測試結果已影響新版本,不能再把同一份資料當成完全未碰過的最終證據。應保留版本與變更紀錄,並在可行時用新的保留資料評估。

    K-fold:輪流保留一折,不是每輪都訓練同一個模型

    K-fold把開發資料分成K份。每一輪用其中一份評估,剩下的份數訓練;換到下一輪時,重新擬合模型與需要學習的前處理,再彙總各輪分數。

    圖4|每列是一輪切分,藍色為訓練、紅色為該輪保留評估;下方class與group列顯示原合成資料的類別和群組。這張KFold使用預設不打亂順序,因此紅色是一段一段移動。來源:scikit-learn developers,Visualizing cross-validation behavior,BSD 3-Clause,完整聲明見文末;原圖未改。

    本篇CV圖例的「Testing set」是該輪保留折。當它用來調整模型時,功能上是驗證資料,不是最後獨立測試集。 套件或文章使用test這個字,不會自動替它建立獨立性。

    KFold本身不會替你檢查時間與群組。打亂可以改變切分分布,但不能解決同一個人跨兩邊、重複樣本跨兩邊,或未來資訊回流的問題。

    分層:顧到類別比例,仍沒有顧到人或時間

    如果延遲訂單很少,任意切分可能讓某一折幾乎沒有延遲案例,指標難以比較。分層切分會嘗試在各折保留接近整體的類別比例。

    圖5|紅色分布在各個類別區段,顯示類別比例受到照顧;但它不會因此限制同一group只能出現在一邊。來源同圖4,原圖未改。

    分層不能創造少數類別樣本。若只有幾筆正例,分再多折也不會讓每折都有充足證據。它還可能讓不同折的比例更相似,因此折間分數較穩,不應把這種穩定當成所有實際情境的不確定性都變小。

    群組切分:把同一個對象的相關紀錄留在同一邊

    假設每位顧客各有兩筆資料:

    顧客訓練資料保留評估資料正在評估什麼?
    A、B、C都跨兩邊各自第一筆各自第二筆可能是已見顧客的另一筆紀錄;時間仍需另外確認
    A、B只在訓練,C只在保留A與B的全部紀錄C的全部紀錄對未見過顧客的泛化

    第二種問題需要以顧客為群組切分,不能單純按資料列隨機分配。醫療影像中的同一病人、感測資料中的同一設備、同一原圖裁出的多個片段,都有類似需求。

    圖6|對照最下方group色帶看,同一群組在某輪不會一部分紅、一部分藍;但class比例不一定平衡。來源同圖4,原圖未改。
    圖7|群組分離是約束,再盡量讓類別比例接近;群組大小或類別組成差異大時,未必能同時做到完美平衡。來源同圖4,原圖未改。

    群組定義也需要對準使用情境。按顧客切分可以限制顧客重疊,卻不能保證不同顧客的紀錄沒有共同的促銷事件或時間相關性。若同時要模擬未見顧客與未來月份,就要一起處理兩種限制,而不是從幾個splitter中挑一個就算完成。

    時間切分:先有過去,才有未來

    預測下個月時,應模擬只能使用當時已知資訊。例如先用1–6月訓練、7月驗證、8月測試;這是切分角色示例,不是通用的月份比例。

    圖8|藍色訓練範圍逐漸擴大,紅色保留區塊永遠在它後面;沒有用未來訓練、回頭預測過去。橫軸是已排序的樣本索引,不是自動理解日期的日曆。來源同圖4,原圖未改。

    使用時間切分前,要先按時間整理資料。資料不等間隔時,同樣筆數的測試折可能跨越不同長度的期間,不能只看折數就認為可比較。

    還需要檢查標籤可得時間。若一筆訂單在6月底建立,配送結果到7月才完整可得,模擬6月底訓練時不能偷用這個答案。滾動統計、跨期視窗與延遲標籤可能需要額外間隔或排除重疊;單純排好日期不會自動解決。

    也沒有哪個固定間隔能消除所有洩漏。應依特徵回看範圍、標籤觀察窗與真實更新節奏決定,再確認不同折之間到底共享了什麼。

    三條常見洩漏路徑:答案、前處理與紀錄重疊

    第一條是輸入帶到答案。例如下單時預測延遲,卻使用實際完成時間、最後退款狀態或事後產生的「配送異常已結案」欄。即使切分比例正確,資料也不符合預測時點。

    第二條是前處理先看過保留資料。例如在所有資料上估計平均值、縮放參數、PCA方向或依標籤挑特徵,才切成訓練與測試。保留資料的分布或答案已影響輸入流程。

    正確的順序是先切分,在該輪訓練資料上 fit,再對保留資料 transform。驗證、測試與上線套用的是同一組已擬合參數,不是每一份資料各自重新擬合。Pipeline可以固定這個順序,但不會替你修復錯誤時間欄位或群組。

    第三條是同一筆、近似複本或高度相關片段分到兩邊。應依來源識別碼與業務定義處理,必要時把相關樣本當群組一起切;不要看到測試分數不好,才刪掉難題,也不要只因特徵值相同,就把不同的真實觀察當重複資料。

    調整與最終評估要分開,交叉驗證也會被過度使用

    圖9|先在開發資料中選擇設定,再用選定方案重訓,最後接上獨立測試。這張圖中的「參數選擇」包含前處理與模型超參數的比較,不只一個學習率。來源:scikit-learn developers,Cross-validation,BSD 3-Clause,原圖未改。
    圖10|下方五輪只在原本訓練部分輪替;右下的最終測試沒有拿來挑參數。這是流程示意,本文沒有藉此產生五折模型分數。來源同圖9,BSD 3-Clause,原圖未改。

    試的方案越多,越可能挑中剛好適合目前驗證資料的設定。交叉驗證可以減少依賴某一次切分,不能讓無限次試驗都保持獨立。需要時可使用巢狀交叉驗證:內層選方案,外層評估整個選擇過程;計算成本也會增加。

    最後的測試集仍只代表它涵蓋的對象與期間。模型在舊城市表現好,不等於新城市一樣好;上線後資料與流程變動,還要持續監控。評估可信的意思是清楚知道它測了什麼,而不是永遠保證未來。

    報分數時,把切分設計一起交代

    一個可檢查的結果應包含預測時點、樣本單位、時間範圍、群組規則、訓練/驗證/測試用途、前處理擬合範圍,以及模型選擇是否看過最後測試。還要知道少數類別與重要子群在評估中有多少樣本。

    「隨機切80/20、準確率很高」不足以說明上述問題。如果切分模擬的情境和真正使用不同,漂亮的分數也可能只回答了一個比較容易的問題。

    下一篇會進一步拆開準確率、Precision、Recall與閾值。但在比較指標之前,先確認它們建立在正確的保留資料上;換一個指標,救不了已洩漏的評估。

    來源與圖像授權

    本文顧客表與月份安排為獨立教學情境,沒有宣稱完成真實上線成效或特定分數的驗證。

    圖像授權聲明

    以下保留scikit-learn原圖完整BSD聲明;原作者沒有為本站背書。

    BSD 3-Clause License
    
    Copyright (c) 2007-2026 The scikit-learn developers.
    All rights reserved.
    
    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions are met:
    
    * Redistributions of source code must retain the above copyright notice, this
      list of conditions and the following disclaimer.
    
    * Redistributions in binary form must reproduce the above copyright notice,
      this list of conditions and the following disclaimer in the documentation
      and/or other materials provided with the distribution.
    
    * Neither the name of the copyright holder nor the names of its
      contributors may be used to endorse or promote products derived from
      this software without specific prior written permission.
    
    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
    AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
    DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
    FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
    SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
    CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
    OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    

    封面沿用本篇已註明來源的配圖,僅等比縮放並加白邊以保留全圖;圖片原有的署名與授權條件同樣適用於封面版本。

    留言0

    登入後就能留言。

    登入
    sunny 桑尼
    sunny 桑尼

    AI 資料科學 · 產品經理 · 蒙奇 D 桑尼

    專注於 AI 工具應用與資料科學教育,致力於讓每個人都能用 AI 提升工作效率。曾任職於科技業,現為全職教育創作者。

    讀更多文章 →想自己動手試?領免費 Starter Kit →