文章目录
一、什么是异常检测
异常检测(Anomaly detection)主要用于检测异常数据。
举个🌰,假想你是一个飞机引擎制造商,当你生产的飞机引擎从生产线上流出时,你需要进行QA(质量控制测试),而作为这个测试的一部分,你测量了飞机引擎的一些特征变量,比如引擎运转时产生的热量,或者引擎的振动等等。这样一来,你就有了一个数据集,从 x ( 1 ) x^{(1)} x(1) 到 x ( m ) x^{(m)} x(m),如果你生产了 m m m 个引擎的话,你将这些数据绘制成图表,看起来就是这个样子:
这里的每个点、每个叉,都是你的无标签数据。这样,异常检测问题可以定义如下:我们假设后来有一天,你有一个新的飞机引擎从生产线上流出,而你的新飞机引擎有特征变量 x ( t e s t ) x^{(test)} x(test)。所谓的异常检测问题就是:我们希望知道这个新的飞机引擎是否有某种异常,或者说,我们希望判断这个引擎是否需要进一步测试。因为,如果它看起来像一个正常的引擎,那么我们可以直接将它运送到客户那里,而不需要进一步的测试。
给定数据集 { x ( 1 ) , x ( 2 ) , … , x ( m ) } \{x^{(1)},x^{(2)},\ldots,x^{(m)}\} {x(1),x(2),…,x(m)},我们假使数据集是正常的,我们希望知道新的数据 x ( t e s t ) x^{(test)} x(test) 是不是异常的,即这个测试数据不属于该组数据的几率如何。我们所构建的模型应该能根据该测试数据的位置告诉我们其属于一组数据的可能性 p ( x ) p(x) p(x)。
上图中,蓝色圈内的数据看上去数据正常点的概率较高,而处理蓝色圈外的数据,距离越远,属于正常数据的概率越低。
异常检测还可以用来识别欺诈,例如在线采集而来的有关用户的数据,一个特征向量中可能会包含如:用户多久登录一次,访问过的页面,在论坛发布的帖子数量,甚至是打字速度等。尝试根据这些特征构建一个模型,可以用这个模型来识别那些不符合该模式的用户。
二、异常检测原理
2.1 高斯分布
假设变量
x
x
x 服从高斯分布
N
(
μ
,
σ
2
)
N(\mu,\sigma^2)
N(μ,σ2),则其概率密度函数为
p
(
μ
,
σ
2
)
=
1
2
π
σ
exp
(
−
(
x
−
μ
)
2
2
σ
2
)
p\left(\mu, \sigma^{2}\right)=\frac{1}{\sqrt{2 \pi} \sigma} \exp \left(-\frac{(x-\mu)^{2}}{2 \sigma^{2}}\right)
p(μ,σ2)=2πσ1exp(−2σ2(x−μ)2)
密度分布函数图如下所示
若数据为
{
x
(
1
)
,
x
(
2
)
,
…
,
x
(
m
)
}
\{x^{(1)},x^{(2)},\ldots,x^{(m)}\}
{x(1),x(2),…,x(m)} ,则
μ
=
1
m
∑
i
=
1
m
x
(
i
)
σ
2
=
1
m
∑
i
=
1
m
(
x
(
i
)
−
μ
)
2
\begin{aligned} \mu &= \frac{1}{m} \sum_{i=1}^{m} x^{(i)} \\ \sigma^{2} &=\frac{1}{m} \sum_{i=1}^{m}\left(x^{(i)}-\mu\right)^{2} \end{aligned}
μσ2=m1i=1∑mx(i)=m1i=1∑m(x(i)−μ)2
2.2 异常检测算法
本文基于高斯分布开发异常检测算法,假设数据集为 { x ( 1 ) , x ( 2 ) , … , x ( m ) } \{x^{(1)},x^{(2)},\ldots,x^{(m)}\} {x(1),x(2),…,x(m)},维度为 n n n,其算法流程如下
- 选定可能出现异常的数据 x ( i ) x^{(i)} x(i)
- 计算参数 μ 1 , … , μ n , σ 1 2 , … , σ n 2 \mu_{1}, \dots, \mu_{n}, \sigma_{1}^{2}, \dots, \sigma_{n}^{2} μ1,…,μn,σ12,…,σn2
μ j = 1 m ∑ i = 1 m x j ( i ) σ j 2 = 1 m ∑ i = 1 m ( x j ( i ) − μ j ) 2 (1) \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}\tag{1} μjσj2=m1i=1∑mxj(i)=m1i=1∑m(xj(i)−μj)2(1)- 计算概率 p ( x ) p(x) p(x)
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 ) (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) \tag{2} p(x)=j=1∏np(xj;μj,σj2)=j=1∏n2πσj1exp(−2σj2(xj−μj)2)(2)
如果 p ( x ) < ε p(x)<\varepsilon p(x)<ε, 则数据异常
举个🌰,如下图所示
设定 ε = 0.02 \varepsilon=0.02 ε=0.02 ,数据集有两个维度,其概率密度函数分别如上图的右上角所示,给定测试数据,按照式 ( 2 ) (2) (2) 计算其概率,通过比较与 ε \varepsilon ε 的大小确定是否异常。
三、开发异常检测系统
3.1 异常检测系统评估方法
异常检测算法是一个非监督学习算法,意味着我们无法根据结果变量 y y y 的值来告诉我们数据是否真的是异常的。我们需要另一种方法来帮助检验算法是否有效。当我们开发一个异常检测系统时,一般情况下的数据分配如下
- 训练集 x ( 1 ) , x ( 2 ) , … , x ( m ) x^{(1)},x^{(2)},\ldots,x^{(m)} x(1),x(2),…,x(m)(正常数据),60%
- 交叉验证集 ( x c v ( 1 ) , y c v ( 1 ) ) , x c v ( 2 ) , y c v ( 2 ) ) , … , x c v ( m ) , y c v ( m ) ) (x^{(1)}_{cv},y^{(1)}_{cv}),x^{(2)}_{cv},y^{(2)}_{cv}),\ldots,x^{(m)}_{cv},y^{(m)}_{cv}) (xcv(1),ycv(1)),xcv(2),ycv(2)),…,xcv(m),ycv(m)),20%
- 测试集 ( x t e s t ( 1 ) , y t e s t ( 1 ) ) , x t e s t ( 2 ) , y t e s t ( 2 ) ) , … , x t e s t ( m ) , y t e s t ( m ) ) (x^{(1)}_{test},y^{(1)}_{test}),x^{(2)}_{test},y^{(2)}_{test}),\ldots,x^{(m)}_{test},y^{(m)}_{test}) (xtest(1),ytest(1)),xtest(2),ytest(2)),…,xtest(m),ytest(m)),20%
举个🌰,我们有10000台正常引擎的数据,有20台异常引擎的数据。我们这样分配数据:
6000台正常引擎的数据作为训练集
2000台正常引擎和10台异常引擎的数据作为交叉检验集
2000台正常引擎和10台异常引擎的数据作为测试集
具体的评估算法如下
- 根据测试集数据,我们估计特征的平均值和方差并构建 p ( x ) p(x) p(x)函数
- 对交叉检验集,我们尝试使用不同的 ε ε ε 值作为阀值,并预测数据是否异常,根据 F 1 F1 F1 值或者精确率/召回率的比例来选择 ε ε ε
- 选出 ε ε ε 后,针对测试集进行预测,计算异常检验系统的 F 1 F1 F1 值或者精确率/召回率的比例
3.2 数据预处理
对于异常检测算法,我们使用的特征是至关重要的,下面谈谈如何选择特征。
异常检测假设特征符合高斯分布,如果数据的分布不是高斯分布,那异常检测算法怎么工作呢?方法就是将原始数据尽可能的转换为高斯分布的数据。举个🌰,下图中左边是原始数据分布,通过 log ( x ) \log(x) log(x) 的处理就可以转换为高斯分布的数据。
四、基于多元高斯分布的异常检测
4.1 多元高斯分布
假设有特征变量
x
∈
R
n
x \in \R^n
x∈Rn ,不为
p
(
x
1
)
,
p
(
x
2
)
,
…
,
p
(
x
n
)
p(x_1),p(x_2),\ldots,p(x_n)
p(x1),p(x2),…,p(xn) 单独建模,而是建立一个整体的
p
(
x
)
p(x)
p(x) 模型如下
p
(
x
)
=
1
(
2
π
)
n
2
∣
Σ
∣
1
2
exp
(
−
1
2
(
x
−
μ
)
T
Σ
−
1
(
x
−
μ
)
)
(3)
p(x)=\frac{1}{(2 \pi)^{\frac{n}{2}}|\Sigma|^{\frac{1}{2}}} \exp \left(-\frac{1}{2}(x-\mu)^{T} \Sigma^{-1}(x-\mu)\right) \tag{3}
p(x)=(2π)2n∣Σ∣211exp(−21(x−μ)TΣ−1(x−μ))(3)
其中,
μ
\mu
μ 为均值,
Σ
\Sigma
Σ 为协方差矩阵。
下面我们来看看协方差矩阵是如何影响模型的。
上图是5个不同的模型,从左往右依次分析:
1.是一个一般的高斯分布模型
2.通过协方差矩阵,令特征1拥有较小的偏差,同时保持特征2的偏差
3.通过协方差矩阵,令特征2拥有较大的偏差,同时保持特征1的偏差
4.通过协方差矩阵,在不改变两个特征的原有偏差的基础上,增加两者之间的正相关性
5.通过协方差矩阵,在不改变两个特征的原有偏差的基础上,增加两者之间的负相关性
多元高斯分布模型与原高斯分布模型的关系:
可以证明的是,原本的高斯分布模型是多元高斯分布模型的一个子集,即像上图中的第1、2、3,3个例子所示,如果协方差矩阵只在对角线的单位上有非零的值时,即为原本的高斯分布模型。
原高斯分布模型被广泛使用着,如果特征之间在某种程度上存在相互关联的情况,我们可以通过构造新新特征的方法来捕捉这些相关性。当训练集不是太大,并且没有太多的特征的时候,我们可以使用多元高斯分布模型。
4.2 多元高斯分布异常检测算法
和高斯分布的类型,多元高斯分布异常检测算法如下
- 选定可能出现异常的数据 x ( i ) x^{(i)} x(i)
- 计算参数 μ , Σ \mu, \Sigma μ,Σ
μ = 1 m ∑ i = 1 m x ( i ) Σ = 1 m ∑ i = 1 m ( x ( i ) − μ ) ( x ( i ) − μ ) T (4) \begin{aligned}\mu&=\frac{1}{m} \sum_{i=1}^{m} x^{(i)} \\ \Sigma&=\frac{1}{m} \sum_{i=1}^{m}\left(x^{(i)}-\mu\right)\left(x^{(i)}-\mu\right)^{T}\end{aligned}\tag{4} μΣ=m1i=1∑mx(i)=m1i=1∑m(x(i)−μ)(x(i)−μ)T(4)
- 计算概率 p ( x ) p(x) p(x)
p ( x ) = 1 ( 2 π ) n 2 ∣ Σ ∣ 1 2 exp ( − 1 2 ( x − μ ) T Σ − 1 ( x − μ ) ) (5) p(x)=\frac{1}{(2 \pi)^{\frac{n}{2}}|\Sigma|^{\frac{1}{2}}} \exp \left(-\frac{1}{2}(x-\mu)^{T} \Sigma^{-1}(x-\mu)\right)\tag{5} p(x)=(2π)2n∣Σ∣211exp(−21(x−μ)TΣ−1(x−μ))(5)
如果 p ( x ) < ε p(x)<\varepsilon p(x)<ε, 则数据异常
五、参考
[1] Andrew.Ng 机器学习视频
[2] https://www.jianshu.com/p/620b584c2941