前言
机器学习中数据预处理阶段,首先要考虑的就是将数据集中的异常值找出来,然后再做额外处理。当然,异常值的处理并不存在什么银弹,只能具体情况具体分析再根据效果选择处理方法。
直方图
看看数据集直方图也许能看出点端倪,比如下面这个图,下方的是原始数据集,上面的是对应直方图,可以看到大多数都分布在11000左边,它的右边存在一些分布,这些分布极少的点很可能就是异常点。
sigma原则
一些简单的场景可能直接使用某些准则就能找出异常值,比如3 sigma或5 sigma之类的。如下图,这里用3 sigma准则找到5个异常点。该过程主要计算出平均值mu
和标准差sigma
,然后再比较[mu-3*sigma,mu+3*sigma]
二次sigma处理
如果直接使用sigma原则效果不好,也就是说可能有些没问题的点被识别成异常点,或者有些异常点没有被发现,那么这种情况下可以考虑用二次sigma处理。次使用n1 sigma,第二次n2 sigma。
快速傅里叶变换
如果是周期性的时序数据,假如原始信号包含了噪音,可以考虑用快速傅里叶变换找出异常点。
假设有一个原始时序序列,现在对其添加高斯噪音,高斯噪音直方图为图中第二行,然后变成第三行带高斯噪音的时序序列,增加噪音后看起来相当混乱,所以我们进行傅里叶变换将其转换到频域看能否将噪音分离,计算时通过快速傅里叶变换加快运行。
从频率响应能清楚看到独特的两个点,对应的频率为5,知道频率后可以通过一定的带宽进行噪音分离,那么比如选择0.5,那么频率范围就是[4.5,5.5]。将噪音去除后,我们再通过傅里叶逆变换即能得到去除噪音后的时序信号。
中值方法
类似的还有均值方法,但是均值有时会将差异平均掉了,效果没这么好,于是更多使用中值方法。它的主要思想是定义一个窗口大小,然后通过移动窗口不断将数值与窗口内的中值进行比较,该点与中值的距离如果超过指定的阈值,则说明这是一个异常点。下面是经过中值方法过滤前后。
其他方法
可以使用马尔科夫链蒙特卡洛(MCMC)、高斯过程等等。
github
-------------推荐阅读------------
我的开源项目汇总(机器&深度学习、NLP、网络IO、AIML、mysql协议、chatbot)
跟我交流,向我提问:
欢迎关注: