8

大数据之路 ——(一)算法建模中的数据清洗

 3 years ago
source link: https://my.oschina.net/u/3620858/blog/5165550
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

大数据之路 ——(一)算法建模中的数据清洗

作者:Mochou

来源:恒生LIGHT云社区

在当前大数据的背景下,数据处理占了极大的份额,就像一个西红柿做成西红柿炒鸡蛋,需要经过调料整合,菜料清洗,饭菜加工等等才能发布到生产,不,发送到餐桌。

这里简单分享一下我对数据清洗的理解,其具有很重要的地位,不然面对着脏乱差的西红柿炒鸡蛋,没人愿意下口。

一份未经清洗过的数据一般会存在这些不符合分析要求的问题:比如重复,错误,空值,异常数据等,对于错误数据,因为是业务源头问题,比如性别明明是男却成了女,这些我们无法处理,只能从源端进行规范,就像顾客想吃河南的西红柿,厨房里进的只有山东的,这个厨师没办法解决,只能通知进货商更改。故我们只对另外三个问题进行清洗修改,必须申明一点,所有的清洗都要基于实际业务来做,比如重复,可能业务要的就是重复,你给人家洗掉了,就产生了问题

1627760456(1).jpg

如果实际业务不要重复值,重复值可以直接删除,比如数据库里可以在整合合并时用union而不是union all ,不支持union的可以用主键分组排序取第一个

row_number() over (partition by .. order by..desc) as..

如果也不支持row_number,,,那好好活着吧。

其他语言也都有类似的去重函数,如python可以直接用drop_duplicates()

缺失也就是空值,需要明确一点,‘空’有两种情况,一种是真正的对象为空,即null,一种是空值,即xxx='',所以我们处理这些空值时需要分两种情况,一种是xxx is null, 一种是length(trim(xxx))=0。

空值处理一般是填补,这个根据实际业务需要来做,一般来讲,

  • 空值数量比较小时可以填补上连续值的某一个,比如平均数,中位数等;
  • 空值较多时,占了五成以上,可以考虑使用众数来填补;
  • 空值占了绝大部分,这个时候就没必要再用原有的数据,可以自己造数据,生成一个指示哑变量,参与后续的建模需要。

前面已经说过在数据库里怎么处理,这里说下在python里如何处理

# 列出空值在每个列所占的比重
# df是数据集,col.size是当前数据的行数
df.apply(lambda col:sum(col.isnull())/col.size)
# 用均值填补,使用pandas包里的fillna
df.col1.fillna(df.col1.mean())
三 . 噪声值

噪声值是指数据中与其他数值相比差异比较大的值,也有的叫离群点等,比如年龄里出来几个150以上的。噪声值会严重干扰模型结果,使结论不真实或偏颇。所以必须要清除这些噪声值,常用的方法:对于单变量的有盖帽法,分箱法,多变量的有聚类法。

我们都学过正态分布,对于均值上下三倍标准差范围外的记录值加一块的概率才为0.01%,故我们可以把这些外围数据替换为各自的均值上下三倍标准差值,即为盖帽法

1627760879(1).jpg

数据库里可以用case when来替换,python可以写一个函数

def cap(x,quantile=[0.01,0.99]):
'''盖帽法处理异常值
Args:
    x:是series列,连续变量
    quantile:上下分位数范围,这里写为0.01和0.99
'''
 
# 生成分位数,Q01,Q99分别是百分之一分位点和百分之99分位点
    Q01,Q99=x.quantile(quantile).values.tolist()
 
# 替换异常值为制定的分位数
 
    if Q01 > x.min():
        x = x.copy()
        x.loc[x < Q01] = Q01
    if Q99 < x.max():
        x = x.copy()
        x.loc[x > Q99] = Q99
    return(x)

分箱法通过考察数据的“近邻”来光滑有序数据的值,有序值分布到一些箱中,通过取各个箱子的特定值如最值,均值,中位数等,这个值就是这个箱子的值,然后置定标准评判这些箱子的值好坏,从而判断各个箱子是好的还是坏的,坏的箱子需要特殊处理。分箱法分为等深分箱:每个分箱样本量一致,等宽分箱:每个分箱取值范围一致。

比如一组数 1 2 66 8 9 2 1 4 6,先排序 1 1 2 2 4 6 8 9 66,再分为三个箱子 箱子A:1 1 2 箱子B:2 4 6 箱子C:8 9 66

我们这里取箱子的平均数,则A为1.3 B为4 C为27.3 很明显这个C值远远大于这组数据的均值和中位数,所以C箱子是坏箱子,则可以集中处理C里的数据

前面介绍的都是单变量,多变量的异常值处理需要用到聚类法。

它的思想是正常值都拥有相似的标签,比如前面好的西红柿颜色都是红润的,口感都是酸甜的,表皮都是完整的等等,而坏的西红柿则拥有异于“他人”的特征,比如味道怪异。故我们可以把数据对象分为多个集合,在同一个集合里的对象有较高的相似度,而不同的集合之间的对象差别较大。聚类分析可以通过这些不同的集合挖掘出孤立点,这些孤立点往往就是异常数据。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK