1. 程式人生 > >機器學習中缺失值的處理

機器學習中缺失值的處理

首先從兩個角度解釋你的困惑:

  1. 工具包自動處理資料缺失不代表具體的演算法可以處理缺失項
  2. 對於有缺失的資料:以決策樹為原型的模型優於依賴距離度量的模型

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

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

首先你有這個困惑是因為你直接呼叫了工具庫,比如Python的sklearn和xgboost等,所以你認為演算法A可以自動處理缺失值而B不可以。但真實情況是...開發者在封裝工具庫的時候就已經考慮到了使用者可能匯入了含有缺失值的資料,所以加了一個缺失值處理的函式。處理缺失值的不是演算法A,而是開發者額外寫的函式。

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

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

  • 防止使用者匯入的資料不符合模型要求而導致失敗
  • 節省使用者的時間,提供一站式服務

工具包提供自動資料清理的功能的風險:

  • 簡單粗暴的處理模式會影響模型的結果,自動化的資料清理不可靠
  • 使用者應該提供符合模型要求的資料,這不是演算法工具庫的責任。演算法工具包的預設要求就是使用者提供適合的資料,因為使用者對資料有更深刻的理解
  • 可能會大幅度增加模型的運算時間

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

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

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)。以數值型變數為例: X_{i,j} = Median(\forall X_{k,j}) \quad where \, k=1,2,3...n \; and \; X_{k,j} \,is\, present

  • 方法2(耗時費力但效果好):雖然依然是使用中位數出現次數最多的數來進行替換,方法2引入了權重。即對需要替換的資料先和其他資料做相似度測量(proximity measurement)也就是下面公式中的Weight( W ),在補全缺失點是相似的點的資料會有更高的權重W。以數值型變數為例: X_{k,j} =\frac{1}{n}\sum_{i=1,\ne k}^{n}W_{i,k} X_{i,j} \quad where \, k=1,2,3...n \; and \; X_{i,j} \,is\, present

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

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

3. xgboost怎麼處理缺失值?

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

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

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

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

  1. 樹模型對於缺失值的敏感度較低,大部分時候可以在資料有缺失時使用。
  2. 涉及到距離度量(distance measurement)時,如計算兩個點之間的距離,缺失資料就變得比較重要。因為涉及到“距離”這個概念,那麼缺失值處理不當就會導致效果很差,如K近鄰演算法(KNN)和支援向量機(SVM)。
  3. 線性模型的代價函式(loss function)往往涉及到距離(distance)的計算,計算預測值和真實值之間的差別,這容易導致對缺失值敏感。
  4. 神經網路的魯棒性強,對於缺失資料不是非常敏感,但一般沒有那麼多資料可供使用。
  5. 貝葉斯模型對於缺失資料也比較穩定,資料量很小的時候首推貝葉斯模型。

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

  • 資料量很小,用樸素貝葉斯
  • 資料量適中或者較大,用樹模型,優先 xgboost
  • 資料量較大,也可以用神經網路
  • 避免使用距離度量相關的模型,如KNN和SVM

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

5、缺失值是否要處理?

當缺失比例很小時,可直接對缺失記錄進行捨棄或進行手工處理。但在實際資料中,往往缺失資料佔有相當的比重。這時如果手工處理非常低效,如果捨棄缺失記錄,則會丟失大量資訊,使不完全觀測資料與完全觀測資料間產生系統差異,對這樣的資料進行分析,你很可能會得出錯誤的結論。

對缺失值的處理要具體問題具體分析,為什麼要具體問題具體分析呢?因為屬性缺失有時並不意味著資料缺失,缺失本身是包含資訊的,所以需要根據不同應用場景下缺失值可能包含的資訊進行合理填充。下面通過一些例子來說明如何具體問題具體分析,仁者見仁智者見智,僅供參考:

“年收入”:商品推薦場景下填充平均值,借貸額度場景下填充最小值;

“行為時間點”:填充眾數;

“價格”:商品推薦場景下填充最小值,商品匹配場景下填充平均值;

“人體壽命”:保險費用估計場景下填充最大值,人口估計場景下填充平均值;

“駕齡”:沒有填寫這一項的使用者可能是沒有車,為它填充為0較為合理;

”本科畢業時間”:沒有填寫這一項的使用者可能是沒有上大學,為它填充正無窮比較合理;

“婚姻狀態”:沒有填寫這一項的使用者可能對自己的隱私比較敏感,應單獨設為一個分類,如已婚1、未婚0、未填-1。

6、缺失填充方法有哪些?

平均值填充(Mean/Mode Completer)

將初始資料集中的屬性分為數值屬性和非數值屬性來分別進行處理。

如果空值是數值型的,就根據該屬性在其他所有物件的取值的平均值來填充該缺失的屬性值;

如果空值是非數值型的,就根據統計學中的眾數原理,用該屬性在其他所有物件的取值次數最多的值(即出現頻率最高的值)來補齊該缺失的屬性值。與其相似的另一種方法叫條件平均值填充法(Conditional
Mean Completer)。在該方法中,用於求平均的值並不是從資料集的所有物件中取,而是從與該物件具有相同決策屬性值的物件中取得。

這兩種資料的補齊方法,其基本的出發點都是一樣的,以最大概率可能的取值來補充缺失的屬性值,只是在具體方法上有一點不同。與其他方法相比,它是用現存資料的多數資訊來推測缺失值。

熱卡填充(Hot deck imputation,或就近補齊)
對於一個包含空值的物件,熱卡填充法在完整資料中找到一個與它最相似的物件,然後用這個相似物件的值來進行填充。不同的問題可能會選用不同的標準來對相似進行判定。該方法概念上很簡單,且利用了資料間的關係來進行空值估計。這個方法的缺點在於難以定義相似標準,主觀因素較多。

K最近距離鄰法(K-means clustering)

先根據歐式距離或相關分析來確定距離具有缺失資料樣本最近的K個樣本,將這K個值加權平均來估計該樣本的缺失資料。

使用所有可能的值填充(Assigning All Possible values of the Attribute)

用空缺屬性值的所有可能的屬性取值來填充,能夠得到較好的補齊效果。但是,當資料量很大或者遺漏的屬性值較多時,其計算的代價很大,可能的測試方案很多。

組合完整化方法(Combinatorial Completer)

用空缺屬性值的所有可能的屬性取值來試,並從最終屬性的約簡結果中選擇最好的一個作為填補的屬性值。這是以約簡為目的的資料補齊方法,能夠得到好的約簡結果;但是,當資料量很大或者遺漏的屬性值較多時,其計算的代價很大。

迴歸(Regression)

基於完整的資料集,建立迴歸方程。對於包含空值的物件,將已知屬性值代入方程來估計未知屬性值,以此估計值來進行填充。當變數不是線性相關時會導致有偏差的估計。

期望值最大化方法(Expectation maximization,EM)

EM演算法是一種在不完全資料情況下計算極大似然估計或者後驗分佈的迭代演算法。在每一迭代迴圈過程中交替執行兩個步驟:E步(Excepctaion
step,期望步),在給定完全資料和前一次迭代所得到的引數估計的情況下計算完全資料對應的對數似然函式的條件期望;M步(Maximzation
step,極大化步),用極大化對數似然函式以確定引數的值,並用於下步的迭代。演算法在E步和M步之間不斷迭代直至收斂,即兩次迭代之間的引數變化小於一個預先給定的閾值時結束。該方法可能會陷入區域性極值,收斂速度也不是很快,並且計算很複雜。