其他分享
首页 > 其他分享> > 特征工程系列:(二)缺失值处理

特征工程系列:(二)缺失值处理

作者:互联网

Pandas判断缺失值

df.isnull().sum()  #显示每一列的空值个数 

data.info()  #可以直观的查看缺失值 

注意,有些数据用0代替特征值,这个时候,可以将0用None 代替,这样,isnull 函数就可以检测出来了,而且fillna 和dropna函数都可以直接工作了。

处理缺失值

直接删除

将存在遗漏信息属性值的对象(元组,记录)删除,从而得到一个完备的信息表。

优点:简单易行,在对象有多个属性缺失值、被删除的含缺失值的对象与初始数据集的数据量相比非常小的情况下有效;

不足:当缺失数据所占比例较大,特别当遗漏数据非随机分布时,这种方法可能导致数据发生偏离,从而引出错误的结论。

如何判断直接删除数据后,对数据造成的影响,可以计算原始数据均值,和删除后,数据的均值的变化图,如果变化很大,那么最好不要直接删除数据

( p_drop.mean() - p.mean() ) / p.mean()

数据填充

用一定的值去填充空值,从而使信息表完备化。通常基于统计学原理,根据初始数据集中其余对象取值的分布情况来对一个缺失值进行填充。

  1. 人工填充(filling manually)

    根据业务知识来进行人工填充。

  2. 统计量填充

    若缺失率较低(小于 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) 
    
  3. 模型预测填充

    使用待填充字段作为 Label,没有缺失的数据作为训练数据,建立分类/回归模型,对待填充的缺失字段 进行预测并进行填充。

    最近距离邻法(KNN)先根据欧式距离或相关分析来确定距离具有缺失数据样本最近的 K 个样本,将这 K 个值加权平均/投票来估计该样本的缺失数据。

    回归(Regression)基于完整的数据集,建立回归方程。对于包含空值的对象,将已知属性值代入方程来估计未知属性值,以此估计值来进行填充。当变量不
    是线性相关时会导致有偏差的估计,常用线性回归。

  4. 插值法填充包括随机插值,多重插补法,热平台插补,拉格朗日插值,牛顿插值等。

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教程》

标签:系列,填充,特征,插补,mean,数据,缺失,axis
来源: https://www.cnblogs.com/quant-q/p/15025400.html