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

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. 插值法填充包括随机插值,多重插补法,热平台插补,拉格朗日插值,牛顿插值等。

  • 线性插值法

    使用插值法可以计算缺失值的估计值,所谓的插值法就是通过两点(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教程》

上一篇:DW集成学习Task8—案例二蒸汽量预测


下一篇:Go 语言类型转换