概述
统计学⽅法对数据的正常性做出假定。它们假定正常的数据对象由⼀个统计模型产⽣,而不遵守该模型的数据是异常点。统计学⽅法的有效性⾼度依赖于对给定数据所做的统计模型假定是否成⽴。
异常检测的统计学⽅法的⼀般思想是:学习⼀个拟合给定数据集的⽣成模型,然后识别该模型低概率区域中的对象,把它们作为异常点。即利⽤统计学⽅法建⽴⼀个模型,然后考虑对象有多⼤可能符合该模型。
根据如何指定和学习模型,异常检测的统计学⽅法可以划分为两个主要类型:参数⽅法和⾮参数⽅法。
参数⽅法假定正常的数据对象被⼀个以 为参数的参数分布产⽣。该参数分布的概率密度函数给出对象被该分布产⽣的概率。该值越小,越可能是异常点。⾮参数⽅法并不假定先验统计模型,而是试图从输⼊数据确定模型。
⾮参数⽅法通常假定参数的个数和性质都是灵活的,不预先确定(所以⾮参数⽅法并不是说模型是完全⽆参的,完全⽆参的情况下从数据学习模型是不可能的)
参数⽅法
基于正态分布的⼀元异常点检测
仅涉及⼀个属性或变量的数据称为⼀元数据。我们假定数据由正态分布产⽣,然后可以由输⼊数据学习正态分布的参数,并把低概率的点识别为异常点。
首先根据样本集计算期望
μ
\mu
μ和方差
σ
2
\sigma^2
σ2
根据概率密度函数计算数据点服从该分布的概率,有可能是异常点。如果计算出来的概率低于阈值,就可以认为该数据点为异常点。
阈值是个经验值,可以选择在验证集上使得评估指标值最⼤(也就是效果最好)的阈值取值作为最终阈值。
例如常⽤的3sigma原则中,如果数据点超过范围
(
μ
−
3
σ
,
μ
+
3
σ
)
(\mu-3 \sigma, \mu+3 \sigma)
(μ−3σ,μ+3σ) ,那么这些点很有可能是异常点。
自制python代码如下:
def outlier_detect(self,x): #超参3
left,med,right=np.percentile(x, (25, 50, 75), interpolation='midpoint')
iqr=abs(left-right);
threshold_up = med + 3 * iqr;
threshold_down = med- 3 * iqr;
return ((np.max(x)>threshold_up)|(np.min(x)<threshold_down)).astype(int)
多元异常点检测
涉及两个或多个属性或变量的数据称为多元数据。许多⼀元异常点检测⽅法都可以扩充,⽤来处理多元数据。其核⼼思想是把多元异常点检测任务转换成⼀元异常点检测问题。例如基于正态分布的⼀元异常点检测扩充到多元情形时,可以求出每⼀维度的均值和标准差。对于第j维:
μ
j
=
1
m
∑
i
=
1
m
x
j
(
i
)
σ
j
2
=
1
m
∑
i
=
1
m
(
x
j
(
i
)
−
μ
j
)
2
\begin{aligned} \mu_{j} &=\frac{1}{m} \sum_{i=1}^{m} x_{j}^{(i)} \\ \sigma_{j}^{2} &=\frac{1}{m} \sum_{i=1}^{m}\left(x_{j}^{(i)}-\mu_{j}\right)^{2} \end{aligned}
μjσj2=m1i=1∑mxj(i)=m1i=1∑m(xj(i)−μj)2
计算概率时的概率密度函数为
p
(
x
)
=
∏
j
=
1
n
p
(
x
j
;
μ
j
,
σ
j
2
)
=
∏
j
=
1
n
1
2
π
σ
j
exp
(
−
(
x
j
−
μ
j
)
2
2
σ
j
2
)
p(x)=\prod_{j=1}^{n} p\left(x_{j} ; \mu_{j}, \sigma_{j}^{2}\right) = \prod_{j=1}^{n} \frac{1}{\sqrt{2 \pi} \sigma_{j}} \exp \left(-\frac{\left(x_{j}-\mu_{j}\right)^{2}}{2 \sigma_{j}^{2}}\right)
p(x)=∏j=1np(xj;μj,σj2)=∏j=1n2πσj1exp(−2σj2(xj−μj)2)
这是在各个维度的特征之间相互独⽴的情况下。如果特征之间有相关性,就要⽤到多元⾼斯分布了。
使⽤混合参数分布
在许多情况下假定数据是由正态分布产⽣的。当实际数据很复杂时,这种假定过于简单,可以假定数据是被混合参数分布产⽣的。
⾮参数⽅法
在异常检测的⾮参数⽅法中,“正常数据”的模型从输⼊数据学习,而不是假定⼀个先验。通常,⾮参数⽅法对数据做较少假定,因而在更多情况下都可以使⽤。
直⽅图是⼀种频繁使⽤的⾮参数统计模型,可以⽤来检测异常点。该过程包括如下两步:
步骤1:构造直⽅图。使⽤输⼊数据(训练数据)构造⼀个直⽅图。该直⽅图可以是⼀元的,或者多元的(如果输⼊数据是多维的)。
尽管⾮参数⽅法并不假定任何先验统计模型,但是通常确实要求⽤⼾提供参数,以便由数据学习。例如,⽤⼾必须指定直⽅图的类型(等宽的或等深的)和其他参数(直⽅图中的箱数或每个箱的⼤小等)。与参数⽅法不同,这些参数并不指定数据分布的类型。
步骤2:检测异常点。为了确定⼀个对象是否是异常点,可以对照直⽅图检查它。在最简单的⽅法中,如果该对象落⼊直⽅图的⼀个箱中,则该对象被看作正常的,否则被认为是异常点。
对于更复杂的⽅法,可以使⽤直⽅图赋予每个对象⼀个异常点得分。例如令对象的异常点得分为该对象落⼊的箱的容积的倒数。
使⽤直⽅图作为异常点检测的⾮参数模型的⼀个缺点是,很难选择⼀个合适的箱尺⼨。⼀⽅⾯,如果箱尺⼨太小,则许多正常对象都会落⼊空的或稀疏的箱中,因而被误识别为异常点。另⼀⽅⾯,如果箱尺⼨太⼤,则异常点对象可能渗⼊某些频繁的箱中,因而“假扮”成正常的。
HBOS
HBOS全名为:Histogram-based Outlier Score。它是⼀种单变量⽅法的组合,不能对特征之间的依赖关系进⾏建模,但是计算速度较快,对⼤数据集友好。其基本假设是数据集的每个维度相互独⽴。然后对每个维度进⾏区间(bin)划分,区间的密度越⾼,异常评分越低。
HBOS算法流程:
1.为每个数据维度做出数据直⽅图。对分类数据统计每个值的频数并计算相对频率。对数值数据根据分布的不同采⽤以下两种⽅法:
2.对每个维度都计算了⼀个独⽴的直⽅图,其中每个箱⼦的⾼度表⽰密度的估计。然后为了使得最⼤⾼度为1(确保了每个特征与异常值得分的权重相等),对直⽅图进⾏归⼀化处理。最后,每⼀个实例的HBOS值由以下公式计算:
H
B
O
S
(
p
)
=
∑
i
=
0
d
log
(
1
hist
i
(
p
)
)
H B O S(p)=\sum_{i=0}^{d} \log \left(\frac{1}{\operatorname{hist}_{i}(p)}\right)
HBOS(p)=∑i=0dlog(histi(p)1)
总结
1.异常检测的统计学⽅法由数据学习模型,以区别正常的数据对象和异常点。使⽤统计学⽅法的⼀个优点是,异常检测可以是统计上⽆可⾮议的。当然,仅当对数据所做的统计假定满⾜实际约束时才为真。
2.HBOS在全局异常检测问题上表现良好,但不能检测局部异常值。但是HBOS⽐标准算法快得多,尤其是在⼤数据集上。