- 无监督学习算法
- 做特征工程的时候需要对异常数据做过滤,防止对归一化等处理的结果产生影响。
- 对没有标记输出的特征数据做筛选,找出异常的数据
- 对有标记输出的特征数据做二分类时,对某些训练样本非常少的类别,可以考虑用非监督的异常点检测算法来做。
异常点检测算法常见类别
- 基于统计学的方法来处理异常数据,这种方法一般会构建一个概率分布模型,并计算对象符合该模型的概率,把具有低概率的对象视为异常点。
preprocessing.RobustScaler:在做数据特征值缩放的时候,利用数据特征的分位数分布,将数据根据分位数划分为多段,只取中间段来做缩放,比如只取25%分位数到75%分位数的数据做缩放。 - 基于聚类方法来做异常点检测。
如果聚类后发现某些聚类簇的数据样本量比其他簇少很多,而且这个簇内数据的特征均值分布和其他簇也差异很大,这些簇内的样本点大概率是异常点。 - 基于专门的异常点检测算法来做。
专门检测异常点,One Class SVM和Isolation Forest
svm.OneClassSVM
- 无监督学习,不需要标记训练集的输出标签。
- 期望所有不是异常的样本都是正类别,它采用一个超球体而不是超平面来做划分,该算法在特征空间中获得球形边界,判断新的数据点 𝑧 是否在球内,如果𝑧到中心的距离小于或者等于半径𝑟,则不是异常点,如果在超球体以外,则是异常点。
- 期望最小化这个超球体的体积,从而最小化异常点数据的影响。 m i n ⏟ r , o V ( r ) + C ∑ i = 1 m ξ i \underbrace{min}_{r,o}V(r) + C\sum\limits_{i=1}^m\xi_i r,o minV(r)+Ci=1∑mξi ∣ ∣ x i − o ∣ ∣ 2 ≤ r + ξ i , ξ i ≥ 0 , i = 1 , 2 , . . . m ||x_i-o||_2 \leq r + \xi_i,\;\xi_i\geq0, \;i=1,2,...m ∣∣xi−o∣∣2≤r+ξi,ξi≥0,i=1,2,...m
ensemble.IsolationForest
- 第一步训练构建随机森林对应的n颗决策树,iTree
- 计算需要检测的数据点𝑥最终落在任意第t颗iTree的层数 h t ( x ) h_t(x) ht(x),得出𝑥在每棵树的高度平均值 h ( x ) h_(x) h(x)
- 根据 h ( x ) h_(x) h(x)判断𝑥是否是异常点
- 采样决策树的训练样本时,普通的随机森林要采样的样本个数等于训练集个数。但一般来说,iTree采样个数要远远小于训练集个数。只需要部分样本一般就可以将异常点区别出来。
- 随机选择划分特征,然后基于这个特征再随机选择划分阈值,进行决策树的分裂。直到树的深度达到限定阈值或者样本数只剩一个。
- 遍历每一颗iTree,得到检测的数据点𝑥最终落在任意第t颗iTree的数层数 h t ( x ) h_t(x) ht(x),根节点的高度为0。
- 计算𝑥的异常概率分值: s ( x , m ) = 2 − h ( x ) c ( m ) s(x,m) = 2^{-\frac{h(x)}{c(m)}} s(x,m)=2−c(m)h(x) c ( m ) = 2 ln ( m − 1 ) + ξ − 2 m − 1 m , ξ 是 欧 拉 常 数 c(m) =2\ln(m-1) + \xi - 2\frac{m-1}{m}, \; \xi 是欧拉常数 c(m)=2ln(m−1)+ξ−2mm−1,ξ是欧拉常数 𝑠(𝑥,𝑚) 的取值范围是[0,1],取值越接近于1,则是异常点的概率也越大。m为样本个数。
- h ( x ) → 0 h(x)→0 h(x)→0, 则 s ( x , m ) → 1 s(x,m)→1 s(x,m)→1; h ( x ) → m − 1 h(x)→m-1 h(x)→m−1, 则 s ( x , m ) → 0 s(x,m)→0 s(x,m)→0。
异常点检测小结
- IForest是异常点检测最常用的算法之一。
- 它具有线性时间复杂度;树的数量越多,算法越稳定;可以在大规模分布式系统上来加速运算。
- 不适用于特别高维的数据,每次都是随机选取一个维度和该维度的随机一个特征,建完树后仍然有大量的维度没有被使用,导致算法可靠性降低。此时推荐降维后使用,或考虑使用One Class SVM。
- 仅对全局稀疏点敏感,不擅长处理局部的相对稀疏点 ,这样在某些局部的异常点较多的时候检测可能不是很准。
- One Class SVM较适合对中小型数据的分析,尤其是训练样本不是特别海量时。