你可能過於高估了機器學習算法能力,帶你解讀不爲人知的數據泄露問題

本文是《機器學習寶典》第 6 篇,讀完本文你可以掌握機器學習中數據泄露問題。算法


讀完分類與迴歸算法的評估指標排序算法的評估指標以及機器學習模型的離線評估方法以後,你已經知道了在機器學習中的該使用什麼指標來評估模型以及使用什麼方法來評估模型,可是在現實生活中評估模型時常常會遇到一個問題:數據泄露(data leakage),這裏咱們來對數據泄露作一個解讀。session

什麼是數據泄露

先舉個貼近生活的例子,你做爲一名優秀的算法工程師,你的志向是去經過機器學習算法解決生活中的不少實際問題。在解決一個二分類問題時,你爲了充分使用數據集,使用交叉驗證的方法,訓練了一個模型,發現它在測試集上的AUC指標 0.99,這時你內心美滋滋地想着:開發出了這麼牛逼的模型,今年的年終獎應該能拿到手軟了吧。緊接着系統工程師將這個模型進行工程化,部署到生產環境中,開始真正解決實際的業務問題。當你正在給同事吹噓模型多麼牛逼,多麼吊炸天的時候,模型在生產環境中的效果表現數據出來了,你看完後,頓時雙腿一軟,要不是同事扶着你,你直接癱倒在地。app

出現上面這種模型在離線評估時效果好,線上效果很差的緣由有不少種,其中有一個常常會碰到的緣由是:數據泄露(data leakage),有時也叫作泄露、穿越等。它說的是用於訓練機器學習算法的數據集中包含了一些將要預測的事務的東西(when the data you are using to train a machine learning algorithm happens to have the information you are trying to predict),也就是說測試數據中的一些信息泄露到了訓練集中。這裏說的信息是指關於目標標籤或者在訓練數據中可用但在真實世界中卻不可用、不合法的數據。機器學習

數據泄露通常以很是微妙和難以察覺的方式發生。當數據泄露發生時,會致使模型離線的評估結果「虛高」。「虛高」的意思是說你在離線階段評估模型的時候,在測試集上表現很好,可是等真正部署到生產環境解決實際業務問題的時候,效果表現會很是的差。也就是說,離線評估時高估了模型的能力。性能

關於數據泄露的一些具體實例

上面雖說了數據泄露的定義,可是太抽象了,這裏舉幾個實例來講明下數據泄露。比較容易理解的的一個泄露實例:若是訓練數據中包含了測試數據,這樣會致使模型過擬合。還有一個比較容易理解的泄露實例:若是將預測目標做爲模型的特徵,這樣模型的結論基本上就相似於「蘋果是蘋果」。意思是說若是一個物品被貼上了蘋果的標籤,那麼模型預測它是蘋果。咱們再來看一些在KDD比賽中更加微妙的泄露的例子。學習

預測潛在顧客是否會銀行開戶

在預測潛在顧客是否會在銀行開帳戶的時候,使用的一個特徵叫作:account number,也就是帳號。很明顯,只有開過戶的顧客這個字段纔會有值。在訓練時沒有任何問題,可是在實際進行預測時,對全部顧客來講,這個特徵都是空的,由於在預測以前你是不知道顧客的帳戶是多少,若是說在預測以前你已經知道了顧客的帳戶,那預測模型還有什麼用呢?測試

預測用戶是否會離開網站

在零售網站中,預測用戶瀏覽當前頁面以後接下來是離開網站或是瀏覽另外一個新頁面時,有一個涉及數據泄露的特徵叫作:session length,也就是用戶在訪問網站時瀏覽的頁面總數。這個特徵包含了將來的信息,即用戶將進行多少次訪問。有一種解決辦法是將 session length 替換爲 page number in session,即session中截止到目前爲止頁面瀏覽總數。網站

預測用戶是否會購買商品

在電商網站中,常常會預測給用戶曝光商品後,是否會購買的問題。很明顯,在這個問題中,商品的好評率是很是重要的因素,通常訓練時都是使用過去的數據來生成模型,好比使用過去一週的數據,在爲訓練數據生成商品的好評率時,若是使用該商品當前時間的好評率,這會形成這個特徵包含了將來的信息,因此應該使用在曝光時該商品的好評率。舉例來講,在2018年10月10日22分30秒給用戶u曝光了一件商品i,最終用戶u購買了該商品,在曝光時該商品的好評率是99%,一週後,也就是2018年10月17日22分30秒,該商品的好評率是86%,這時候在使用前面的數據構建訓練樣本時,其中商品好評率這個特徵的取值應該是曝光時的99%,而不是如今的86%。orm

預測病人的患病狀況

在開發一個用來診斷特定疾病的模型,現有的患者訓練集中包含了一個病人是否爲該疾病作過手術的特徵。很明顯,使用這個特徵能夠極大地提升預測的準確性,可是這明顯存在數據泄露,由於在病人的診斷結果沒有出來以前,這個特徵沒法知道。排序

另一個與之相關的例子是患者ID,因爲患者ID可能根據特定的診斷路徑分配。換句話說,若是是去看專家的結果,ID可能會有所不一樣,由於最初的醫生認定可能出現疾病。

數據泄露的類型介紹

咱們能夠將數據泄露分爲兩大類:訓練數據泄露特徵泄露。訓練數據泄露一般是測試數據或者將來的數據混合在了訓練數據中,特徵泄露是指特徵中包含了關於真實標籤的信息。

致使訓練數據泄露可能有如下幾種狀況:

  • 在進行某種預處理時是使用整個數據集(訓練集和測試集)來計算的,這樣獲得的結果會影響在訓練過程當中所看到的內容。這可能包括這樣的場景:計算參數以進行規範化和縮放,或查找最小和最大特徵值以檢測和刪除異常值,以及使用變量在整個數據集中的分佈來估計訓練集中的缺失值或執行特徵選擇。

  • 在處理時間序列數據時,另外一個須要注意的關鍵問題是,將來事件的記錄意外地用於計算特定預測的特性。咱們看到的會話長度示例就是其中的一個實例。

致使特徵泄露可能有如下幾種狀況:

  • 刪除了一些不合法的特徵,可是忽略刪除了包含相同或相似信息的特徵(例如前面例子中刪除了病人是否作過手術這個特徵,可是沒有刪除患者ID)

  • 在某些狀況下,數據集記錄被有意隨機化,或者某些字段被匿名化,這些字段包含關於用戶的特定信息,好比用戶的名字、位置等等。根據預測任務的不一樣,取消這種匿名化能夠揭示用戶或其餘敏感信息,而這些信息在實際使用中並不合法。

檢測數據泄露

當咱們瞭解了什麼是數據泄露了以後,下一步來看下如何檢測數據泄露。

在構建模型以前,咱們能夠先對數據進行一些探索分析。例如,尋找與目標標籤或者值高度相關的特徵。好比在醫學診斷的例子中,病人是否爲該疾病作過手術這個特徵與最終是否患病的相關性很是高。

當構建模型以後,咱們能夠檢查下模型中權重極高的特徵是否存在泄漏的狀況。或者構建模型以後,發現模型的效果好到難以想象,這時候須要考慮下是否發生了數據泄露。

另外一個更可靠的檢查泄漏的方法是,對通過訓練的模型進行有限的實際部署,看看模型的訓練時的性能與真實環境的表現之間是否有很大的差異。可是若是差異比較大的話,也有多是是過擬合形成的。

修復數據泄露

若是檢測到發生了數據泄露,那麼如何修復呢?

首先,在進行數據預處理時,不該該使用整個數據集來計算,而是應該使用劃分後的訓練集來生成。

若是在處理時間序列問題時,必定要確保關聯特徵時的時間戳與發生時間一致,這樣能避免訓練數據中出現來自將來的信息。

另外,針對一些與預測目標相關性特別高或者模型中權重特別高的特徵,必定要好好地檢查下是否發生了數據泄露,若是確實是,那麼必定要剔除。

練習題

看完這篇文章,咱們來作一道練習題來檢驗下學習成果:

  1. 思考下,當你訓練了一個模型以後,如何快速判斷這個模型是否出現了數據泄露的狀況呢?


參考:

[1] Daniel Gutierrez.Ask a Data Scientist: Data Leakage[2] University of Michigan.Applied Machine Learning in Python-Data Leakage[3] Leakage in Data Mining: Formulation, Detection, and Avoidance[4] Data Science in Python:Data Leakage[5] Data Leakage in Machine Learning[6] 什麼是特徵穿越?能夠舉例子說明嗎?

相關文章
相關標籤/搜索