数据预处理-缺失值

一.画图查看缺失值分布情况

方法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. 在决策树中可以将缺失值处理融合到算法中:按比重分配

 

 

 

 

 

 

 

 

posted @ 2020-02-20 21:39  少年奶油喵  阅读(1051)  评论(0编辑  收藏  举报