一、高斯分布
高斯分布又称为正态分布。高斯分布用函数描述 。其中 是平均值, 是方差。正态分布的 决定了曲线的中心位置, 决定了分布的幅度。
1.1 一维高斯分布
当 ,称为一维高斯分布。
决定了曲线的中心位置, 决定了分布的幅度。
1.2 多维高斯分布
当 时,即 是一个向量时,
计算公式如下:
以二维为例,讲解一下参数对多维高斯分布的影响: 依旧决定了中心位置,而 是一个协方差矩阵,决定了方向、形状以及幅度。
二、异常检测算法
2.1 问题动机 / 算法思路
跟其他的学习算法一样,给定数据集 训练异常检测模型。然后给出新样本,我们通过异常检测模型判断该样本是异常 / 正常。
我们定义异常检测模型为 , 表示样本不是异常的概率。我们选择一个临界值 。
2.2 基于一维高斯分布的算法实现
给一组训练集 ,其中 ,每个特征 都属于高斯分布。模型的函数如下:
上面的式子就对应于一个从 到 上的独立的假设相乘。实际中,无论这些特征是否独立,即使这个独立的假设不成立,这个算法的效果也很不错。
算法实现过程如下:
2.3 异常检测系统开发与评估
为了开发与评估异常检测系统,我们需要带标签的数据集。 代表正常样本, 代表异常样本。
异常检测算法多适用于异常样本数很少,正常样本数非常多的场景,即数据集正负样本数量相差悬殊的场景。
由于数据集正负样本数量相差悬殊,将大部分正常样本用于训练模型,而全部异常样本和剩余正常样本用于验证与测试模型,具体如何划分数据集进行训练、验证和测试模型:
- 我们将大部分的 的样本作为训练集,用于训练模型 。
- 将剩余的 的数据与 的样本作为验证集与测试集(当然,验证集与测试集交集为空)。
举个例子,我们有 10,000 个正常样本() 和 20 个异常样本()。数据集划分如下:
- 训练集 = 6,000 个正常样本
- 验证集 = 2,000 个正常样本 + 10 个异常样本
- 测试集 = 2,000 个正常样本 + 10 个异常样本
如何评估系统?
首先,用由正常样本组成的训练集来训练模型(就是求 );
然后,使用由正常样本和异常样本组成的验证集运行模型并计算 来调整决策边界值 (一般,当出现不少正常样本被错误分类为异常样本时,减小 ;反之,增加 )
最后,计算测试集中 评价模型(因为这是不对称分类问题:异常数据非常少,正常数据非常多)
2.4 如何选取特征
特征对异常检测算法影响很大。我们需要特征符合高斯分布,通过对特征变量 绘制直方图(横坐标: 取值,纵坐标:次数)来判断特征变量 是否符合高斯分布。
当特征 不符合高斯分布时,需要对特征变量进行转换,常用的转换函数有
总结:如果你画出数据的直方图并且发现图形看起来非常不像高斯分布,那么就要进行转换,来让你的数据看起来更具有高斯分布的特点,然后你再把数据输入到异常检测算法 。
第二个问题:你如何得到异常检测算法的特征变量
常用的办法是「误差分析」
这跟我们之前学习监督学习算法时的误差分析步骤是类似的。也就是说
- 首先,我们先完整地训练出一个学习算法;
- 然后,在一组交叉验证集上运行算法,然后找出那些预测出错的样本;
- 然后,再看看你能不能得到启发来创造新的特征变量来帮助学习算法,让它在那些交叉验证时 判断出错的样本中表现更好
举个例子,现在假如我有一个异常样本,这个异常样本中 的取值如下图中左图绿叉所示,我画出我的异常样本你不难发现,它看起来就像被淹没在一堆正常样本中似。这样就没法把这个异常样本区别出来。
现在如果说这代表飞机引擎的制造或者别的什么,那么我会做的是我会看看到底是哪一个具体的飞机引擎出错了,看看通过这个样本能不能启发我想出一个新的特征 来帮助算法区别出异常样本和我剩下的正确的样本,也就是那些红色的叉叉 。
通过对误差分析,创建一个新的特征 我会发现我的异常检测算法会在中间区域给出一个较高的概率,然后越到外层越小,到了那个绿色的样本,我的异常检测算法会给出非常小的概率值(如下图右图所示)
2.5 多维元高斯异常检测算法
上图显示是基于一元高斯分布与基于多元高斯分布的异常检测算法,两者在参数 的计算是一样的,但在计算方差和 不同了。
实际上,基于一元高斯分布的异常检测算法等价于当协方差矩阵 除正对角线之外其余元素都为 0 时的基于多高斯分布的异常检测算法。也就是说,基于一元高斯分布的异常检测算法绘制的图形是轴对称,不能改变方向,举个例子如下图所示。
基于一元高斯分布与基于多元高斯分布的异常检测算法的区别在于
总结:基于一元高斯分布的算法最大的优势:它的运算量更小,它更适用于 n 的值非常大,就是说特征变量很多的情况;基于多元高斯分布的算法最大优势:可以自动捕捉不同特征变量之间的相关性,而基于一元高斯分布的算法必须手动建立这样的新特征变量。
2.6 异常检测算法与监督学习
异常样本设为 y=1
引出了这样一个问题: 我们有了这些带标签的数据,我们有了一些样本其中一些我们知道是异常的,另外一些是正常的,那我们为什么我们不直接用监督学习的方法呢来直接学习这些带标签的数据 从而给出预测 y=1 或 y=0 呢?
解释:异常检测算法的使用场景是在异常样本()数量远小于正常样本数。如果你只有很少的 样本, 那么一个监督学习算法从这么少的 样本中不可能学出太多异常种类,具体来说极小的异常样本导致你的监督学习算法掌握的异常类型很少,未来遇到的异常可能跟你已经见过的完全不同。那么这更加说明你应该对 的样本进行建模,建立这个高斯模型 而不是很费力地对数量极少的 样本进行建模 因为你知道 (即便你建了模型) 明天你也许就会遇到你完全没有见过的异常类型。相对而言,如果你拥有足够多的 样本,你的算法能够感觉到 样本是什么样的。具体来说,如果你认为未来的 样本跟训练集中的很相似的话,那么在这样的条件下用监督学习算法似乎更加合理,既使用大量的 样本 也使用大量的 样本并且尝试对正负样本进行分类。
举个例子:垃圾邮件处理为什么不用异常检测算法?虽然垃圾邮件种类非常多,但对于垃圾邮件的问题 我们通常有足够多的 垃圾邮件的样本 我们能得到绝大多数不同类型的 垃圾邮件 因为我们有大量的 垃圾邮件样本的集合
总结:当异常样本(y=1)数量很少时,采用异常检测算法对 的样本进行建模;当异常样本(y=1)数量足够多时,可以转换成使用监督学习进行预测。