em模型补缺失值_模型对缺失值的处理
模型對缺失值的處理
首先從兩個角度解釋你的困惑:
工具包自動處理數據缺失不代表具體的算法可以處理缺失項
對于有缺失的數據:以決策樹為原型的模型優于依賴距離度量的模型
回答中也會介紹樹模型,如隨機森林 (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)。以數值型變量為例:
方法 2(耗時費力但效果好):雖然依然是使用
中位數
和
出現次數最多的數
來進行替換,方法 2 引入了權重。即對需要替換的數據先和其他數據做相似度測量 (proximity measurement) 也就是下面公式中的 Weight(
),在補全缺失點是相似的點的數據會有更高的權重 W。以數值型變量為例:
注:公式僅做參考,未仔細檢查。
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. 貝葉斯模型對于缺失數據也比較穩定,數據量很小的時候首推貝葉斯模型。
\6. 總結來看,對于有缺失值的數據在經過缺失值處理后:
(1) 數據量很小,用樸素貝葉斯
(2) 數據量適中或者較大,用樹模型,優先 xgboost
(3) 數據量較大,也可以用神經網絡
(4) 避免使用距離度量相關的模型,如 KNN 和 SVM
樹模型缺失值的方法
處理數據缺失值的方法很多,此處介紹一種利用樹模型處理缺失的方法。
如圖,假設有 100 個樣本,針對屬性 A,有 20 個樣本是缺失值。樹模型處理缺失樣本的時候,會先忽略屬性 A 缺失的樣本,然后采用某種屬性選擇度量(信息增益、增益率、基尼指數)對剩下的樣本(現在有 80 個)進行分裂。假設將這 80 個樣本分裂到圖中的三個節點,三個節點分配到的樣本數分別為 30、25、25(稱這個過程為過程一)。然后將屬性 A 缺失的 20 個樣本均加入到這三個節點中(稱這個過程為過程二)。在過程一中加入節點的樣本的權值均為 1,而在過程二中加入節點的樣本的權值為:該節點中屬性 A 未缺失的樣本數 / 父節點中屬性 A 未缺失的樣本數,如屬性 A 缺失的樣本添加到節點 1 之后的權重為 30/80 = 0.375。
總結
以上是生活随笔為你收集整理的em模型补缺失值_模型对缺失值的处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 联通HG8321R光猫开路由破解详细步骤
- 下一篇: 中点坐标公式 矩形_压轴题必备|中考数学