Data leakage (or leakage)一般有兩大類:
Target leakage 和 Train-Test Contamination.
Target leakage
這裡舉一個例子說明。
這裡有一個是否有接受抗生素的變數,這個變數基本上和是否有肺病是高度相關的。因此這邊你只要用這個變數放入X,你的訓練結果都會有好。
問題是,你真正把模型拿去用的時候,你不會有這種變數,更容易是有人肺病,才會去把抗生素。一個作法是,不要拿目標變數生成後的相關變數,這個相關變數會leakage預測結果,而且你實際使用時,你不會有這種事後的變數。
Train-Test Contamination
這種發生在,進行前處理時,把要驗證的資料也一起進行前處理了。這樣你要驗證的資料和訓練資料都會獲得很好的預測,但是你實際在生產時的環境,那些資料不會被前處理,預測就會很糟糕了。這聽起來很蠢,可是當前處理的程序變的複雜,還是會發生的。
範例
這個例子,我們會示範偵測leakage和移除
如果要跑起來,要進入Kaggle, 載入新資料 AER Credit card
我們用這個資料來預測是否可以收請信用卡。
載入資料
準備資料
因為是小型資料,我們會跑Cross validation
根據經驗呢?第一次用一個基本模型跑就那麼高,怪怪的,我們來確認一下資料。
因為是示範目的,這邊作者直接挑出有問題的expenditure變數,並進一步調查。
實際上,會建議去還是一定要做一個基本程度的EDA分析,看看相關性,瞭解每一個變數的意義等。
以這個例子來說,作者分析後發現,
沒卡的人且沒消費的比例,100%。
有卡但沒消費的,2%。
這個消費大概就是收到卡後的消費。有卡才會消費,所以有卡沒消費的比例很低,而沒有卡當然無法消費,所以比例100%,
因此,這個變數基本上就是申請卡之後才有的。拿這個去預測是否有沒有卡,這就是一個典型Target leakage的例子。
接著,這邊作者也砍掉active 和 majorcard, 這兩個變數。因為無法確認是什麼意思。心態上,小心比建立一個錯誤的模型好。
總結
Data leakage可以是一個multi-million dollar mistake。意思就是,搞半天,模型在生產後無法用,這是很成本很高的失敗,千萬要小心。
- 探索變數非常重要
- 對變數之間的關係、預測結果等有基本常識,當然也是需要經驗。
- 小心的進行前處理,以避免驗證與訓練資料集的混用。
程式碼可以看這邊。