如何从大量数据中找出异常值

前言

机器学习中数据预处理阶段,首先要考虑的就是将数据集中的异常值找出来,然后再做额外处理。当然,异常值的处理并不存在什么银弹,只能具体情况具体分析再根据效果选择处理方法。

直方图

看看数据集直方图也许能看出点端倪,比如下面这个图,下方的是原始数据集,上面的是对应直方图,可以看到大多数都分布在11000左边,它的右边存在一些分布,这些分布极少的点很可能就是异常点。

image

sigma原则

一些简单的场景可能直接使用某些准则就能找出异常值,比如3 sigma或5 sigma之类的。如下图,这里用3 sigma准则找到5个异常点。该过程主要计算出平均值mu和标准差sigma,然后再比较[mu-3*sigma,mu+3*sigma]

image

二次sigma处理

如果直接使用sigma原则效果不好,也就是说可能有些没问题的点被识别成异常点,或者有些异常点没有被发现,那么这种情况下可以考虑用二次sigma处理。第一次使用n1 sigma,第二次n2 sigma。

快速傅里叶变换

如果是周期性的时序数据,假如原始信号包含了噪音,可以考虑用快速傅里叶变换找出异常点。

假设有一个原始时序序列,现在对其添加高斯噪音,高斯噪音直方图为图中第二行,然后变成第三行带高斯噪音的时序序列,增加噪音后看起来相当混乱,所以我们进行傅里叶变换将其转换到频域看能否将噪音分离,计算时通过快速傅里叶变换加快运行。

从频率响应能清楚看到最独特的两个点,对应的频率为5,知道频率后可以通过一定的带宽进行噪音分离,那么比如选择0.5,那么频率范围就是[4.5,5.5]。将噪音去除后,我们再通过傅里叶逆变换即能得到去除噪音后的时序信号。

image

中值方法

类似的还有均值方法,但是均值有时会将差异平均掉了,效果没这么好,于是更多使用中值方法。它的主要思想是定义一个窗口大小,然后通过移动窗口不断将数值与窗口内的中值进行比较,该点与中值的距离如果超过指定的阈值,则说明这是一个异常点。下面是经过中值方法过滤前后。

image

其他方法

可以使用马尔科夫链蒙特卡洛(MCMC)、高斯过程等等。

github

github.com/sea-boat/Ma…

-------------推荐阅读------------

我的开源项目汇总(机器&深度学习、NLP、网络IO、AIML、mysql协议、chatbot)

为什么写《Tomcat内核设计剖析》

我的2017文章汇总——机器学习篇

我的2017文章汇总——Java及中间件

我的2017文章汇总——深度学习篇

我的2017文章汇总——JDK源码篇

我的2017文章汇总——自然语言处理篇

我的2017文章汇总——Java并发篇


跟我交流,向我提问:

欢迎关注:

猜你喜欢

转载自juejin.im/post/5be381e3e51d45305c2ce594