<thead id="htxjv"><meter id="htxjv"><del id="htxjv"></del></meter></thead>
      <thead id="htxjv"></thead>
      <thead id="htxjv"></thead>

        <dfn id="htxjv"></dfn>

        <thead id="htxjv"><dfn id="htxjv"></dfn></thead>
        <meter id="htxjv"><thead id="htxjv"><del id="htxjv"></del></thead></meter>

        <mark id="htxjv"></mark>
        <th id="htxjv"></th>

        <thead id="htxjv"><menuitem id="htxjv"><ol id="htxjv"></ol></menuitem></thead>
        北京物流信息聯盟

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

        量子位 2021-10-06 16:37:26
        作者:阿薩姆
        普華永道 | 數據科學家
        量子位 已獲授權編輯發布
        轉載請聯系原作者

        有些小伙伴在實際使用中發現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技術和產品新動態