异常值的定义是与均值的偏差超过两倍标准,但是在脏数据中,异常值的情况不止这一种:
1)比如一列数据你打开看全部是数字,当你把它当数值型处理,它会报错;那就得仔细查找原因,遇到比较多的情况是一列数字中夹杂了几个奇怪的字符串或者符号等元素,如果几万条数据中只有一两个这种字符,即使认真从前到后仔细查看也很难发现还浪费大量时间,效率极低。
还有一种情况比较常见,就是看起来是数字,实际上都是字符串的形式,但是以表格查看的时候是看不到字符串的引号;这两种情况可以通过查看特征类型来提前发现,在python中用type()或者dtypes()函数,两者使用对象有差别,可自行了解;
2)几种常用异常值检测方法:
- 3σ探测方法
3σ探测方法的思想其实就是来源于切比雪夫不等式。
对于任意ε>0,有:
当时,如果总体为一般总体的时候,统计数据与平均值的离散程度可以由其标准差反映,因此有:
- 一般所有数据中,至少有3/4(或75%)的数据位于平均2个标准差范围内。
- 所有数据中,至少有8/9(或88.9%)的数据位于平均数3个标准差范围内。
- 所有数据中,至少有24/25(或96%)的数据位于平均数5个标准差范围内。
所以如果我们一般是把超过三个离散值的数据称之为异常值。这个方法在实际应用中很方便的使用,但是他只有在单个属性的情况下才适用。
- z-score
Z-score是一维或低维特征空中的参数异常检测方法。该技术假定数据是高斯分,异常值是分布尾部的数据点,因此远离数据的平均值。距离的远近取决于使用公式计算的归一化数点z i的设定阈值Zthr:
其中xi是一个数据点,μ是所有点xi的平均值,δ是所有点xi的标准偏。
然后经过标准化处理后,异常值也进行标准化处理,其绝对值大于Zthr:
Zthr值一般设置为2.5、3.0和3.5。该技术是使用KNIME工作流中的行过滤器节点实现的。
这种异常值处理需要结合最终需求来决定怎么处理,常见的是不处理或者按缺失值的方法处理,但是在实际场景中,异常值有时候会有非常突出的表现,比如在现金贷业务中,异常值中的坏账率远高于整体坏账水平或其他区间坏账水平,这时候异常值就得保留并作为决策阈值的参考值。
- IQR
观察箱型图,或者通过IQR(InterQuartile Range)计算可以得到数据分布的第一和第四分位数,异常值是位于四分位数范围之外的数据点。
这个方法真的很简单,因为只需要给数据排个序就行了,显然过于笼统,但在实际场景中,观察箱型图仍然是一个很好的探索数据分布的方法。
毕竟,所有复杂的探索,都是从最开始简单的探索一步步得来的嘛!
三.缺失值处理