缺失值清洗

缺失值清洗

没有高质量的数据,就没有高质量的数据挖掘结果,数据值缺失是数据分析中经常遇到的问题之一。

1.造成缺失值的原因

  • 信息暂时无法获取;
    • 如商品售后评价、双十一的退货商品数量和价格等具有滞后效应。
  • 信息被遗漏;
    • 可能是因为输入时认为不重要、忘记填写了或对数据理解错误而遗漏,也可能是由于数据采集设备的故障、存储介质的故障、传输媒体的故障、一些人为因素等原因而丢失。
      这个在很多公司恐怕是习以为常的事情。
  • 获取这些信息的代价太大;
    • 如统计某校所有学生每个月的生活费,家庭实际收入等等。
  • 系统实时性能要求较高;
    • 即要求得到这些信息前迅速做出判断或决策。
  • 有些对象的某个或某些属性是不可用的。
    • 如一个未婚者的配偶姓名、一个儿童的固定收入状况等。

2.缺失数据处理方法

1) 删除元组

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

优点:

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

不足:

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

2)数据填充

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

数据填充的方法有多种,此处先不展开,下面章节将会详细介绍。

3)不处理

不处理缺失值,直接在包含空值的数据上进行数据挖掘的方法包括XGBoost、贝叶斯网络和人工神经网络等。

补齐处理只是将未知值补以我们的主观估计值,不一定完全符合客观事实,在对不完备信息进行补齐处理的同时,我们或多或少地改变了原始的信息系统。而且,对空值不正确的填充往往将新的噪声引入数据中,使挖掘任务产生错误的结果。因此,在许多情况下,我们还是希望在保持原始信息不发生变化的前提下对信息系统进行处理。

3.数据填充的方法

1)人工填充(filling manually)

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

2)特殊值填充(Treating Missing Attribute values as Special values)

将空值作为一种特殊的属性值来处理,它不同于其他的任何属性值。如所有的空值都用“unknown”填充。一般作为临时填充或中间过程。

实现代码

df['Feature'].fillna('unknown', inplace=True)

3)统计量填充

若缺失率较低(小于95%)且重要性较低,则根据数据分布的情况进行填充。

常用填充统计量:

  • 平均值:
    对于数据符合均匀分布,用该变量的均值填补缺失值。
  • 中位数:
    对于数据存在倾斜分布的情况,采用中位数填补缺失值。
  • 众数:
    离散特征可使用众数进行填充缺失值。

平均值填充法:

  • 将初始数据集中的属性分为数值属性和非数值属性来分别进行处理。
# 均值填充
df['Feature1'].fillna(df['Feature1'].mean(), inplace=True)
# 中位数填充
df['Feature2'].fillna(df['Feature2'].median(), inplace=True)
# 众数填充
df['Feature2'].fillna(df['Feature2'].mode(), inplace=True)

条件平均值填充法(Conditional Mean Completer):

在该方法中,用于求平均值/众数/中位数并不是从数据集的所有对象中取,而是从与该对象具有相同决策属性值的对象中取得。

# 条件平均值填充
def condition_mean_fillna(df, label_name, feature_name):
    mean_feature_name = '{}Mean'.format(feature_name)
    group_df = df.groupby(label_name).mean().reset_index().rename(columns={feature_name: mean_feature_name})

    df = pd.merge(df, group_df, on=label_name, how='left')
    df.loc[df[feature_name].isnull(), feature_name] = df.loc[df[feature_name].isnull(), mean_feature_name]
    df.drop(mean_feature_name, inplace=True, axis=1)
    return df

df = condition_mode_fillna(df, 'Label', 'Feature2')

回归(Regression)

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

5)插值法填充

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

线性插值法

使用插值法可以计算缺失值的估计值,所谓的插值法就是通过两点(x0,y0),(x1,y1)估计中间点的值,假设y=f(x)是一条直线,通过已知的两点来计算函数f(x),然后只要知道x就能求出y,以此方法来估计缺失值。

实现代码

df['Feature'] = df['Feature'].interpolate()

多重插补(Multiple Imputation)

多值插补的思想来源于贝叶斯估计,认为待插补的值是随机的,它的值来自于已观测到的值。具体实践上通常是估计出待插补的值,然后再加上不同的噪声,形成多组可选插补值。根据某种选择依据,选取最合适的插补值。

多重插补方法分为三个步骤:

  • Step1:
    为每个空值产生一套可能的插补值,这些值反映了无响应模型的不确定性;
    每个值都可以被用来插补数据集中的缺失值,产生若干个完整数据集合;
  • Step2:
    每个插补数据集合都用针对完整数据集的统计方法进行统计分析;
  • Step3:
    对来自各个插补数据集的结果,根据评分函数进行选择,产生最终的插补值。

6)哑变量填充

若变量是离散型,且不同值较少,可转换成哑变量,例如性别SEX变量,存在male,fameal,NA三个不同的值,可将该列转换成 IS_SEX_MALE、IS_SEX_FEMALE、IS_SEX_NA。若某个变量存在十几个不同的值,可根据每个值的频数,将频数较小的值归为一类’other’,降低维度。此做法可最大化保留变量的信息。

实现代码

sex_list = ['MALE', 'FEMALE', np.NaN, 'FEMALE', 'FEMALE', np.NaN, 'MALE',]
df = pd.DataFrame({'SEX': sex_list})
display(df)

df.fillna('NA', inplace=True)
df = pd.get_dummies(df['SEX'],prefix='IS_SEX')
display(df)

7)热卡填充(Hot deck imputation,就近补齐)

热卡填充法在完整数据中找到一个与它最相似的对象,然后用这个相似对象的值来进行填充。不同的问题可能会选用不同的标准来对相似进行判定。该方法概念上很简单,且利用了数据间的关系来进行空值估计。

这个方法的缺点在于难以定义相似标准,主观因素较多。

8)期望值最大化填充(Expectation maximization,EM)

EM算法是一种在不完全数据情况下计算极大似然估计或者后验分布的迭代算法。在每一迭代循环过程中交替执行两个步骤:E步(Excepctaion step,期望步),在给定完全数据和前一次迭代所得到的参数估计的情况下计算完全数据对应的对数似然函数的条件期望;M步(Maximzation step,极大化步),用极大化对数似然函数以确定参数的值,并用于下步的迭代。算法在E步和M步之间不断迭代直至收敛,即两次迭代之间的参数变化小于一个预先给定的阈值时结束。该方法可能会陷入局部极值,收敛速度也不是很快,并且计算很复杂。

缺点:由线性模型化所报告的软件标准误和检验统计量并不正确,且对于过度识别模型,估计值不是全然有效的。

4.缺失值处理步骤

1)确定缺失值范围

对每个字段都计算其缺失值比例,然后按照缺失比例和字段重要性,分别制定策略,可用下图表示:

2)去除不需要的字段

建议清洗每做一步都备份一下,或者在小规模数据上试验成功再处理全量数据。

3)填充缺失内容

使用上面介绍的任意一种或多种方法填充缺失数据。

4)重新取数

如果某些指标非常重要又缺失率高,那就需要和取数人员或业务人员了解,是否有其他渠道可以取到相关数据。

非需求数据清洗

简单来说就是把不要的字段删了。

看起来简单,但实际操作中容易有以下问题:

  • 把看上去不需要但实际上对业务很重要的字段删了;
  • 某个字段觉得有用,但又没想好怎么用,不知道是否该删;
  • 一时看走眼,删错字段了。

在实际操作中,如果不知道哪些是非需求数据,可以不进行非需求数据清洗,在数据预处理之后再进行特征筛选

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值