如何處理缺失值(使用Python)

yuwei
Jacky’s blog
Published in
Nov 21, 2018
source

大家好,好久不見了! 今天這篇目的將會是在指導大家怎麼去處理缺失值,當你在處理大型的資料集時,一定會有缺失值,你一定會想說,當我在面對這些缺失值時,究竟應該從哪裡開始下手呢? 在這篇我會介紹幾個常用的處理缺失值的方法

1. 插入和去除資料

在進入處理缺失資料之前,我們應該要先來探討為什麼會有缺失資料

(1) 隨機缺失(Missing at Random): 指的是數據的缺失不是完全隨機的,當你做控制其他變數後, y值缺失的機率與y值無關,y的數據依賴於其他完全變數

(2) 完全隨機缺失(Missing Completely at Random):指的是數據的缺失是完全隨機的,數據的缺失不依賴於任何不完全變數或完全變數

(3) 非隨機缺失(Missing not an Random):指的是數據的缺失依賴於不完全變數本身,表示y值缺失的機率與y值有關

source

2. 刪除

(1) 列表

其主要是根據剛剛上述的完全隨機缺失的理論為基礎, 如果在一個row裡面有觀察到缺失值,就將這個欄位給刪除掉,然而,在大部分的case裡,使用列表刪除法是不利的,因為不是每個缺失的原因都是屬於完全隨機缺失,這樣冒然的刪除資料集有可能會造成具有偏誤的參數和預測

#去除含有NaN的資料
mydata.dropna(inplace=True)

(2) 去除特徵值

當一個特徵值超過60%的缺失值的話,可以考慮將整個feature去除掉, 但填補缺失值永遠是比刪除缺失值還要來得好,但還是提供這個選項給你們

del mydata.column_name
mydata.drop('column_name,axis=1,inplace=True)

3. 專門處理時間序列法(Time-Series Specific Methods)

這個方法雖然是在說專門處理時間序列的方法,但我們處理一般資料集也可以使用這個方法

(1) 最後觀察值推估法(Last Observation Carried Forward(LOCF)) ffill & 下個觀察值推估法(Next Observation Carried Backward(NOCB)) bfill :此兩者為較簡單的單一插補法 ,LOCF表示是用缺失值的前一個資料來填補該缺失值

mydata.fillna(method='ffill')

(2) 線性插入法(Linear Interpolation):

這個方法是使用時間序列的趨勢資料而不適季節性資料

(3) 季節性調整+線性插入法(Seasonal Adjustment+Linear Interpolation):

使用線性插入法,並利用每個季節有不同的調整

4. 平均值,中位數和眾數

用最簡單的統計方法來計算需要放入的差補值

from sklearn.preprocessing import Imputer
values=mydata.values
imputer=Imputer(missing_val='NaN',strategy='mean')
transformed_values=imputer.fit_transform(values)
#Strategy can be changed to 'median' and 'most_frequent'

5. 多重插補

(1)插補(Imputation)

為每個空值產生一套可能的插補值,這些值反映了無響應模型的不確定性;每個值都可以被用來插補數據的缺失值,產生若干個完整數據集合。

(2)分析(Analysis)

每個插補數據的集合都用針對完整數據集的統計方法進行統計分析

(3)混合(Pooling)

對來自各個插補數據集的結果,根據評分函數進行選擇,產生最終的插補值。

Source

定性缺失值變數的插補(Imputation of Categorical Variables)

  1. 可以使用眾數插補法,但會產生偏誤
  2. 缺失值可以被定性資料當成新的一種category,我們可以創造一個新的category並插補進去缺失值裡
  3. 可以透過將沒有含有NaN值的同一個feature裡的值當作training set,用machine learning演算法來預測含有NaN值的test
  4. 多重插補

K近鄰演算法KNN(K Nearest Neighbors)

將資料分為K類,並透過點和點的距離來調整屬於哪一類在K類群集,如果是遇到分離式資料(KNN是透過最頻繁的值來分類)而連續性資料則是透過平均值,而距離指標會根據資料型態的變化

  1. Continuous Data(連續性資料):

最常出現的距離指標是歐幾里得距離Euclidean, Manhattan and Cosine

2. Categorical Data(定性資料):

可以使用漢明距離是採用所有分類屬性,如果兩個點之間的值不相同,則計算字串符中的非零的元素個數,對於二進位字串符來說,就是1的個數,所以11101的漢明重量是4

from fancyimpute import KNN
#Use k=5 nearest rows which have a feature to fill in each row's missing
output=KNN(k=5).complete(mydata)

結論

跟各位介紹了這麼多處理缺失值的方法,我不是希望各位能牢記使用這個算法,因為資料科學這塊領域有太多要記了,所以你只要當你要處理缺失值的相關問題時,就可以來medium看我的文章,看有什麼方法適合你去完成你的資料科學專案,相信這些能幫助你變成更好的資料科學家

同樣地,我歡迎你來信跟我一起討論,我的email是jacky308082@gmail.com,謝謝你們看完這篇文章!

--

--

yuwei
Jacky’s blog

Curious Data scientist. Strong Lebron James’s fan. #StriveForGreatness #JustAKidFromTaiwan https://www.linkedin.com/in/yu-wei-chung/