一.畫圖查看缺失值分布情況
方法1
import missingno as msno # pip install missingno msno.matrix(train_data);
方法2
缺失值高亮
# matplotlib畫缺失值 plt.imshow(train_data.isna(),aspect='auto');
二. 缺失值處理方式
依據業務邏輯和缺失值占比,目標保證對預測結果影響越小越好
1. 占比較多:如80%以上,刪除缺失值所在列(如果對字段有特殊需求,那就刪除樣本,前提是樣本足夠多)
# 刪除NOD缺失值樣本 train_data.dropna(inplace=True)
train_data.shape
2. 占比一般:30%-80%,將缺失值作為單獨的類
3. 占比少:10%-30% , 多重插補:通過特征進行相互間的預測
隨機森林回歸填補(連續性數據)
方法1
# 多重插補:隨機森林回歸器填補 from sklearn.ensemble import RandomForestRegressor def fill_missing(data,to_fill): ''' data:數據集 to_fill:需要填補的特征列 ''' # 構建新的特征和標簽 df = data.copy() columns = [*train_data.columns] columns.remove(to_fill) # 將需要預測的標簽移除 # 移除有缺失值的列 columns.remove('NumberOfDependents') # 提取特征和標簽,並划分訓練集和測試集,訓練集指的是月收入中沒有缺失值的樣本,測試集指的是需要預測的缺失值的樣本 X = df.loc[:,columns] # 特征 y = df.loc[:,to_fill] # 標簽 Xtrain = X.loc[df[to_fill].notnull()] # 訓練數據 Xtest = X.loc[df[to_fill].isnull()] # 測試數據 Ytrain = y.loc[df[to_fill].notnull()] model = RandomForestRegressor(n_estimators=200,max_depth=3,n_jobs=-1,random_state=0) model.fit(Xtrain,Ytrain) # 預測 pred = model.predict(Xtest).round() # 進行填補 df.loc[df[to_fill].isnull(),to_fill] = pred return df train_data = fill_missing(train_data,'MonthlyIncome') train_data.info()
方法2
# 方法二:用隨機森林對缺失值預測填充函數 def set_missing(df): # 把已有的數值型特征取出來 process_df = df.iloc[:,[5,0,1,2,3,4,6,7,8,9]] # 分成已知該特征和未知該特征兩部分 known = process_df[process_df.MonthlyIncome.notnull()] unknown = process_df[process_df.MonthlyIncome.isnull()] # X為特征屬性值 X = known.iloc[:, 1:] # y為結果標簽值 y = known.iloc[:, 0] # fit到RandomForestRegressor之中 rfr = RandomForestRegressor(random_state=0, n_estimators=200,max_depth=3,n_jobs=-1)#,n_jobs=- 根據CPU的性能進行 rfr.fit(X,y) # 用得到的模型進行未知特征值預測 predicted = rfr.predict(unknown.iloc[:, 1:]).round(0) # print(predicted) # 用得到的預測結果填補原缺失數據 df.loc[(df.MonthlyIncome.isnull()), 'MonthlyIncome'] = predicted return df
分類型數據用卡方或者分箱
4. 占比較少:10%以上,單一值替換:中位數(連續型)、均值(連續性)、眾數(分型型)
左偏右偏,用中位數
正太分布用均值
分類型變量用眾數
5. 在決策樹中可以將缺失值處理融合到算法中:按比重分配