异常点检测算法小结

    异常点检测,有时也叫离群点检测,英文通常叫作Novelty Detection或者Outlier Detection,是比较常见的一类非监督学习算法,这里就对异常点检测算法作一个总结。html

1. 异常点检测算法使用场景

    何时咱们须要异常点检测算法呢?常见的有三种状况。一是在作特征工程的时候须要对异常的数据作过滤,防止对归一化等处理的结果产生影响。二是对没有标记输出的特征数据作筛选,找出异常的数据。三是对有标记输出的特征数据作二分类时,因为某些类别的训练样本很是少,类别严重不平衡,此时也能够考虑用非监督的异常点检测算法来作。算法

2. 异常点检测算法常见类别

    异常点检测的目的是找出数据集中和大多数数据不一样的数据,经常使用的异常点检测算法通常分为三类。分布式

    第一类是基于统计学的方法来处理异常数据,这种方法通常会构建一个几率分布模型,并计算对象符合该模型的几率,把具备低几率的对象视为异常点。好比特征工程中的RobustScaler方法,在作数据特征值缩放的时候,它会利用数据特征的分位数分布,将数据根据分位数划分为多段,只取中间段来作缩放,好比只取25%分位数到75%分位数的数据作缩放。这样减少了异常数据的影响。函数

    第二类是基于聚类的方法来作异常点检测。这个很好理解,因为大部分聚类算法是基于数据特征的分布来作的,一般若是咱们聚类后发现某些聚类簇的数据样本量比其余簇少不少,并且这个簇里数据的特征均值分布之类的值和其余簇也差别很大,这些簇里的样本点大部分时候都是异常点。好比我以前讲到的BIRCH聚类算法原理DBSCAN密度聚类算法均可以在聚类的同时作异常点的检测。post

    第三类是基于专门的异常点检测算法来作。这些算法不像聚类算法,检测异常点只是一个赠品,它们的目的就是专门检测异常点的,这类算法的表明是One Class SVM和Isolation Forest.学习

    下文主要会对One Class SVM和Isolation Forest作详细的讨论分析。大数据

3. One Class SVM算法

    One Class SVM也是属于支持向量机你们族的,可是它和传统的基于监督学习的分类回归支持向量机不一样,它是无监督学习的方法,也就是说,它不须要咱们标记训练集的输出标签。优化

    那么没有类别标签,咱们如何寻找划分的超平面以及寻找支持向量呢?One Class SVM这个问题的解决思路有不少。这里只讲解一种特别的思路SVDD, 对于SVDD来讲,咱们指望全部不是异常的样本都是正类别,同时它采用一个超球体而不是一个超平面来作划分,该算法在特征空间中得到数据周围的球形边界,指望最小化这个超球体的体积,从而最小化异常点数据的影响。url

     假设产生的超球体参数为中心 $o$和对应的超球体半径 $r>0$ ,超球体体积 $V(r)$ 被最小化,中心$o$ 是支持向量的线性组合;跟传统SVM方法类似,能够要求全部训练数据点 $x_{i}$ 到中心的距离严格小于 $r $,但同时构造一个惩罚系数为 $C$ 的松弛变量 $\xi_i$,优化问题以下所示:rest

$$\underbrace{min}_{r,o}V(r) + C\sum\limits_{i=1}^m\xi_i$$ $$||x_i-o||_2 \leq r + \xi_i,\;\; i=1,2,...m$$ $$\xi_i \geq 0,\;\;i=1,2,...m$$

    和以前讲的支持向量机系列相似的求解方法,在采用拉格朗日对偶求解以后,能够判断新的数据点 $z$ 是否在类内,若是$z$到中心的距离小于或者等于半径$r$,则不是异常点,若是在超球体之外,则是异常点。

    在sklearn中,咱们能够用svm包里面的OneClassSVM来作异常点检测。OneClassSVM也支持核函数,因此普通SVM里面的调参思路在这里也适用。

4. Isolation Forest算法

    Isolation Forest(如下简称IForest)是周志华老师的学生提出来的,主要是利用集成学习的思路来作异常点检测,目前几乎成为异常点检测算法的首选项,我以前在Bagging与随机森林算法原理小结第4.3节中也简略讲解了IForest的思路,它是随机森林你们族的一员。

    算法自己并不复杂,主要包括第一步训练构建随机森林对应的多颗决策树,这些决策树通常叫iTree,第二步计算须要检测的数据点$x$最终落在任意第t颗iTree的层数$h_t(x)$。而后咱们能够得出$x$在每棵树的高度平均值$h(x)$。第三步根据$h(x)$判断$x$是不是异常点。

    对于第一步构建决策树的过程,方法和普通的随机森林不一样。

    首先采样决策树的训练样本时,普通的随机森林要采样的样本个数等于训练集个数。可是iForest不须要采样这么多,通常来讲,采样个数要远远小于训练集个数。缘由是咱们的目的是异常点检测,只须要部分的样本咱们通常就能够将异常点区别出来了。

    另外就是在作决策树分裂决策时,因为咱们没有标记输出,因此无法计算基尼系数或者和方差之类的划分标准。这里咱们使用的是随机选择划分特征,而后在基于这个特征再随机选择划分阈值,进行决策树的分裂。直到树的深度达到限定阈值或者样本数只剩一个。

    第二步计算要检测的样本点在每棵树的高度平均值$h(x)$。首先须要遍历每一颗iTree,获得检测的数据点$x$最终落在任意第t颗iTree的数层数$h_t(x)$。这个$h_t(x)$表明的是树的深度,也就是离根节点越近,则$h_t(x)$越小,越靠近底层,则$h_t(x)$越大,根节点的高度为0.

    第三步是据$h(x)$判断$x$是不是异常点。咱们通常用下面的公式计算$x$的异常几率分值:$$s(x,m) = 2^{-\frac{h(x)}{c(m)}}$$, $s(x,m)$的取值范围是[0,1],取值越接近于1,则是异常点的几率也越大。其中,m为样本个数。的表达式为:$$ c(m) =2\ln(m-1) + \xi - 2\frac{m-1}{m}, \; \xi 是欧拉常数$$

    从$s(x,m)$表示式能够看出,若是高度$h(x) \to 0$, 则$s(x,m) \to 1$,便是异常点的几率是100%,若是高度$h(x) \to m-1$, 则$s(x,m) \to 0$,即不多是异常点。若是高度$h(x) \to c(m)$, 则$s(x,m) \to 0.5$,便是异常点的几率是50%,通常咱们能够设置$s(x,m)的一个阈值而后去调参,这样大于阈值的才认为是异常点。

    在sklearn中,咱们能够用ensemble包里面的IsolationForest来作异常点检测。

5. 异常点检测算法小结

    IForest目前是异常点检测最经常使用的算法之一,它的优势很是突出,它具备线性时间复杂度。由于是随机森林的方法,因此能够用在含有海量数据的数据集上面。一般树的数量越多,算法越稳定。因为每棵树都是互相独立生成的,所以能够部署在大规模分布式系统上来加速运算。对于目前大数据分析的趋势来讲,它的好用是有缘由的。

    可是IForest也有一些缺点,好比不适用于特别高维的数据。因为每次切数据空间都是随机选取一个维度和该维度的随机一个特征,建完树后仍然有大量的维度没有被使用,致使算法可靠性下降。此时推荐降维后使用,或者考虑使用One Class SVM。

    另外iForest仅对即全局稀疏点敏感,不擅长处理局部的相对稀疏点 ,这样在某些局部的异常点较多的时候检测可能不是很准。

    而One Class SVM对于中小型的数据分析,尤为是训练样本不是特别海量的时候用起来常常会比iForest顺手,所以比较适合作原型分析。

 

(欢迎转载,转载请注明出处。欢迎沟通交流: liujianping-ok@163.com)

相关文章
相关标签/搜索