异常检测
给定无标签的数据集,根据该数据集建模即p(x),也就是说我们对x的分布概率建模,其中x是一些特征变量,之后对测试数据xtest预测得到概率P(xtest),若该概率低于阈值ε,将其标记为异常。
异常检测算法是一个非监督学习算法。
上图中,在蓝色圈内的数据属于该组数据的可能性较高,而越是偏远的数据,其属于该组数据的可能性就越低。
这种方法称为密度估计,表达如下:
异常检测常用于欺诈检测。
欺诈检测:𝑥(𝑖) = 用户的第 𝑖个活动特征
通过模型𝑝(𝑥) < 𝜀检测非正常用户。异常检测主要用来识别欺骗。例如在线采集而来的有关用户的数据,一个特征向量中可能会包含如:用户多久登录一次,访问过的页面,在论坛发布的帖子数量,甚至是打字速度等。
尝试根据这些特征构建一个模型,可以用这个模型来识别那些不符合该模式的用户。
还应用于数据中心的计算机监控。
特征可能包含:内存使用情况,被访问的磁盘数量,CPU 的负载,网络的通信量等。根据这些特征可以构建一个模型,用来判断某些计算机是不是有可能出错了。
高斯分布
高斯分布,也称为正态分布。我们可以利用高斯分布来推导异常检测算法。
通常如果我们认为变量 𝑥 符合高斯分布 𝑥 ∼ 𝑁(𝜇, 𝜎²),即均值为𝜇,标准差为𝜎,方差为𝜎²。
则其概率密度函数为:
高斯分布样例:
不论𝜇、𝜎的取值如何,曲线下方的阴影区域面积的积分一定是1。
参数估计
给定数据集,找到能够估算出𝜇、𝜎²的值。
𝜇控制正态分布的中心位置,𝜎控制曲线的宽度;我们可以利用已有的数据来预测总体中的𝜇和𝜎²的计算方法如下:
注:对于公式中求均值我们一般用1/m,而非统计学中的1/(𝑚 − 1)。
在实际使用中,到底是选择使用1/𝑚还是1/(𝑚 − 1)其实区别很小,只要你有一个还算大的训练集,在机器学习领域大部分人更习惯使用1/𝑚这个版本的公式。这两个版本的公式在理论特性和数学特性上稍有不同,但是在实际使用中,他们的区别甚小,几乎可以忽略不计。
高斯分布在异常检测中的应用
一个共有m个样本的无标签训练集,训练集的每个样本都是一个Rn维的特征量。
对于给定的数据集 𝑥(1), 𝑥(2), . . . , 𝑥(𝑚),我们要针对每一个特征计算 𝜇 和 𝜎2 的估计值。
一旦我们获得了平均值和方差的估计值,给定新的一个训练实例,根据模型计算 𝑝(𝑥):
注:P(x)是所有特征向量概率的乘积。不同的特征向量可能服从不同的分布。
步骤:
- 选择特征向量。选择一些可以反应异常情况的属性作为特征。
- 给定训练集,再进行参数拟合。根据m个未标记样本,获得了平均值和方差的估计值。
- 根据模型计算新案例的𝑝(𝑥),判断异常。当𝑝(𝑥) < 𝜀时,为异常。
例如:
给定由两个特征的训练集:
分析得到特征x1、x2的分布情况:
连乘p(x1,u1,𝜎1)、p(x2,u2,𝜎2)得到概率模型p(x,u,𝜎),用三维图表示如下,𝑧轴为根据两个特征的值所估计𝑝(𝑥)值:
给定x1、x2即可根据该模型得到该样本的概率p(x)。我们选择一个𝜀,将𝑝(𝑥) = 𝜀作为我们的判定边界,当𝑝(𝑥) > 𝜀时预测数据为正常数据,否则为异常。
开发异常检测系统
异常检测算法是一个非监督学习算法,意味着我们无法根据结果变量 𝑦 的值来告诉我们数据是否真的是异常的。
我们需要另一种方法来帮助检验算法是否有效。当我们开发一个异常检测系统时,我们从带标记(异常或正常)的数据着手,我们从其中选择一部分正常数据看作是无标签的用于构建训练集,然后用剩下的正常数据和异常数据混合的数据构成交叉检验集和测试集。
例如:我们有 10000 台正常引擎的数据,有 20 台异常引擎的数据。 我们这样分配数据:
6000 台正常引擎的数据作为训练集
2000 台正常引擎和 10 台异常引擎的数据作为交叉检验集
2000 台正常引擎和 10 台异常引擎的数据作为测试集
具体步骤:
- 使用训练集拟合模型P(x)。把m个无标签样本(实际上是有标签的,将其当作无标签)用高斯函数来拟合。
- 对交叉检验集,我们尝试使用不同的𝜀值作为阀值,并预测数据是否异常。由于正常样本数量远远大于异常样本数量,数据倾斜,所以需要选择好的评价指标,可以根据 F1 值或者查准率与查全率的比例来选择 𝜀
- 选出 𝜀 后,针对测试集进行预测,计算异常检验系统的𝐹1值,或者查准率与查全率之比。
异常检测VS监督学习
之前我们构建的异常检测系统也使用了带标记的数据,与监督学习有些相似,下面的对比有助于选择采用监督学习还是异常检测:
选择异常检测算法的特征
特征的分布
异常检测假设特征符合高斯分布,如果数据的分布不是高斯分布,异常检测算法也能够工作,但是最好还是将数据转换成高斯分布,例如使用对数函数:𝑥 = 𝑙𝑜𝑔(𝑥 + 𝑐),其中 𝑐为非负常数; 或者 𝑥 = 𝑥𝑐,𝑐为 0-1 之间的一个分数,等方法。
特征选择——误差分析
先训练出一个模型,在一组交叉验证集上运行算法,找出那些预测出错的样本,并看看能否找到一些其他的特征来帮助学习算法在预测中现得更好。
在已经建好的模型中,一些异常的数据可能也会有较高的𝑝(𝑥)值,因而被算法认为是正常的。这种情况下误差分析能够帮助我们,我们可以分析那些被算法错误预测为正常的数据,观察能否找出一些其他的特征。
我们可能能从问题中发现我们需要增加一些新的特征,增加这些新特征后获得的新算法能够帮助我们更好地进行异常检测。
例如:如果当前模型只有x1作为特征,当一个一场样本的x1为2.5时,它有比较高的𝑝(𝑥)值,预测出错:
通过误差分析,我们增加一个特征x2:
这时,模型便可以正确预测出该样本为异常样本。
我们通常可以通过将一些相关的特征进行组合,来获得一些新的更好的特征(异常数据的该特征值异常地大或小),例如,在检测数据中心的计算机状况的例子中,我们可以用 CPU负载与网络通信量的比例作为一个新的特征,如果该值异常地大,便有可能意味着该服务器是陷入了一些问题中。
对特征进行一些小小的转换,让数据更像正态分布,然后再把数据输入异常检测算法。建立特征时,进行的误差分析方法,来捕捉各种异常的可能。
多变量高斯分布
假使我们有两个相关的特征,而且这两个特征的值域范围比较宽,这种情况下,一般的高斯分布模型可能不能很好地识别异常数据。其原因在于,一般的高斯分布模型尝试的是去同时抓住两个特征的偏差,因此创造出一个比较大的判定边界,边界得误差较大。
下图中是两个相关特征,洋红色的线(根据 ε 的不同其范围可大可小)是一般的高斯分布模型获得的判定边界,很明显绿色的 X 所代表的数据点很可能是异常值,但是其𝑝(𝑥)值却仍然在正常范围内。多元高斯分布将创建像图中蓝色曲线所示的判定边界。
在一般的高斯分布模型中,我们计算 𝑝(𝑥) 的方法是: 通过分别计算每个特征对应的几率然后将其累乘起来。在多元高斯分布模型中,我们将构建特征的协方差矩阵,用所有的特征来计算整体的 𝑝(𝑥)。
我们首先计算所有特征的平均值,然后再计算协方差矩阵:
*注:其中𝜇 是一个向量,其每一个单元都是原特征矩阵中一行数据的均值。*决定了分布的中心点。
最后我们计算多元高斯分布的𝑝(𝑥):
注:协方差矩阵衡量方差或者说特征变量x1、x2的变化量。
下面我们来看看协方差矩阵是如何影响模型的:
上图是 5 个不同的模型,从左往右依次分析:
- 是一个一般的高斯分布模型
- 通过协方差矩阵,令特征 1 拥有较小的偏差,同时保持特征 2 的偏差
- 通过协方差矩阵,令特征 2 拥有较大的偏差,同时保持特征 1 的偏差
- 通过协方差矩阵,在不改变两个特征的原有偏差的基础上,增加两者之间的正相关性
- 通过协方差矩阵,在不改变两个特征的原有偏差的基础上,增加两者之间的负相关性
可以证明的是,原本的高斯分布模型是多元高斯分布模型的一个子集,即像上图中的第1、2、3,3 个例子所示,如果协方差矩阵只在对角线的单位上有非零的值时,即为原本的高斯分布模型了。
原高斯分布模型和多元高斯分布模型的比较:
使用多元高斯分布进行异常检测
参数拟合
有一组样本𝑥(1), 𝑥(2), . . . , 𝑥(𝑚)是一个𝑛维向量,样本来自一个多元高斯分布。如何尝试估计我的参数 𝜇 和 𝛴 以及标准公式?
参数 𝜇 和 𝛴的估计公式:
开发异常检测算法
首先,把训练集用来拟合模型,我们计算𝑝(𝑥),通过设定𝜇和𝛴来拟合p(x)。
对测试样本用多元高斯分布的公式来计算p(x)。
如图,该分布在中央最多,越到外面的圈的范围越小。并在该点出现的概率非常低。所以为异常点。
原始模型与多元高斯模型的关系
原始模型:
多元高斯:
当多元高斯的协方差矩阵𝛴为:,这时这两个模型完全相同。其中α₁²、α₂²…为普通高斯模型中的参数。
注:若协方差矩阵𝛴 不可逆,先检查训练集数量是否远大于特征数量,再检查特征是否存在冗余。
原高斯分布模型被广泛使用着,如果特征之间在某种程度上存在相互关联的情况,我们可以通过构造新特征的方法来捕捉这些相关性或者使用多元高斯分布,自动地捕捉特征之间的关系。如果训练集不是太大,并且没有太多的特征,我们可以使用多元高斯分布模型。