Pandas判斷缺失值
df.isnull().sum() #顯示每一列的空值個數
data.info() #可以直觀的查看缺失值
注意,有些數據用0代替特征值,這個時候,可以將0用None 代替,這樣,isnull 函數就可以檢測出來了,而且fillna 和dropna函數都可以直接工作了。
處理缺失值
直接刪除
將存在遺漏信息屬性值的對象(元組,記錄)刪除,從而得到一個完備的信息表。
優點:簡單易行,在對象有多個屬性缺失值、被刪除的含缺失值的對象與初始數據集的數據量相比非常小的情況下有效;
不足:當缺失數據所占比例較大,特別當遺漏數據非隨機分布時,這種方法可能導致數據發生偏離,從而引出錯誤的結論。
如何判斷直接刪除數據后,對數據造成的影響,可以計算原始數據均值,和刪除后,數據的均值的變化圖,如果變化很大,那么最好不要直接刪除數據
( p_drop.mean() - p.mean() ) / p.mean()
數據填充
用一定的值去填充空值,從而使信息表完備化。通常基於統計學原理,根據初始數據集中其余對象取值的分布情況來對一個缺失值進行填充。
- 人工填充(filling manually)
根據業務知識來進行人工填充。
- 統計量填充
若缺失率較低(小於 95%)且重要性較低,則根據數據分布的情況進行填充。
常用填充統計量:
平均值:對於數據符合均勻分布,用該變量的均值填補缺失值。
中位數:對於數據存在傾斜分布的情況,采用中位數填補缺失值。
眾數:離散特征可使用眾數進行填充缺失值。
from sklearn.impute import SimpleImputer
imp_mean = SimpleImputer() #默認均值填充
imp_median = SimpleImputer(strategy="median") #用中位數進行填充
imp_0 = SimpleImputer(strategy="constant" fill_value=0) #用0填充
imp_mode.fit_transform(data)
- 模型預測填充
使用待填充字段作為 Label,沒有缺失的數據作為訓練數據,建立分類/回歸模型,對待填充的缺失字段 進行預測並進行填充。
最近距離鄰法(KNN)先根據歐式距離或相關分析來確定距離具有缺失數據樣本最近的 K 個樣本,將這 K 個值加權平均/投票來估計該樣本的缺失數據。
回歸(Regression)基於完整的數據集,建立回歸方程。對於包含空值的對象,將已知屬性值代入方程來估計未知屬性值,以此估計值來進行填充。當變量不是線性相關時會導致有偏差的估計,常用線性回歸。
- 插值法填充包括隨機插值,多重插補法,熱平台插補,拉格朗日插值,牛頓插值等。
-
線性插值法
使用插值法可以計算缺失值的估計值,所謂的插值法就是通過兩點(x0,y0),(x1,y1)估計中間點的值,假設 y=f(x)是一條直線,通過已知的兩點來計算函數 f(x),然后只要知道 x 就能求出 y,以此方法來估計缺失值。
interpolate(method = 'linear', axis) 方法將通過 linear 插值使用沿着給定 axis 的值替換 NaN 值, 這個差值也就是前后或者上下的中間值
df_titanic['fare'].interpolate(method = 'linear', axis = 0)
#同時,也可以用行值插入
df_titanic['fare'].interpolate(method = 'linear', axis = 1)
-
多重插補(Multiple Imputation)
多值插補的思想來源於貝葉斯估計,認為待插補的值是隨機的,它的值來自於已觀測到的值。具體實踐上通常是估計出待插補的值,然后再加上不同的噪聲,形成多組可選插補值。根據某種選擇依據,選取最合適的插補值。
多重插補方法分為三個步驟:
Step1:為每個空值產生一套可能的插補值,這些值反映了無響應模型的不確定性;每個值都可以被用來插補數據集中的缺失值,產生若干個完整數據集合;
Step2:每個插補數據集合都用針對完整數據集的統計方法進行統計分析;
Step3:對來自各個插補數據集的結果,根據評分函數進行選擇,產生最終的插補值。
-
啞變量填充
若變量是離散型,且不同值較少,可轉換成啞變量,例如性別 SEX 變量,存在 male,fameal,NA 三個不同的值,可將該列轉換成 IS_SEX_MALE、IS_SEX_FEMALE、IS_SEX_NA。若某個變量存在十幾個不同的值,可根據每個值的頻數,將頻數較小的值歸為一類’other’,降低維度。此做法可最大化保留變量的信息。
sklearn中的缺失值填充
sklearn.preprocessing.Imputer(missing_values=’NaN’,
strategy=’mean’, fill_value, axis=0, verbose=0, copy=True)
主要參數說明:
missing_values:缺失值,可以為整數或 NaN(缺失值 numpy.nan 用字符串‘NaN’表示),
默認為 NaN
strategy:替換策略,字符串,默認用均值‘mean’替換
若為mean時,用特征列的均值替換 ② 若為median時,用特征列的中位數替換 ③
若為most_frequent時,用特征列的眾數替換
fill_value: 當strategy為‘constant’的時候可以使用
axis:指定軸數,默認 axis=0 代表列,axis=1 代表行
copy:設置為 True 代表不在原數據集上修改,設置為 False 時,就地修改,存在如下情況時,
即使設置為 False 時,也不會就地修改 ① X不是浮點值數組 ② X是稀疏且missing_values=0 ③
axis=0且X為CRS矩陣 ④ axis=1且X為CSC矩陣 statistics_屬性:axis 設置為 0 時,
每個特征的填充值數組,axis=1 時,報沒有該屬性錯誤
當然也可以使用pandas自帶的方法fillna填充,其實有時候要比sklearn中的填充方法更加方便
參考
《特征工程入門與實踐》
《精通特征工程》
《菜菜sklearn》