資料集切分:隨機切分什麼時候會騙你
隨機切分很方便,但在有時間性或群組性的資料上會造成嚴重高估。
隨機把資料切成訓練與測試,是最直覺的做法,也是最容易造成分數虛高的做法。
三種需要特殊切法的情況
- 時間序列:未來資料不能出現在訓練集。要用時間切分,訓練用舊資料、測試用新資料。
- 同一群組多筆:同一位使用者、同一份文件產生的多筆樣本,必須整組落在同一邊。
- 類別極不平衡:要用分層切分,確保每一邊都有罕見類別。
from sklearn.model_selection import GroupShuffleSplit
# 依 doc_id 分組,同一份文件的片段不會跨越訓練與測試
splitter = GroupShuffleSplit(test_size=0.2, n_splits=1, random_state=42)
train_idx, test_idx = next(splitter.split(X, y, groups=doc_ids))時間切分要留間隔
用時間切分時,訓練集結尾與測試集開頭之間留一段空白(例如一週)。緊鄰的資料往往高度相關,留間隔能讓評測更貼近真實部署情境。
怎麼確認切錯了
症狀是:測試分數很高,但上線後明顯變差。此時檢查兩件事——測試集是否與訓練集有近似重複、以及測試樣本的時間是否早於訓練樣本。
切分的隨機種子與切法要寫進資料集的 metadata。分數無法重現時,切分方式是第一個要查的地方。