數據預處理-缺失值


一.畫圖查看缺失值分布情況

方法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. 在決策樹中可以將缺失值處理融合到算法中:按比重分配

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM