⏳ 時間序列切分:別用明天推今天

時序資料「隨機切分」=訓練集偷看未來,離線分數虛高、上線見光死。切換三種切法,親眼看洩漏怎麼發生、Walk-Forward 滾動窗怎麼做才對。

💡 白話定義

時間序列的相鄰日子高度相似(今天營收≈昨天營收)。若把 3 年資料隨機打散切訓練/測試,訓練集裡會混進「測試日的隔壁天、甚至更晚的日子」——模型等於先看過答案的鄰居,這叫時間洩漏。正確做法:訓練永遠在測試之前(依時間切分),更嚴謹用 Walk-Forward(滾動窗):視窗一路往前滾、每輪都「用過去訓練、對未來驗證」。

🎮 互動實驗:60 天的資料怎麼切?

訓練日 測試日 ⚡ 洩漏:訓練日晚於某測試日
離線評估(看起來): 上線實測(實際上):
隨機切分中:黃色⚡的訓練日都「晚於」某些測試日——模型正在偷看未來。

🧠 三種切法一句話

隨機切分:適合「彼此獨立」的資料(一人一筆的表格);時序用它=洩漏。
依時間切分:最後一段當測試(如最後 12 天)——最貼近上線情境的單次評估。
Walk-Forward/TimeSeriesSplit:多輪滾動——第 1 輪用 Day1–24 訓練、Day25–36 驗證;第 2 輪擴到 Day1–36 訓練、Day37–48 驗證……每輪都只用過去推未來,評估既穩又無偏。

✅ 自我檢測

Q1:門市營收預測隨機切 80/20,測試 MAPE 極佳、上線大爆炸——為什麼?

隨機切分讓訓練集混入測試日附近(甚至更晚)的資料,模型間接「看過答案的鄰居」;上線時沒有未來可看,效能現形。

Q2:時序資料的交叉驗證該用什麼?

TimeSeriesSplit/Walk-Forward 滾動窗:訓練期永遠早於驗證期。不能用隨機 K-fold,也不是 StratifiedKFold 的事。

Q3:「未來 30 天信用卡盜刷預測」該怎麼留測試集?

依時間切:以最後一段期間(如最近 3 個月)作測試集,並確保特徵在「預測時點」都拿得到(無事後欄位)。

🎯 重點整理

① 時序+隨機切分=時間洩漏:離線虛高、上線崩盤。
② 鐵律:訓練永遠在測試之前;多輪評估用 Walk-Forward 滾動窗。
③ sklearn 對應:TimeSeriesSplit(不是 KFold、不是 stratify)。
④ 同場加映:特徵也要「時點正確」——預測當下拿不到的欄位(事後資訊)不能用。