在機器學習中建模的時候,每每面臨兩個困難,一是選擇哪一個模型,二是怎樣處理數據。處於數據包括數據獲取、數據清洗和數據分析。其實對於不一樣的場景和不一樣的數據,選擇的模型也是不同的,本文簡單聊一聊在數據缺失的時候該怎樣選擇合適的模型。算法
數據缺失時,處理數據的方式有以下三種:網絡
(1) 若數據的特色已經知道,能夠根據已知數據比較準確的獲得未知數據時,可使用預測的方式,先填補未知數據,再根據數據和場景的特色,以不存在數據缺失的方式選擇合適的模型。機器學習
(2) 若數據量遠遠超出要研究問題的規模,而存在缺失的數據條目比較少,去掉存在缺失數據的記錄對要研究的問題不存在影響,則能夠把存在缺失值的記錄去掉,而後以不存在數據缺失的方式選擇合適的模型。函數
(3) 使用能夠處理有缺失數據的工具包或者算法對存在缺失數據的數據集進行建模。工具
方式(1)和(2)是把存在缺失數據的數據集轉換成不具備缺失值的方式進行建模,然而對於(1),預測的值並非真實值,這仍是會致使數據的不肯定性,因此這種方式要慎用。對於(2),在機器學習中,數據是最寶貴的財富,因此要說數據太多了是假話,因此這種方式只是在最無奈的時候才選擇。接下來詳細講解使用工具包或者特殊算法對存在缺失值的數據集進行建模方法。學習
使用工具包或者特殊的算法對存在缺失數據的數據集進行建模spa
首先,要明確一點,工具包和特殊的算法也許是能夠對存在缺失值的數據集進行建模的。可是工具包進行了封裝,內部的結構和實現過程是不透明的。實際上,工具包之因此能夠處理有缺失值的數據集,是由於加了缺失值處理函數。要明白,工具/算法自己是不該該處理缺失值的,應該處理缺失值的是用戶。工具或者某些特殊的算法爲了方便用戶的使用,提供了默認的缺失值處理函數,若是用戶沒有提供本身的缺失值處理函數,就使用工具或者算法默認的缺失值處理函數。.net
經常使用的處理具備缺失數據的工具或者算法有兩種:(1)決策樹;(2)xgboost。blog
(1) 決策樹處理缺失數據rem
在決策樹中,以隨機森林爲例簡單說明。在隨機森林中,處理缺失值的方式以下:
方法一(快速簡單但效果差):把數值型變量中的缺失值用對應類別中的中位數替換;把非數值型數據的缺失值使用出現次數最多的數據替換。這種處理方式快速、簡單,可是效果較差。以數值型變量爲例:
方法二(耗時費力但效果好):雖然依然是使用中位數和出現次數最多的數來進行替換,方法2引入了權重。即對須要替換的數據先和其餘數據作類似度測量(proximity measurement)也就是下面公式中的Weight( W),在補全缺失點是類似的點的數據會有更好的權重W。以數值型變量爲例:
(2) Xgboost處理缺失數據
Xgboost把缺失值當作稀疏矩陣來對待,自己的在節點分裂時不考慮的缺失值的數值。缺失值數據會被分到左子樹和右子樹分別計算損失,選擇較優的那一個。若是訓練中沒有數據缺失,預測時出現了數據缺失,那麼默認被分類到右子樹。
這樣的處理方法當然巧妙,但也有風險:即咱們假設了訓練數據和預測數據的分佈相同,好比缺失值的分佈也相同。
使用工具處理缺失數據的優缺點
優勢:
一、能夠節省用戶的時間,快速建模;
二、防止因用戶導入的數據集存在缺失值致使模型訓練失敗。
缺點:
一、工具提供的缺失值處理方法也許並不適用全部的數據,可能使模型訓練時間延長;
二、工具提供的方法要應對的是全部可能的狀況,對特殊的情形並不事最佳的選擇方案;
三、簡單粗暴的處理模式會影響模型的結果,自動化的數據清理不可靠;
四、用戶應該提供符合模型要求的數據,這不是算法工具庫的責任。算法工具包的默認要求就是用戶提供適合的數據,由於用戶對數據有更深入的理解;
五、可能會大幅度增長模型的運算時間。
主流的機器學習模型千千萬,很難一律而論。但有一些經驗法則(rule of thumb)供參考:
總結來看,對於有缺失值的數據在通過缺失值處理後:
參考: