本章内容:
· 15.1 问题的动机
· 15.2 高斯分布
· 15.3 算法
· 15.4 开发和评价一个异常检测系统
· 15.5 异常检测与监督学习对比
· 15.6 选择特征
· 15.7 多元高斯分布(选修)
· 15.8 使用多元高斯分布进行异常检测(选修)
内容简介:
异常检测(Anomaly detection)问题是机器学习算法的一个常见应用,它虽然主要用于非监督学习问题,但从某些角度看,它又类似于一些监督学习问题————主要由positive examples(阳性样本 or y=1)的数量来决定的(这点在本次分享中会细说);通过这次学习,我感觉异常检测更像是“鸡蛋外挑骨头”————即通过对原有的大量鸡蛋进行学习来预测或判断新进的鸡蛋中是否出现了异常的“骨头”。
15.1 问题的动机
异常检测定义:
给定数据集,假定数据集是正常的,通过高斯分布建立一个模型 ,通过所构建的模型,根据新数据的位置告诉我们其属于该组数据的可能性 p(x)。
上图中,在蓝色圈内的数据属于该组数据的可能性较高,而越是偏远的数据,其属于该组数据的可能性就越低。
这种方法称为密度估计,表达如下:
if p(x)
异常检测实例:
异常检测主要用来识别欺骗。例如在线采集而来的有关用户的数据,一个特征向量中可能会包含如:用户多久登录一次,访问过的页面,在论坛发布的帖子数量,甚至是打字速度等。尝试根据这些特征构建一个模型,可以用这个模型来识别那些不符合该模式的用户。
还有就是应用在工业制造领域。比如某个制造飞机引擎的公司,从飞机引擎提取出一系列的特征值,并且训练出一个模型。当新制造出来的引擎符合这个模型时,就可认为是良品,如果偏离这个模型较远时,就可以认为可能有缺陷,需要进一步的检测。
异常检测还可以应用在检测一个数据中心,特征可能包含:内存使用情况,被访问的磁盘数量,CPU的负载,网络的通信量等。根据这些特征可以构建一个模型,用来判断某些计算机是不是有可能出错了。
15.2 高斯分布
通常如果我们认为变量x
符合高斯分布
则其概率密度函数为:
我们可以利用已有的数据来预测总体中的\mu和\sigma^2
的计算方法如下:
高斯分布样例:
注:机器学习中对于方差我们通常只除以m而非统计学中的(m-1)。这里顺便提一下,在实际使用中,到底是选择使用1/m
还是1/(m-1)其实区别很小,只要你有一个还算大的训练集,在机器学习领域大部分人更习惯使用1/m这个版本的公式。这两个版本的公式在理论特性和数学特性上稍有不同,但是在实际使用中,他们的区别甚小,几乎可以忽略不计。
15.3 算法
前面在讲异常检测时有提到用高斯分布来构建模型p(x),这里我们简单说一下算法:
异常检测算法:
在异常检测问题中,比如用户反常问题、飞机引擎检测问题,我们一般会先选择一些特征,当出现异常样本时,它们的值会异常的非常大或者非常小(在图像上表示就是在高斯分布的最左侧或最右侧),但是一般来说,还是选择那些能够用来描述我们所收集的数据集一般特性的特征。
然后对于给定的数据集\mu\sigma^2$d的估计值。
(这一步我们可以将看成,通过向量的思想我们更容易理解。)
一旦我们获得了平均值和方差的估计值,给定新的一个训练实例,根据模型计算p(x):
然后我们选择一个,将p(x)=作为我们的判定边界,当p(x)>时预测数据为正常数据,否则为异常。
15.4 开发和评价一个异常检测系统
在这一部分我们会简单了解如何开发一个异常检测的应用来解决实际的问题,不过我们会将重点放到如何评估一个异常检测算法。
在之前的学习中,我们已经看到了实数评估的重要性,它的主要思想时当我们为某个应用开发一个学习算法时,我们需要进行一系列的选择,比如选择使用什么特征等等————如果我们由某种方法,通过放回一个实数来评估我们的算法,那么就会更容易对这些选择做出决定。
比如现在有一个新的特征,我们正在决定该不该纳入这个特征,如果我们分别在纳入该特征和不纳入该特征情况下运行算法,然后算法返回一个数字来告诉我们这个特征对算法的影响是好是坏,这样的话,我们就能更简单地决定要不要纳入这个特征。
为了能够更迅速地开发出像上面所说的一个算法评估系统来评估一个异常检测系统,我们可以假设有一些带标签的数据(y = 0 if normal , y = 1 if anomalous),到目前为止我们把异常检测看成一个无监督学习问题是因为用的是无标签数据,但是如果我们有一些带标签的数据来指明哪些是异常样本哪些是正常样本,这就是我们认为能过评估异常检测的标准方法。
那么异常检测算法的开发过程和评估方法如下:
1、我们先假设有一些训练集:
Training set: $x1,x2,…,x^m (assume normal examples/not anomalous)
我们把训练集看作是无标签的,即这是一个很大的正常样本(无异常样本)的集合。(通常我们把它看作是无异常样本,当然如果不小心溜进了一些异常样本也是没关系的)
2、接下来我们会定义一个交叉验证集和测试集:
Cross validation set :
Test set :
具体来说,对于交叉验证集和测试集,我们假设在交叉验证集和测试集中包含一些已知的异常样本(即一些标签为 y = 1 的样本)。
现在我们还是拿飞机引擎的例子来做说明:
1、假设我们现在有:
10000 good (normal) engines
20 flawed engines (anomalous)
对于典型的异常检测应用来说,异常样本的数量,即 y = 1的样本大概20~50个,而且正常样本的数量正常来说还会比我们这个例子要大得多。
2、在有了这些数据集后,我们把这些数据分离到训练集、交叉验证集和测试集中:
Training set: 6000 good engines
Cross validation set : 2000 good engines(y=0),10 an0malous(y=1)
Test set : 2000 good engines(y=0),10 an0malous(y=1)
一般我们都会按照60%,20%,20%的比例来分离数据,认为CV、TEST dataset是两个完全不同的数据集————把同样的数据同时应用到CV、TEST dataset里面在机器学习中是不好的!
3、在给出上面的三个数据集后,我们就可以推导和评估算法了:
Firstly,Fit model p(x) on training set {}(这些虽然是无标签数据,但实际上我们会把他们看成已知的正常样本)
Then ,On a cross validation/test example x ,predict(所以我们也可以将异常检测算法看成是对交叉验证集 or 测试集中的 y 标签进行预测)
然后,使用交叉验证数据集来计算查准率,找回率以及来做出评估:
上面我们提到测试集是带标签的,这一点和监督学习很像,即算法是对这些标签做出预测,通过预测成功次数来评估,但是和监督学习不一样的时候,监督学习的标签会很倾斜(即y = 0更多),那么分类正确率就不是一个很好的评价指标。
有一点要提的是,我们会通过使用交叉验证数据集来选择合适的(用于决定什么时候将一个样本当作使异常样本的阈值),来使 的值尽可能的大(或者选择在其它方面表现比较好的)
补充指标解释:
TruePosition: 真阳性,即真实结果是真,算法的预测结果是真
FalsePositive: 假阳性,即真实结果是假,算法的预测结果是真
FalseNegative: 假阴性,即真实结果是真,算法的预测结果是假
15.5 异常检测与监督学习对比
之前我们构建的异常检测系统也使用了带标记的数据,与监督学习有些相似,下面的对比有助于选择采用监督学习还是异常检测:
两者比较:
异常检测:
1、非常少量的正向类(异常数据 y = 1),大量的负向类(y = 0)
2、许多不同种类的异常,非常难。根据非常少量的正向类数据来训练算法
3、未来遇到的异常可能与已掌握的异常、非常的不同
4、例如: 欺诈行为检测 生产(例如飞机引擎)检测数据中心的计算机运行状况
在异常检测中拟合所有高斯参数时,通常只需要阴性样本就足够了。而且对于“2、”这种情况来说,更有可能的是,会对阴性数据用高斯模型P(X)来构建模型,而不是去对y = 1(阳性样本)建模,因为明天的异常可能与今天我们所见的都不一样。
监督学习:
1、同时有大量的正向类和负向类
2、有足够多的正向类实例,足够用于训练 算法,未来遇到的正向类实例可能与训练集中的非常近似
3、无
4、例如:邮件过滤器 天气预报 肿瘤分类
总结:一般来说,异常检测与监督学习的区别是,当positive examples的数量足够大时,达到监督学习能够自己学习出所需要的各种特征,会去用监督学习。
15.6 选择特征
对于异常检测算法,我们使用的特征是至关重要的,下面谈谈如何选择特征:
异常检测假设特征符合高斯分布,如果数据的分布不是高斯分布,异常检测算法也能够工作,但是最好还是将数据转换成高斯分布,例如使用对数函数:x = log(x+c),其中c为非负常数;或者x=,c为0-1之间的一个分数等方法。
误差分析:
一个常见的问题是一些异常的数据可能也会有较高的p(x)值,因而被算法认为是正常的。这种情况下误差分析能够帮助我们,我们可以分析那些被算法错误预测为正常的数据,观察能否找出一些问题。我们可能能从问题中发现我们需要增加一些新的特征,增加这些新特征后获得的新算法能够帮助我们更好地进行异常检测。
异常检测误差分析:
我们通常可以通过将一些相关的特征进行组合,来获得一些新的更好的特征(异常数据的该特征值异常地大或小),例如,在检测数据中心的计算机状况的例子中,我们可以用CPU负载与网络通信量的比例作为一个新的特征,如果该值异常地大,便有可能意味着该服务器是陷入了一些问题中。
15.7多元高斯分布(选修)
假使我们有两个相关的特征,而且这两个特征的值域范围比较宽,这种情况下,一般的高斯分布模型可能不能很好地识别异常数据。其原因在于,一般的高斯分布模型尝试的是去同时抓住两个特征的偏差,因此创造出一个比较大的判定边界。
下图中是两个相关特征,洋红色的线(根据ε的不同其范围可大可小)是一般的高斯分布模型获得的判定边界,很明显绿色的X所代表的数据点很可能是异常值,但是其p(x)值却仍然在正常范围内。多元高斯分布将创建像图中蓝色曲线所示的判定边界。
在一般的高斯分布模型中,我们计算p(x)的方法是: 通过分别计算每个特征对应的几率然后将其累乘起来,在多元高斯分布模型中,我们将构建特征的协方差矩阵,用所有的特征一起来计算p(x)。
我们首先计算所有特征的平均值,然后再计算协方差矩阵:
其中是一个向量,其每一个单元都是原特征矩阵中一行数据的均值。最后我们计算多元高斯分布的:
其中:是定矩阵,在Octave中用det(sigma)计算
是逆矩阵,下面我们来看看协方差矩阵是如何影响模型的:
上图是5个不同的模型,从左往右依次分析:
- 是一个一般的高斯分布模型
- 通过协方差矩阵,令特征1拥有较小的偏差,同时保持特征2的偏差
- 通过协方差矩阵,令特征2拥有较大的偏差,同时保持特征1的偏差
- 通过协方差矩阵,在不改变两个特征的原有偏差的基础上,增加两者之间的正相关性
- 通过协方差矩阵,在不改变两个特征的原有偏差的基础上,增加两者之间的负相关性
多元高斯分布模型与原高斯分布模型的关系:
可以证明的是,原本的高斯分布模型是多元高斯分布模型的一个子集,即像上图中前3个例子所示,如果协方差矩阵只在对角线的单位上有非零的值时,即为原本的高斯分布模型了。
原高斯分布模型和多元高斯分布模型的比较:
原高斯分布模型
1、不能捕捉特征之间的相关性
但可以通过将特征进行组合的方法来解决
2、计算代价低,能适应大规模的特征
多元高斯分布模型
1、自动捕捉特征之间的相关性
2、计算代价较高 训练集较小时也同样适用
3、必须要有m>n ,不然的话协方差矩阵 不可逆的,通常需要m>10n ,另外特征冗余也会导致协方差矩阵不可逆
原高斯分布模型被广泛使用着,如果特征之间在某种程度上存在相互关联的情况,我们可以通过构造新新特征的方法来捕捉这些相关性。
如果训练集不是太大,并且没有太多的特征,我们可以使用多元高斯分布模型。
15.8 使用多元高斯分布进行异常检测(选修)
关于多元高斯分布,看到的一些建立的各种分布模型,当你改变参数,和。在这一节中,我们不妨用这些想法,并应用它们制定一个不同的异常检测算法。
回顾一下多元高斯分布和多元正态分布:
分布有两个参数,和。其中这一个n维向量和的协方差矩阵,是一种n*n的矩阵。而这里的公式x的概率,如按和参数化,和你的变量和,我们可以得到一个范围的不同分布一样,我们知道的,这些都是三个样本。
因此,让我们谈谈参数拟合或参数估计问题:
我有一组样本\mu\Sigma$以及标准公式?
估计他们是你设置 是你的训练样本的平均值。
并设置:
这其实只是当我们使用PCA算法时候,有时写出来。所以你只需插入上述两个公式,这会给你你估计的参数和你估计的参数。所以,这里给出的数据集是你如何估计和.让我们以这种方法而只需将其插入到异常检测算法。那么,我们如何把所有这一切共同开发一个异常检测算法?
首先,我们把我们的训练集,和我们的拟合模型,我们计算p(x),要知道,设定和描述的一样。