本章主要讨论离群点的问题。
什么是离群点
离群点检测(又称异常检测)是找出其行为很不同于预期对象的过程,这种对象被称为离群点或异常。
简单来说,离群点就是一个显著不同于其他数据对象的异常数据对象。
这里需要特别注意的是,离群点不同于噪声数据。
噪声数据即是令人不感兴趣的数据,也就是说是在某种情况下,我们关注之外的数据 。
举个例子:在我们想睡觉时,有人大声的播放贝多芬的音乐。在这种情况下,即便它本身是优美的音乐,但是它打扰我休息了,因此它可以被认作是噪声。但是它不是离群点(异常数据)。
在这里为什么要提到噪声呢?因为我们的目的是想检测出异常数据,而假如说在数据集中存在噪声的话,噪声势必会干扰离群点的检测,所以同之前说的KDD的数据预处理一样,我们应当在离群点检测之前就删除噪声数据。
这里多说一些。
我们做KDD的时候,要记住这样一种说法。那就是只要你数据处理得够好,实际上采用何种算法,最终得到的差别并不会太大。
但是正因为我们收集的数据不是那么完善,不是那么统一,在目前又没有什么特别牛逼的数据处理方法和算法,所以我们才要针对各种不同的数据分布啊,不同的数据形式,针对的采用特定的算法,来达到我们的目的。
所以说,是数据和算法都在影响着性能。因此,我们很有必要在跑算法之前,把数据尽可能的处理好。
OK,言归正传。
我们关注异常数据当然是有目的的。比如说,异常检测在欺诈检测,工业损毁检测,图像处理等等领域都有巨大的作用。
但是,异常数据一定都是有害的吗?
显然不是这样的,因为异常数据很有可能代表的是一种潜在的且已隐隐显现的趋势。因此,针对这种情况,我们相应地提出了新颖性检测。
离群点的类型
一般而言,离群点分为三类:
1、全局离群点;
2、条件离群点;
3、集体离群点。
P352,12.1.2详细介绍了离群点的类型。
其中要特别关注它给出的例子。
全局离群点和集体离群点要区分下。
着重关注集体离群点这样一句话:“给定一个数据集,如果数据集的一个子集对象作为整体显著地偏离整个数据集,则该子集形成集体离群点。重要的是,个体数据对象可能不是离群点”。
而全局离群点是这样定于的:“在给定的数据集中,如果一个数据对象它显著地偏离数据集中的其余对象,则它是全局离群点。”
与其他两类不同,在集体离群点检测中,不仅必须考虑个体对象的行为,还要考虑对象组群的行为。
离群点检测方法
书上介绍了目前离群点检测存在的问题和挑战。
目前把离群点检测方法分为几类。
1、统计学方法(有参,无参);
2、基于邻近性方法(距离,密度);
3、基于聚类的方法。
书上都有,也挺好理解的。
这里着重关注下LOF算法(基于密度),P364。
参考这两篇文章
基于密度的局部离群点检测(lof算法) (Java 实现).(这篇文章我认为思路不是很好。)
异常点/离群点检测算法——LOF