数据清洗

离群点处理

  • 箱形图

    箱形图(Box plot),又称为盒须图、盒式图、盒状图或箱线图,是一种用作显示一组数据分散情况资料的统计图。因形状如箱子而得名。在各种领域也经常被使用,常见于品质管理,快速识别异常值。箱形图最大的优点就是不受异常值的影响,能够准确稳定地描绘出数据的离散分布情况,同时也利于数据的清洗。想要搞懂箱形图,那么一定要了解五大因“数”。

    我们一组序列数为例:12,15,17,19,20,23,25,28,30,33,34,35,36,37讲解这五大因“数”:

    下四分位数,中位数,上四分位数分别可以表示为Q1,Q2,Q3。他们所在的位置可以表示为

    ​ Qi所在的位置= i×(n+1)/4, 其中i=1,2,3. n为序列中包含的项数。

    • 下四分位数Q1:

      Q1所在的位置=(14+1)/4=3.75,

      Q1=0.25×第三项+0.75×第四项=0.25×17+0.75×19=18.5

    • 中位数(第二个四分位数)Q2:

      Q2所在的位置=2×(14+1)/4=7.5,

      Q2=0.5×第七项+0.5×第八项=0.5×25+0.5×28=26.5

    • 上四分位数Q3:

      Q3所在的位置=3×(14+1)/4=11.25,

      Q3=0.75×第十一项+0.25×第十二项=0.75×34+0.25×35=34.25

    • 上限:

      上限是非异常范围内的最大值,和四分位距有关。

      四分位距IQR=Q3-Q1,那么上限=Q3+1.5IQR=57.875

    • 下限:

      下限是非异常范围内的最小值,和四分位距有关。

      下限=Q1-1.5IQR=-5.125

      箱形图的价值

      (1)直观地识别数据批中的异常值:

      箱形图判断异常值的标准以四分位数和四分位距为基础,四分位数具有一定的耐抗性,多达25%的数据可 以变得任意远而不会很大地扰动四分位数,所以异常值不会影响箱形图的数据形状,箱形图识别异常值的结果比较客观。由此可见,箱形图在识别异常值方面有一定的优越性。

      (2)利用箱形图判断数据批的偏态和尾重:

      对于标准正态分布的样本,只有极少值为异常值。异常值越多说明尾部越重,自由度越小(即自由变动的量的个数)。而偏态表示偏离程度,异常值集中在较小值一侧,则分布呈左偏态;异常值集中在较大值一侧,则分布呈右偏态。

      (3)利用箱形图比较几批数据的形状:

      同一数轴上,几批数据的箱形图并行排列,几批数据的中位数、尾长、异常值、分布区间等形状信息便昭然若揭。

      但箱形图也有他的局限性,比如:不能精确地衡量数据分布的偏态和尾重程度;对于批量比较大的数据,反映的信息更加模糊以及用中位数代表总体评价水平有一定的局限性。

  • 切比雪夫

    切比雪夫定理是一种统计分析的方法,根据属性的期望、标准差,考虑每一个属性取值的置信区间来识别异常的属性和记录。

    切比雪夫定理:随机变量有期望和方差,则对于任意的正数有: 它表明当很小的时候,落入区间是大概率时间。即的概率分布集中在期望附近。

    根据切比雪夫定理,一个属性可以看做是一个随机变量,该变量的取值个数与在该字段有值的记录的数目是相同的。考虑属性的置信区间,如果的值大于或小于,则记录中的属性的值就被认为可能是一个错误。其中是属性的均值,是标准差,用户定义的因子。的值可以基于某些领域知识或数据知识来由用户定义或根据切比雪夫定理从理论上定义。

  • Isolation Forest

    iForest(Isolation Forest)孤立森林是一个基于Ensemble的快速异常检测方法,具有线性时间复杂度和高精准度,是符合大数据处理要求的state-of-the-art算法。其可以用于网络安全中的共计检测,金融交易欺诈检测,疾病检测和噪声数据过滤等。iForest适用于连续数据的异常检测,将异常定义为“容易被孤立的离群点”——可以理解为分布稀疏且离密度高的群体较远的点。用统计学来解释,在数据空间里面,分布稀疏的区域表示数据发生在此区域的概率很低,因此可以认为落在这些区域里的数据是异常的。如下例所示,黑色的点为异常点,白色点为正常点(在一个簇中)。iForest检测到的异常边界为红色,它可以正确地检测到所有黑色异常点。

    iForest属于Non-parametric和unsupervised的方法,即不用定义数学模型也不需要有标记的训练。对于如何查找哪些点是否容易被孤立(isolated),iForest使用了一套非常高效的策略。假设我们用一个随机超平面来切割(split)数据空间(data space), 切一次可以生成两个子空间(想象拿刀切蛋糕一分为二)。之后我们再继续用一个随机超平面来切割每个子空间,循环下去,直到每子空间里面只有一个数据点为止。直观上来讲,我们可以发现那些密度很高的簇是可以被切很多次才会停止切割,但是那些密度很低的点很容易很早的就停到一个子空间了。上图里面黑色的点就很容易被切几次就停到一个子空间,而白色点聚集的地方可以切很多次才停止。

    怎么来切这个数据空间是iForest的设计核心思想。由于切割是随机的,所以需要用ensemble的方法来得到一个收敛值(蒙特卡洛方法),即反复从头开始切,然后平均每次切的结果。iForest 由t个iTree(Isolation Tree)孤立树 组成,每个iTree是一个二叉树结构,其实现步骤如下:

    1. 从训练数据中随机选择Ψ个点样本点作为subsample,放入树的根节点。
    2. 随机指定一个维度(attribute),在当前节点数据中随机产生一个切割点p——切割点产生于当前节点数据中指定维度的最大值和最小值之间。
    3. 以此切割点生成了一个超平面,然后将当前节点数据空间划分为2个子空间:把指定维度里小于p的数据放在当前节点的左孩子,把大于等于p的数据放在当前节点的右孩子。
    4. 在孩子节点中递归步骤2和3,不断构造新的孩子节点,直到 孩子节点中只有一个数据(无法再继续切割) 或 孩子节点已到达限定高度 。

    获得t个iTree之后,iForest 训练就结束,然后我们可以用生成的iForest来评估测试数据了。对于一个训练数据x,我们令其遍历每一棵iTree,然后计算x最终落在每个树第几层(x在树的高度)。然后我们可以得出x在每棵树的高度平均值,即 the average path length over t iTrees。值得注意的是,如果x落在一个节点中含多个训练数据,可以使用一个公式来修正x的高度计算,详细公式见论文

    获得每个测试数据的average path length后,我们可以设置一个阈值(边界值),average path length 低于此阈值的测试数据即为异常。也就是说 “iForest identifies anomalies as instances having the shortest average path lengths in a dataset ”(异常在这些树中只有很短的平均高度). 值得注意的是,论文中对树的高度做了归一化,并得出一个0到1的数值,即越短的高度越接近1(异常的可能性越高)。

    4个测试样本遍历一棵iTree的例子如下:

    我们可以看到,b和c的高度是3,a的高度是2,d的高度是1。所以d最优可能是异常点,因为其最早就被孤立了。

    iForest优缺点:

    • 具有线性时间复杂度,可以用在含有海量数据的数据集上面。通常树的数量越多,算法越稳定。由于每棵树都是互相独立生成的,因此可以部署在大规模分布式系统上来加速运算。
    • iForest不适用于特别高维的数据。由于每次切数据空间都是随机选取一个维度,建完树后仍然有大量的维度信息没有被使用,导致算法可靠性降低。高维空间还可能存在大量噪音维度和无关维度,影响树的构建。
    • iForest仅对Global Anomaly敏感,即全局稀疏点敏感,不擅长处理局部的相对稀疏点。目前已有改进方法发表:Improving iForest with Relative Mass

异常值过滤

  • 高斯密度
  • 删除
  • 忽略
  • 中位数代替
  • 缺省值代替

缺失值处理

  • 删除法:可以删除样本或者删除变量,如果出现40%以上的空值,可以将该特征删除。会存在信息浪费和数据结构变动的问题。

  • 填充法:数值型(连续)的变量一般采用均值填充,非数值型(离散)的变量可以用中位数或者众数。填充法会得到有偏的统计结果。

  • 插补法:回归插补,多重插补等。回归插补法利用回归模型,将需要插值补缺的变量作为因变量,其他相关变量作为自变量,通过回归函数预测出因变量的值来对缺失值进行补缺。多重插补法从一个包含缺失值的数据集中生成一组完整的数据,如此进行多次,从而产生缺失值的一个随机样本。

  • 建模法:用模型进行缺失值的预测。例如数据集中有部分样本有“性别”属性值,我们可以利用决策树,将其他部分特征作为输入来预测该属性值。如果属性值是连续的数值型,还可以通过逻辑回归进行填充。

    举例如下

    由于IRIS数据集没有缺失值,故对数据集新增一个样本,4个特征均赋值为NaN,表示数据缺失。使用preproccessing库的Imputer类对数据进行缺失值计算的代码如下:

    from numpy import vstack, array, nan
    from sklearn.preprocessing import Imputer
    
    #缺失值计算,返回值为计算缺失值后的数据
    #参数missing_value为缺失值的表示形式,默认为NaN
    #参数strategy为缺失值填充方式,默认为mean(均值)
    Imputer().fit_transform(vstack((array([nan, nan, nan, nan]), iris.data)))
    

参考资料

1.https://blog.csdn.net/qq_39303465/article/details/79221254

2.https://wenku.baidu.com/view/baa6346043323968011c92a7.html

3.http://www.cnblogs.com/fengfenggirl/p/iForest.html

4.https://zr9558.com/2016/06/13/outlierdetectionone/

5.https://www.applysquare.com/topic-cn/ShiBHw1ny/

6.https://www.jianshu.com/p/5af3c66e0410?utm_campaign=maleskine

7.http://pyodps.readthedocs.io/zh_CN/latest/df-sort-distinct-apply-zh.html

8.https://blog.csdn.net/zutsoft/article/details/51498026

9.https://www.cnblogs.com/sirkevin/p/5741853.html

10.https://blog.csdn.net/GeekLeee/article/details/75314982

results matching ""

    No results matching ""