示範案例:用方法論完整打一場鐵達尼
六階段端到端示範 + 七場實戰掃描總表。基調不是「拿高分」,是方法論如何得到誠實的數字,並預測到自己的 CV−LB 差距。
本頁內容
戰績總覽
同一套方法論、全部零調參的簡單模型,在 8 場真實 Kaggle 比賽上完賽(6 種任務型態、2 種賽制):
- 交叉驗證(CV)誠實:同分布的場次,內部分數與真實排行榜落差 ≤0.002——落差不是運氣,是診斷的函數。
- 前 30% ×2:spaceship 22.9%、house-prices 29.6%,靠的是紀律不是火力。
- 私榜無跳水:s6e8 用 CV 選的提交,私榜揭曉 private≈public(差 ±0.00005)。
想直接看數字 → 七場掃描總表;想看方法論怎麼完整走一遍一場,就從下面這場鐵達尼開始。
鐵達尼(訓練池 n=623)是小樣本題,重點不在分數高,在方法論如何得到一個誠實的數字——而且它預測到了自己在真實排行榜上的衰減。全程只看 CV,最後才由 holdout 與真實 Kaggle 排行榜(LB)揭曉。腳本:case_titanic_v2.py、submit_titanic.py。
階段 0|讀題與五問診斷
模態=表格、任務=二分類、指標=Accuracy(需在折外預測(OOF)上搜最佳閾值)、test 切法=隨機、賽制=prediction。小資料警報:n=623 → 交叉驗證(CV)噪音大 → 用 RepeatedStratifiedKFold(10 折 × 5 重複)。真實鐵達尼排行榜(LB) > 0.85 多為查史料作弊,誠實天花板約 0.83。
階段 1|鎖死 CV + 基線
在同一組折上鎖死驗證,所有實驗共用 fold/seed,折外預測(OOF)才可比較、可整合。性別規則基準交叉驗證(CV)≈0.79。
階段 3|特徵迭代——配對 AUC 檢定,不是均值門檻
小樣本一次一組特徵,在同一組折上算配對差、做配對 t 檢定(t>2 才保留)。跨 20 次切分:
- Title、family、cabin 都只在 1/20 切分達 t>2 ——單看一次切分(如著名的 seed 42:Title t=2.22、family t=2.83)會把噪音當訊號。
- 票團目標編碼有害是鐵板結論:配對 t 中位數 −9.98、0/20 被保留。
階段 2+4|多樣化模型 → OOF 池 → 防過擬合爬山集成
鋪開 lgbm / logreg / extratrees / knn 四個家族,用 Caruana 爬山(前 2 名初始化 + 可重複選取)組集成。關鍵:單模與集成用同一種量評估(折模型平均折外預測(OOF)+ 同一套閾值),否則差距裡混的是評估不對等,不是真實差異。
階段 5|兩份提交 → 揭曉
| 提交 | CV(交叉驗證) | holdout | public LB(排行榜) |
|---|---|---|---|
| CV 最佳單模 (lgbm) | 0.8373 | 0.828 | 0.7488 |
| 穩健集成 (lgbm+knn) | 0.8373 | 0.829 | 0.7727最佳 |
| 案例 | 任務 | CV(交叉驗證) | holdout | CV−holdout 差 |
|---|---|---|---|---|
| breast_cancer | 二分類 | Acc 0.986 | 0.986 | 0.0001 |
| diabetes | 迴歸 | RMSE 56.2 | 53.1 | 3.1 |
| digits | 多分類(10) | Acc 0.970 | 0.969 | 0.0007 |
真的送上 Kaggle 官方 test 後:交叉驗證(CV) 0.8373 → public 排行榜(LB) 單模 0.7488 / 集成 0.7727。內部驗證對真實 LB 系統性樂觀 0.06~0.09——這不是 bug,是方法論一直警告的事:真實 test 是全新的 418 人、與你從 train 切出來的 holdout 不同分布。把 holdout 當上限、預期上線衰減。而穩健集成在真實 LB 反而高於 CV 最佳單模,雙提交的保險當場兌現。
改用 §3.3 的折模型平均後,單模與集成的 CV−私榜差都落在 +0.005~+0.008——CV 是誠實的,是評估不對等在說謊。
自己動手
不要照抄這頁的數字——case_titanic_v2.py 可下載,自己跑一次看 20 次切分的分布;submit_titanic.py 產出兩份提交。
pip install -r validation/requirements.txt
python validation/fetch_data.py # 下載 Titanic 資料(sha256 校驗)
python validation/case_titanic_v2.py # 20 次切分,親眼看單模≈集成
換一場你自己的比賽,把這六階段重走一遍——這才是學會。
七場實戰掃描(2026-08,同一套 harness、全部簡單模型)
用同一套方法論掃完六種任務型態、兩種賽制(prediction + code);其中兩場以零調參簡單模型進入前 30%(spaceship 22.9%、house 29.6%)——每場零調參、零深度學習、零預訓練,分數全靠流程紀律。每列可重跑(腳本在括號):
| 比賽 | 型態 | CV(OOF) | Public LB | CV→LB |
|---|---|---|---|---|
titanic(case_titanic_v2) | 小樣本二分類 | 0.8373 | 0.7727 | −0.065(異分布,§16.8) |
s6e8(case_s6e8) | 大表格二分類 69 萬列 | 0.96285 | 0.96414 →私榜 0.96417 | 無跳水 |
spaceship(case_spaceship) | 表格二分類 | 0.8057(Acc) | 0.80406 | −0.0017 |
house-prices(case_houseprices) | 小樣本迴歸 | 0.1326(RMSE log) | 0.12749 | 更優 |
nlp-tweets(case_nlp) | 文字 F1 | 0.7682 | 0.79619 | +0.028(test 偏易) |
digit(case_digit) | 多分類像素 | 0.9776 | 0.97660 | −0.0010 |
store-sales(case_storesales) | 時序 1782 條 | 0.4007(RMSLE) | 0.51465 | 時序衰減(C1b) |
watson(case_watson) | 多語言 NLI(code 賽) | 0.4630(Acc) | 0.41520 | 見結論 4 |
三個框架級結論,全部雙向驗證:
- 交叉驗證(CV)誠實度可預測:對抗驗證說同分布的場次(s6e8/spaceship/digit),CV→排行榜(LB) 落差 ≤0.002;異分布(titanic)與時序(store-sales)如 C1b 預測地衰減——落差不是運氣,是診斷的函數。
- C3 前提雙向兌現:成員懸殊(s6e8)無集成紅利;成員相近(spaceship/nlp)紅利出現。
- 配對檢定是特徵決策的守門員:s6e8 五組候選攔下四組負 t 噪音;比值特徵兩場連勝(t+8.99 / t+4.38)。
- 同模型對照:方法論本身值多少分(
naive_vs_method.py,裸版=同一顆模型拔掉方法論決策,真提交對照):watson +0.161(切法+特徵身分)、spaceship +0.019(配對特徵+搜閾值)、house log1p 省 0.0033 均方根誤差(RMSE)、s6e8 +0.0002(裸基線已對齊時貢獻趨零)、nlp −0.003(誠實反例:test 分布怪異時折外預測(OOF)搜的閾值不保證轉移,差距在噪音內)。結論:結構越複雜的題,方法論越值錢;結構已對齊的題,它的價值是「確認你沒做錯」。 - 私榜終審:CV 引導的選擇沒有跳水(s6e8,2026-08-31 揭曉)。比賽期間只看得到 public 榜(一小部分測試資料),結束才用剩下的資料算 private 榜——很多人在這裡名次大洗牌。我們四筆提交全部 private ≈ public(差 ±0.00005),排序也沒變。這是 C7a「迭代決策一律用 CV、不追 public 榜」的最終驗收:比賽結束時才知道自己有沒有騙自己,而我們沒有。
- CV 異常是可診斷的訊號,不是壞運氣(watson 三回合):隨機切 OOF 0.287 低於隨機 → 抓出 premise 群組結構;改 GroupKFold 後 CV 0.400 卻 LB 0.254 → C7b 脫鉤警訊 → 診斷出「test 與 train 共享 52% premise 且為異標籤,全量訓練把 premise 背反了」;特徵去除 premise 身分 → CV 0.463、LB 0.415,+0.161 全額兌現。兩次異常、兩次診斷、兩次修復——這就是方法論。