面對資料缺失,如何選擇合適的機器學習模型?

作者:阿薩姆

普華永道 | 資料科學家

量子位 已獲授權編輯釋出

轉載請聯絡原作者

有些小夥伴在實際使用中發現xgboost可以自動處理缺失值,而有些模型不可以。我想先從兩個角度解答這個困惑:

工具包自動處理資料缺失不代表具體的演算法可以處理缺失項

對於有缺失的資料:以決策樹為原型的模型優於依賴距離度量的模型

回答中也會介紹樹模型,如隨機森林(Random Forest)和xgboost如何處理缺失值。文章最後總結了在有缺失值時選擇模型的小建議。

1。 機器學習工具庫開發的“哲學”

首先你有這個困惑是因為你直接呼叫了工具庫,比如Python的sklearn和xgboost等,所以你認為演算法A可以自動處理缺失值而B不可以。

但真實情況是…開發者在封裝工具庫的時候就已經考慮到了使用者可能匯入了含有缺失值的資料,所以加了一個缺失值處理的函式。處理缺失值的不是演算法A,而是開發者額外寫的函式。

但是,模型/演算法本身不應該處理缺失值,處理缺失值的應該是使用者。然而在現實情況下,如果使用者不處理/不知道怎麼處理,我們也必須提供一個預設的缺失值處理方法。但是這種自動處理的缺失值,效果往往不好,因為資料的精髓只有使用者自己明白。

工具包提供自動資料清理的功能的好處:

防止使用者匯入的資料不符合模型要求而導致失敗

節省使用者的時間,提供一站式服務

風險

簡單粗暴的處理模式會影響模型的結果,自動化的資料清理不可靠

使用者應該提供符合模型要求的資料,這不是演算法工具庫的責任。演算法工具包的預設要求就是使用者提供適合的資料,因為使用者對資料有更深刻的理解

可能會大幅度增加模型的運算時間

在軟體工程領域,我們有一個比較經典的哲學思想叫做“讓它出錯”(let it fail)”。指的是如果程式在執行中出現了錯誤,應該丟擲異常(raise exception)而不是默默地裝作沒看到繼續執行。放在機器學習工具包的場景下,如果發現數據有缺失,或者格式不對(比如不是數字型變數),應該報錯而不是替使用者處理。這也是為什麼sklearn會報錯,而不是替你處理。

恰好最近在開發一個機器學習開源工具包,相關的問題也想了很多。是否替使用者做了本該他自己做的事情,這需要在易用性和準確性中間找平衡。

我開發的機器學習開源工具包地址:

https://zhuanlan。zhihu。com/p/29868365

2。 決策樹模型怎麼處理異常值?

看到這裡,我希望你理解了為什麼不是每個工具包都會自動處理缺失值。那我們分析一個具體個案 - 隨機森林(Random Forests)。隨機森林是已故統計學家Leo Breiman提出的,和gradient boosted tree一樣,它的基模型是決策樹。在介紹RF時,Breiman就提出兩種解決缺失值的方法(Random forests - classification description):

方法1(快速簡單但效果差):把數值型變數(numerical variables)中的缺失值用其所對應的類別中(class)的中位數(median)替換。把描述型變數(categorical variables)缺失的部分用所對應類別中出現最多的數值替代(most frequent non-missing value)。以數值型變數為例:

面對資料缺失,如何選擇合適的機器學習模型?

方法2(耗時費力但效果好):雖然依然是使用中位數和出現次數最多的數來進行替換,方法2引入了權重。即對需要替換的資料先和其他資料做相似度測量(proximity measurement)也就是下面公式中的Weight( W),在補全缺失點是相似的點的資料會有更好的權重W。以數值型變數為例:

面對資料缺失,如何選擇合適的機器學習模型?

注:公式僅做參考,未仔細檢查。

Breiman說明了第二種方法的效果更好,但需要的時間更長。這也是為什麼工具包中一般不提供資料補全的功能,因為會影響到工具包的效率。

3。 xgboost怎麼處理缺失值?

xgboost處理缺失值的方法和其他樹模型不同。根據作者Tianqi Chen在論文[1]中章節3。4的介紹,xgboost把缺失值當做稀疏矩陣來對待,本身的在節點分裂時不考慮的缺失值的數值。缺失值資料會被分到左子樹和右子樹分別計算損失,選擇較優的那一個。如果訓練中沒有資料缺失,預測時出現了資料缺失,那麼預設被分類到右子樹。具體的介紹可以參考[2,3]。

面對資料缺失,如何選擇合適的機器學習模型?

這樣的處理方法固然巧妙,但也有風險:即我們假設了訓練資料和預測資料的分佈相同,比如缺失值的分佈也相同,不過直覺上應該影響不是很大:)

4。 什麼樣的模型對缺失值更敏感?

主流的機器學習模型千千萬,很難一概而論。但有一些經驗法則(rule of thumb)供參考:

樹模型對於缺失值的敏感度較低,大部分時候可以在資料有缺失時使用。

涉及到距離度量(distance measurement)時,如計算兩個點之間的距離,缺失資料就變得比較重要。因為涉及到“距離”這個概念,那麼缺失值處理不當就會導致效果很差,如K近鄰演算法(KNN)和支援向量機(SVM)。

線性模型的代價函式(loss function)往往涉及到距離(distance)的計算,計算預測值和真實值之間的差別,這容易導致對缺失值敏感。

神經網路的魯棒性強,對於缺失資料不是非常敏感,但一般沒有那麼多資料可供使用。

貝葉斯模型對於缺失資料也比較穩定,資料量很小的時候首推貝葉斯模型。

總結來看,對於有缺失值的資料在經過缺失值處理後:

資料量很小,用樸素貝葉斯

資料量適中或者較大,用樹模型,優先 xgboost

資料量較大,也可以用神經網路

避免使用距離度量相關的模型,如KNN和SVM

當然,這只是我的經驗之談,請謹慎參考。缺失值補全(missing value imputation)是一個非常大的方向,答案中只能簡單帶過,推薦深入瞭解。

5。 寫在最後 - 如何優雅的調包?

不少答案中我都提到過“支援大家調包”,也就是呼叫現成的機器學習工具包。但“調包”最大的風險就是不知道自己用的到底是什麼,常常一知半解。

這並不可怕,可怕的是當你感到迷惑的時候卻沒有追根溯源,搞清楚到底發生了什麼。隨著工具包的封裝程度越來越高,調包的成本會越來越低。

但想要優雅的調包,最好還是知道包裡裝了些什麼

參考資料

[1] A Scalable Tree Boosting System

https://arxiv。org/abs/1603。02754

[2] What are the ways of treatng missing values in XGboost? · Issue #21 · dmlc/xgboost

https://github。com/dmlc/xgboost/issues/21

[3] Frequently Asked Questions

http://xgboost。readthedocs。io/en/latest/faq。html#how-to-deal-with-missing-value

點選左下角“閱讀原文”,可解鎖更多作者的文章

還可以直接參與討論~

量子位特約稿件,轉載請聯絡原作者。

—完

加入社群

量子位AI社群9群開始招募啦,歡迎對AI感興趣的同學,加小助手微信qbitbot3入群;

此外,量子位專業細分群(自動駕駛、CV、NLP、機器學習等)正在招募,面向正在從事相關領域的工程師及研究人員。

進群請加小助手微訊號qbitbot3,並務必備註相應群的關鍵詞~透過稽核後我們將邀請進群。(專業群稽核較嚴,敬請諒解)

誠摯招聘

量子位正在招募編輯/記者,工作地點在北京中關村。期待有才氣、有熱情的同學加入我們!相關細節,請在量子位公眾號(QbitAI)對話介面,回覆“招聘”兩個字。

量子位QbitAI

‘’ 追蹤AI技術和產品新動態