本文为吴恩达机器学习课程的笔记系列第七篇,主要学习异常检测算法。
异常检测(Anomaly Detection)
异常检测属于非监督问题。异常检测是机器学习算法的一个常见应用,是对不匹配预期模式或数据集中其他项目的项目、事件或观测值的识别。简单来说,当正样本比较多时,通过对正样本的学习,机器学会正样本的特征,从而对异常样本有了识别能力。
异常检测的核心就在于找到一个概率模型,帮助我们知道一个样本落入正常样本中的概率,从而帮助我们区分正常和异常样本。
高斯分布
高斯分布模型是异常检测中常用的概率模型。其概率密度函数如下:
p ( x , μ , σ 2 ) = 1 2 π σ e x p ( − ( x − μ ) 2 2 σ 2 ) p(x,\mu,\sigma^2)=\dfrac{1}{\sqrt{2\pi}\sigma}exp(-\dfrac{(x-\mu)^2}{2\sigma^2}) p(x,μ,σ2)=2πσ1exp(−2σ2(x−μ)2)
其中:
- μ = 1 m ∑ i = 1 m x ( i ) \mu=\dfrac{1}{m}\sum\limits_{i=1}^{m}x^{(i)} μ=m1i=1∑mx(i)
- σ 2 = 1 m ∑ i = 1 m ( x j ( i ) − μ j ) 2 \sigma^2=\dfrac{1}{m}\sum\limits_{i=1}^{m}(x^{(i)}_j-\mu_j)^2 σ2=m1i=1∑m(xj(i)−μj)2
应用到异常检测算法,对于 m m m 个样本的数据集,针对每一个特征,进行参数估计:
- μ j = 1 m ∑ i = 1 m x j ( i ) \mu_j=\dfrac{1}{m}\sum\limits_{i=1}^{m}x^{(i)}_j μj=m1i=1∑mxj(i)
- σ j 2 = 1 m ∑ i = 1 m ( x ( i ) − μ ) 2 \sigma^2_j=\dfrac{1}{m}\sum\limits_{i=1}^{m}(x^{(i)}-\mu)^2 σj2=m1i=1∑m(x(i)−μ)2
假设每个样本有 n n n个特征,即 x i x_i xi 变成一个 n n n 维的向量 [ x i ( 1 ) x i ( 2 ) ⋮ x i ( n ) ] \begin{bmatrix}x_i^{(1)}\\x_i^{(2)}\\ \vdots \\x_i^{(n)}\end{bmatrix} ⎣⎢⎢⎢⎢⎡xi(1)xi(2)⋮xi(n)⎦⎥⎥⎥⎥⎤
对于一个训练实例,有:
p ( x ) = ∏ j = 1 n ( x j , μ , σ 2 ) = ∏ j = 1 n 1 2 π σ e x p ( − ( x − μ ) 2 2 σ 2 ) p(x)=\prod\limits_{j=1}^{n}(x_j,\mu,\sigma^2)=\prod\limits_{j=1}^{n}\dfrac{1}{\sqrt{2\pi}\sigma}exp(-\dfrac{(x-\mu)^2}{2\sigma^2}) p(x)=j=1∏n(xj,μ,σ2)=j=1∏n2πσ1exp(−2σ2(x−μ)2)
如何判断样本是否异常?
我们选择一个 ϵ \epsilon ϵ,将 p ( x ) = ϵ p(x)=\epsilon p(x)=ϵ 作为我们的判定边界,当 p ( x ) > ϵ p(x)>\epsilon p(x)>ϵ 时预测数据为正常数据,否则为异常。
异常检测与有监督学习对比
异常检测 | 有监督学习 |
---|---|
数据非常偏斜,非常少量的正向类(异常数据 y = 1 y=1 y=1 ), 大量的负向类( y = 0 y=0 y=0) | 数据分布均匀,同时有大量的正向类和负向类 |
异常的类型不一,很难根据对现有的异常数据(即正样本)来训练算法。 | 有足够多的正样本,可以根据对正样本的拟合来知道正样本的形态,从而预测新来的样本是否是正样本。 |
未来遇到的异常可能与已掌握的异常、非常的不同。 | 未来遇到的正向类实例可能与训练集中的非常近似。 |
例如: 欺诈行为检测 生产(例如飞机引擎)检测数据中心的计算机运行状况 | 例如:邮件过滤器 天气预报 肿瘤分类 |
特征选择
我们使用异常检测算法时,是假设数据集特征符合高斯分布的。但有时候数据集可能像下图左边一样,这时直接用异常检测算法也是可以得出结果,但一般我们可以对数据进行一些转换如取对数操作,将其转换为高斯分布。
误差分析
有时候,我们可能发现某个异常样本的 p ( x ) p(x) p(x) 值高于 ϵ \epsilon ϵ,我们对此进行分析,观察是哪些异常数据被预测为正常。下面以监测机房中的服务器异常为例:
假设我们选取如下特征:
x 1 = 网 络 流 量 ; x 2 = C P U 负 载 x_1=网络流量;x_2=CPU负载 x1=网络流量;x2=CPU负载
当出现一个异常:CPU负载很高,而网络流量很低,服务器卡死,无法通信。如下图:
此时的 p ( x ) p(x) p(x) 值也会很高,为了识别这一异常状况,我们可以构建新的特征: x 3 = C P U 负 载 网 络 流 量 x_3=\dfrac{CPU负载}{网络流量} x3=网络流量CPU负载 ,当上述异常发生时,这个特征便会变得很大,有利于我们识别出来。
多元高斯分布
一般的高斯模型因为是同时累乘每个特征的偏差,所以会创造出一个较大的判定边界。
模型定义:
p ( x , μ , Σ )