Machine Learning-异常检测(Anomaly Detection)

点击量:339

本文覆盖Coursera Machine Learning Week 9的内容。
一、问题描述
假设我们现在要构建一个模型来判断某一个飞机发动机是否有问题,我们选取的特征如下:

  • \(x_{1}\) = 发热
  • \(x_{2}\) = 抖动
  • 原始数据集:\(\left \{ x^{(1)},x^{(2)}, … ,x^{(m)} \right \}\)在坐标轴上的分布如下图所示:

    很明显上图数据点的分布是有规律可寻的:越往中心越密集,越往边缘越稀疏。也就是说大部分数据点都散落在中心位置,而小部分散落在边缘位置。那么我们就可以说如果一个测试点\(x_{test}\)越靠近中心点,那么它是正常引擎的可能性就越大;如果他远离中心点,则它很可能就是异常的引擎。这就是异常检测,他在很多领域都有应用,比如它可以监测网站的异常用户、监测机房电脑运转是否正常等。

    二、算法

  • 高斯分布(Gaussian distribution)
    看到上图的分布我们很容易想到一个模型:高斯分布(Gaussian distribution),也就是正态分布(Normal distribution)。这个模型最大的特点就是越靠近中心越密集,越靠近两边越稀疏。若随机变量\(X\)服从一个数学期望为\(\mu\)、标准方差为\(\sigma^{2}\)的高斯分布,记为:\(X∼N(\mu,\sigma^{2})\),其概率密度函数为:
    $$p(x;\mu,\sigma)=\frac{1}{\sigma\sqrt{2\pi}} \, \exp \left( -\frac{(x- \mu)^2}{2\sigma^2} \right)$$
  • 密度估计(Density Estimation)
    那么我们该如何把高斯分布应用到我们的特征分布中呢?我们假设每个特征都是独立分布的,相互之间不影响,也就是说,我们有:
    $$X_{1}∼N(\mu_{1},\sigma_{1}^{2})
    \\X_{2}∼N(\mu_{2},\sigma_{2}^{2})
    \\…\\
    X_{n}∼N(\mu_{n},\sigma_{n}^{2})$$
    然后我们可以计算出各个特征的概率密度的乘积即为最终的概率密度
    $$p(x) = p(x_{1};\mu_{1},\sigma_{1})p(x_{2};\mu_{2},\sigma_{2})…p(x_{n};\mu_{n},\sigma_{n})$$
  • 算法
    1. 选取恰当的特征
    2. 计算参数:\(\mu_{1},\mu_{2},…,\mu_{n},\sigma_{1}^{2},\sigma_{2}^{2},…,\sigma_{n}^{2}\)的值:
      $$
      \begin{align*}
      & \mu_{j} = \frac{1}{m}\sum_{i=1}^{m}x_{j}^{(i)} \\
      & \sigma_{j}^{2} = \frac{1}{m}\sum_{i=1}^{m}(x_{j}^{(i)} – \mu_{j})^{2} \\
      \end{align*}
      $$
    3. 对于一个给定的新数据\(x\),计算出\(p(x)\):
      $$p(x)=\prod_{j=1}^{n}p(x_{j};\mu_{j},\sigma_{j}^{2}) = \prod_{j=1}^{n}\frac{1}{\sqrt{2\pi}\sigma_{j}}\exp(-\frac{(x_{j}-\mu_{j})^2}{2\sigma_{j}^2})$$
      如果\(p(x)<\varepsilon\),那么这个新数据\(x\)就是异常的。
  • 数据微调
    我们希望每个变量的概率密度都是遵循高斯分布的,这样才能达到最佳的效果。那如果某个变量的概率密度并不遵循高斯分布,我们该如何调整呢?比如某一个变量的概率密度如下图所示:

    这个柱状图显然不是遵循高斯分布的,它向一边倾斜。我们可以对这个变量做一些数学上的变换,比如使得:\(x_{1}\leftarrow \log(x_{1} + c)\)、\(x_{1}\leftarrow x_{1}^{\frac{1}{3}}\)等,找到合适的数学公式使得变换后的变量的概率密度大致如下图所示:
  • 三、算法评估
    我们该如何评估这个算法的好坏呢?又该如何选择\(\sigma\)的值呢?还是以之前飞机引擎数据为例,假设我们一共有10020条引擎数据,其中:10000条是正常的引擎,20条是异常的引擎。那么我们该如何使用这10020条数据来评估我们的算法呢?

    1. 训练(Train):使用6000条正常的引擎数据(\(y=0)\)训练模型\(p(x)\)
    2. 交叉验证(Cross Validation):使用剩下的2000条正常的引擎数据(\(y=0)\)和10条异常的引擎数据(\(y=1)\)进行交叉验证
    3. 测试(Test):使用剩下的2000条正常的引擎数据(\(y=0)\)和10条异常的引擎数据(\(y=1)\)进行测试

    具体的评估算法就是:在交叉验证的时候,对交叉验证集中的数据按照如下公式得出预测结果:
    $$y=\left\{\begin{matrix}
    1, if \ p(x) < \varepsilon, anomaly\\ 0, if \ p(x) \geq \varepsilon, normal \end{matrix}\right.$$ 在结果中使用精准率(precision)、召回率(recall)或者F1-score等评测方法选择最佳的\(\varepsilon\)。(这里顺便提及一下:交叉验证和测试有什么区别呢?交叉验证主要用于确认模型的参数,而测试主要用于确认该模型的准确率/性能)

    四、异常检测和监督学习的区别
    异常检测:

  • 正例/异常(\(y=1\))的样本量非常少(通常是0-20个),这样就会导致算法无法通过学习得出异常数据的模型
  • 反例/正常(\(y=0\))的样本量非常多
  • 未来的正例(异常点)很有可能不会出现在现在的数据集里
  • 监督学习:

  • 正例和反例的数据量都很大
  • 因为样本数据量很大,所以未来的正例很有可能跟已知数据集中的数据类似


  • 五、多元高斯分布(Multivariate Gaussian Distribution)
    我们之前的算法是计算每一个变量的概率密度,然后计算他们的乘积,最终得到:
    $$p(x) = p(x_{1};\mu_{1},\sigma_{1})p(x_{2};\mu_{2},\sigma_{2})…p(x_{n};\mu_{n},\sigma_{n})$$
    然而实际上我们还可以不去单独计算每个变量的概率密度,而是把所有的变量整合到一起,计算出多个变量的概率密度。具体算法如下:

    1. 计算参数\(\mu\),\(\Sigma\)的值:
      $$
      \begin{align*}
      & \mu = \frac{1}{m}\sum_{i=1}^{m}x^{(i)} \\
      & \Sigma = \frac{1}{m}\sum_{i=1}^{m}(x^{(i)}-\mu)(x^{(i)} – \mu)^{T} \\
      \end{align*}
      $$
    2. 对于一个给定的新数据\(x\),计算出\(p(x)\):
      $$
      p(x) = \frac{1}{(2\pi)^{\frac{n}{2}}\left | \Sigma \right |^{\frac{1}{2}}}\exp(-\frac{1}{2}(x-\mu)^{T}\Sigma^{-1}(x-\mu))
      $$
      如果\(p(x)<\varepsilon\),那么这个新数据\(x\)就是异常的。

    那么多元高斯函数在不同参数下的图像是什么样子的呢?我们来看一下其中有代表性的几组:

    那我们为什么需要多元高斯分布呢?之前的算法不好吗?多元高斯分布是为了解决什么问题呢?我们来看一下一个例子,假设我们有两个特征变量,他们的数据分布如下:

    同时,在左上角有一个绿色的点,很明显这个点是偏离中心(蓝色的椭圆)的,它应该被归类为异常点。然而,如果我们使用之前的算法,那么图像的中心就不是我们想要的蓝色椭圆,而是下图中的紫色正圆:

    那这样这个异常点就会被遗漏。出现这种情况的原因是:在数学上可以证明,多个特征变量的高斯分布的乘积所得到的图像(等高线图)是沿着轴向对称的(要么是正圆要么是正椭圆),这样就不能很好的拟合样本数据分布的图像是斜椭圆的情况。而多元高斯分布的图像则可以是斜椭圆等非沿着轴向对称的图像。这也是原来的模型和多元高斯分布模型的最大区别,实际上,原来的模型只是多元高斯分布的一种特殊情况。也就是说这两个模型其实是等价的,当\(\Sigma\)的值满足:
    $$\Sigma=\begin{bmatrix}
    \varepsilon_{1}^{2} & 0 & 0 & 0\\
    0 & \varepsilon_{2}^{2} & 0 & 0 \\
    0 & .. & . & 0\\
    0 & .. & 0 & \varepsilon_{n}^{2}
    \end{bmatrix}$$

    此外,出现上图所说的那种情况还有一个解释:变量\(x_{1}\)和\(x_{2}\)大致是线性相关的,他们是不正常的特征变量组合。所以,要解决这个问题我们可以创造出一个新的变量\(x_{3}\),使得\(x_{3}=\frac{x_{1}}{x_{2}}\)以消除他们的线性相关性;或者我们可以使用多元高斯分布模型来帮我们自动甄别这些线性相关的变量(有点类似于上一篇所说的PCA)。

    两种模型的对比

  • 原来的模型:
    1. 计算量小
    2. 需要手动创建变量以消除多个线性相关变量,比如:\(x_{3}=\frac{x_{1}}{x_{2}}\)
    3. 即使数据量\(m\)很小也能工作
  • 多元高斯分布模型:
    1. 计算量更大
    2. 可以自动捕获特征之间的线性关系
    3. 必须满足\(m>n\),否则\(\Sigma\)是不可逆矩阵,也就是奇异矩阵
  • 那么在实际工作中如何选择这两个模型呢?按照日常的经验法则,只有在当\(m\)远大于\(n\)时,典型地,当\(m > 10n\)时会选择多元高斯分布模型;而在实际应用当中,原来的模型更常用。

    Machine Learning-异常检测(Anomaly Detection)》上有1条评论

    1. Pingback引用通告: Machine Learning Summary | Hi Gorgeous

    发表评论

    电子邮件地址不会被公开。 必填项已用*标注