你可能过于高估了机器学习算法能力,带你解读鲜为人知的数据泄露问题
本文是《機(jī)器學(xué)習(xí)寶典》第 6 篇,讀完本文你能夠掌握機(jī)器學(xué)習(xí)中數(shù)據(jù)泄露問題。
讀完分類與回歸算法的評估指標(biāo)、排序算法的評估指標(biāo)以及機(jī)器學(xué)習(xí)模型的離線評估方法之后,你已經(jīng)知道了在機(jī)器學(xué)習(xí)中的該使用什么指標(biāo)來評估模型以及使用什么方法來評估模型,但是在現(xiàn)實(shí)生活中評估模型時(shí)經(jīng)常會遇到一個(gè)問題:數(shù)據(jù)泄露(data leakage),這里我們來對數(shù)據(jù)泄露做一個(gè)解讀。
什么是數(shù)據(jù)泄露
先舉個(gè)貼近生活的例子,你作為一名優(yōu)秀的算法工程師,你的志向是去通過機(jī)器學(xué)習(xí)算法解決生活中的很多實(shí)際問題。在解決一個(gè)二分類問題時(shí),你為了充分使用數(shù)據(jù)集,使用交叉驗(yàn)證的方法,訓(xùn)練了一個(gè)模型,發(fā)現(xiàn)它在測試集上的AUC指標(biāo) 0.99,這時(shí)你心里美滋滋地想著:開發(fā)出了這么牛逼的模型,今年的年終獎(jiǎng)應(yīng)該能拿到手軟了吧。緊接著系統(tǒng)工程師將這個(gè)模型進(jìn)行工程化,部署到生產(chǎn)環(huán)境中,開始真正解決實(shí)際的業(yè)務(wù)問題。當(dāng)你正在給同事吹噓模型多么牛逼,多么吊炸天的時(shí)候,模型在生產(chǎn)環(huán)境中的效果表現(xiàn)數(shù)據(jù)出來了,你看完后,頓時(shí)雙腿一軟,要不是同事扶著你,你直接癱倒在地。
出現(xiàn)上面這種模型在離線評估時(shí)效果好,線上效果不好的原因有很多種,其中有一個(gè)經(jīng)常會碰到的原因是:數(shù)據(jù)泄露(data leakage),有時(shí)也叫做泄露、穿越等。它說的是用于訓(xùn)練機(jī)器學(xué)習(xí)算法的數(shù)據(jù)集中包含了一些將要預(yù)測的事務(wù)的東西(when the data you are using to train a machine learning algorithm happens to have the information you are trying to predict),也就是說測試數(shù)據(jù)中的一些信息泄露到了訓(xùn)練集中。這里說的信息是指關(guān)于目標(biāo)標(biāo)簽或者在訓(xùn)練數(shù)據(jù)中可用但在真實(shí)世界中卻不可用、不合法的數(shù)據(jù)。
數(shù)據(jù)泄露一般以非常微妙和難以察覺的方式發(fā)生。當(dāng)數(shù)據(jù)泄露發(fā)生時(shí),會導(dǎo)致模型離線的評估結(jié)果“虛高”。“虛高”的意思是說你在離線階段評估模型的時(shí)候,在測試集上表現(xiàn)很好,但是等真正部署到生產(chǎn)環(huán)境解決實(shí)際業(yè)務(wù)問題的時(shí)候,效果表現(xiàn)會非常的差。也就是說,離線評估時(shí)高估了模型的能力。
關(guān)于數(shù)據(jù)泄露的一些具體實(shí)例
上面雖然說了數(shù)據(jù)泄露的定義,但是太抽象了,這里舉幾個(gè)實(shí)例來說明下數(shù)據(jù)泄露。比較容易理解的的一個(gè)泄露實(shí)例:如果訓(xùn)練數(shù)據(jù)中包含了測試數(shù)據(jù),這樣會導(dǎo)致模型過擬合。還有一個(gè)比較容易理解的泄露實(shí)例:如果將預(yù)測目標(biāo)作為模型的特征,這樣模型的結(jié)論基本上就類似于“蘋果是蘋果”。意思是說如果一個(gè)物品被貼上了蘋果的標(biāo)簽,那么模型預(yù)測它是蘋果。我們再來看一些在KDD比賽中更加微妙的泄露的例子。
預(yù)測潛在顧客是否會銀行開戶
在預(yù)測潛在顧客是否會在銀行開賬戶的時(shí)候,使用的一個(gè)特征叫做:account number,也就是賬號。很明顯,只有開過戶的顧客這個(gè)字段才會有值。在訓(xùn)練時(shí)沒有任何問題,但是在實(shí)際進(jìn)行預(yù)測時(shí),對所有顧客來說,這個(gè)特征都是空的,因?yàn)樵陬A(yù)測之前你是不知道顧客的賬戶是多少,如果說在預(yù)測之前你已經(jīng)知道了顧客的賬戶,那預(yù)測模型還有什么用呢?
預(yù)測用戶是否會離開網(wǎng)站
在零售網(wǎng)站中,預(yù)測用戶瀏覽當(dāng)前頁面之后接下來是離開網(wǎng)站或是瀏覽另一個(gè)新頁面時(shí),有一個(gè)涉及數(shù)據(jù)泄露的特征叫做:session length,也就是用戶在訪問網(wǎng)站時(shí)瀏覽的頁面總數(shù)。這個(gè)特征包含了未來的信息,即用戶將進(jìn)行多少次訪問。有一種解決辦法是將 session length 替換為 page number in session,即session中截止到目前為止頁面瀏覽總數(shù)。
預(yù)測用戶是否會購買商品
在電商網(wǎng)站中,經(jīng)常會預(yù)測給用戶曝光商品后,是否會購買的問題。很明顯,在這個(gè)問題中,商品的好評率是非常重要的因素,一般訓(xùn)練時(shí)都是使用過去的數(shù)據(jù)來生成模型,比如使用過去一周的數(shù)據(jù),在為訓(xùn)練數(shù)據(jù)生成商品的好評率時(shí),如果使用該商品當(dāng)前時(shí)間的好評率,這會造成這個(gè)特征包含了未來的信息,所以應(yīng)該使用在曝光時(shí)該商品的好評率。舉例來說,在2018年10月10日22分30秒給用戶u曝光了一件商品i,最終用戶u購買了該商品,在曝光時(shí)該商品的好評率是99%,一周后,也就是2018年10月17日22分30秒,該商品的好評率是86%,這時(shí)候在使用前面的數(shù)據(jù)構(gòu)建訓(xùn)練樣本時(shí),其中商品好評率這個(gè)特征的取值應(yīng)該是曝光時(shí)的99%,而不是現(xiàn)在的86%。
預(yù)測病人的患病情況
在開發(fā)一個(gè)用來診斷特定疾病的模型,現(xiàn)有的患者訓(xùn)練集中包含了一個(gè)病人是否為該疾病做過手術(shù)的特征。很明顯,使用這個(gè)特征可以極大地提高預(yù)測的準(zhǔn)確性,但是這明顯存在數(shù)據(jù)泄露,因?yàn)樵诓∪说脑\斷結(jié)果沒有出來之前,這個(gè)特征無法知道。
另外一個(gè)與之相關(guān)的例子是患者ID,由于患者ID可能根據(jù)特定的診斷路徑分配。換句話說,如果是去看專家的結(jié)果,ID可能會有所不同,因?yàn)樽畛醯尼t(yī)生認(rèn)定可能出現(xiàn)疾病。
數(shù)據(jù)泄露的類型介紹
我們可以將數(shù)據(jù)泄露分為兩大類:訓(xùn)練數(shù)據(jù)泄露和特征泄露。訓(xùn)練數(shù)據(jù)泄露通常是測試數(shù)據(jù)或者未來的數(shù)據(jù)混合在了訓(xùn)練數(shù)據(jù)中,特征泄露是指特征中包含了關(guān)于真實(shí)標(biāo)簽的信息。
導(dǎo)致訓(xùn)練數(shù)據(jù)泄露可能有以下幾種情況:
在進(jìn)行某種預(yù)處理時(shí)是使用整個(gè)數(shù)據(jù)集(訓(xùn)練集和測試集)來計(jì)算的,這樣得到的結(jié)果會影響在訓(xùn)練過程中所看到的內(nèi)容。這可能包括這樣的場景:計(jì)算參數(shù)以進(jìn)行規(guī)范化和縮放,或查找最小和最大特征值以檢測和刪除異常值,以及使用變量在整個(gè)數(shù)據(jù)集中的分布來估計(jì)訓(xùn)練集中的缺失值或執(zhí)行特征選擇。
在處理時(shí)間序列數(shù)據(jù)時(shí),另一個(gè)需要注意的關(guān)鍵問題是,未來事件的記錄意外地用于計(jì)算特定預(yù)測的特性。我們看到的會話長度示例就是其中的一個(gè)實(shí)例。
導(dǎo)致特征泄露可能有以下幾種情況:
刪除了一些不合法的特征,但是忽略刪除了包含相同或類似信息的特征(例如前面例子中刪除了病人是否做過手術(shù)這個(gè)特征,但是沒有刪除患者ID)
在某些情況下,數(shù)據(jù)集記錄被有意隨機(jī)化,或者某些字段被匿名化,這些字段包含關(guān)于用戶的特定信息,比如用戶的名字、位置等等。根據(jù)預(yù)測任務(wù)的不同,取消這種匿名化可以揭示用戶或其他敏感信息,而這些信息在實(shí)際使用中并不合法。
檢測數(shù)據(jù)泄露
當(dāng)我們了解了什么是數(shù)據(jù)泄露了之后,下一步來看下如何檢測數(shù)據(jù)泄露。
在構(gòu)建模型之前,我們可以先對數(shù)據(jù)進(jìn)行一些探索分析。例如,尋找與目標(biāo)標(biāo)簽或者值高度相關(guān)的特征。比如在醫(yī)學(xué)診斷的例子中,病人是否為該疾病做過手術(shù)這個(gè)特征與最終是否患病的相關(guān)性非常高。
當(dāng)構(gòu)建模型之后,我們可以檢查下模型中權(quán)重極高的特征是否存在泄漏的情況。或者構(gòu)建模型之后,發(fā)現(xiàn)模型的效果好到不可思議,這時(shí)候需要考慮下是否發(fā)生了數(shù)據(jù)泄露。
另一個(gè)更可靠的檢查泄漏的方法是,對經(jīng)過訓(xùn)練的模型進(jìn)行有限的實(shí)際部署,看看模型的訓(xùn)練時(shí)的性能與真實(shí)環(huán)境的表現(xiàn)之間是否有很大的差別。但是如果差別比較大的話,也有可能是是過擬合造成的。
修復(fù)數(shù)據(jù)泄露
如果檢測到發(fā)生了數(shù)據(jù)泄露,那么如何修復(fù)呢?
首先,在進(jìn)行數(shù)據(jù)預(yù)處理時(shí),不應(yīng)該使用整個(gè)數(shù)據(jù)集來計(jì)算,而是應(yīng)該使用劃分后的訓(xùn)練集來生成。
如果在處理時(shí)間序列問題時(shí),一定要確保關(guān)聯(lián)特征時(shí)的時(shí)間戳與發(fā)生時(shí)間一致,這樣能避免訓(xùn)練數(shù)據(jù)中出現(xiàn)來自未來的信息。
另外,針對一些與預(yù)測目標(biāo)相關(guān)性特別高或者模型中權(quán)重特別高的特征,一定要好好地檢查下是否發(fā)生了數(shù)據(jù)泄露,如果確實(shí)是,那么一定要剔除。
練習(xí)題
看完這篇文章,我們來做一道練習(xí)題來檢驗(yàn)下學(xué)習(xí)成果:
思考下,當(dāng)你訓(xùn)練了一個(gè)模型之后,如何快速判斷這個(gè)模型是否出現(xiàn)了數(shù)據(jù)泄露的情況呢?
參考:
[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] 什么是特征穿越?可以舉例子說明嗎?
總結(jié)
以上是生活随笔為你收集整理的你可能过于高估了机器学习算法能力,带你解读鲜为人知的数据泄露问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: idea常用但容易忘记的快捷键
- 下一篇: 尝试 Docker + Nginx 部署