轉自:https://towardsdatascience.com/avoid-data-leakage-split-your-data-before-processing-a7f172632b00
https://towardsdatascience.com/data-splitting-for-model-evaluation-d9545cd04a99
1.數據泄露
數據泄漏是指訓練數據集和測試數據集之間偶然的信息共享。 這種信息共享將給模型一個關於測試數據集的“提示”,並生成看起來最優的評估分數。 然而,由於模型對測試數據擬合過度,無法准確預測未來未見數據集。
一個比較常見的數據泄露的原因:在數據預處理后才進行訓練-測試集的划分。
2.例子
給出由於在數據預處理后才進行訓練-測試集的划分,導致數據泄露給測試集的問題。
針對上述訓練集,由列1和列2預測target, 如果先對列進行預處理:
列1中Y的值是通過其中有多少個為1的target來替換,即4/6=0.67;列2是按字母順序編碼。
將前7個樣本作為訓練集,后3個作為測試集,但是從測試集中來看,它能夠期望,2個Y,並且其中有一個target為1,這將導致對模型性能的期望過於樂觀。
類似地,對於步驟2,第5行的字母' e '被編碼為5,因為它理解完整數據集有' a ', ' b ', ' c '和' d '。 這種信息也會在訓練和測試數據之間泄露。
2.1解決辦法
在預處理之前將數據集划分,這樣test集以及未見過的數據都會一視同仁地被處理。
先划分:
再預處理:
這樣做的好處是:
- 降低數據泄露風險
- 未來看不見的數據將以與測試數據完全相同的方式處理,從而確保模型性能的一致性。
3.隨機划分數據集存在的問題
3.1 不平衡數據集
如果我們隨機分割一個包含99%負類和1%正類的數據集,會出現什么問題?
可以通過scikit-learn’s train_test_split()進行分層采樣。
3.2 小數據集(有限的數據集)
使用k折交叉驗證。
3.3 特征工程泄露
也就是上述提到的例子。
3.4 組泄露Group Leakage
主要是針對train和test中有同個人的樣本overlap的情況。
3.5 時序泄露
比如在預測出售的房價時,如果針對數據集隨即划分,那么就忽略了時間的因素,可能會導致模型表現比期望更好。