机器学习基础---无监督学习之异常检测
一:问题动机
将介绍异常检测问题,这是机器学习算法的常见应用,那么什么是异常检测问题?
(一)举例介绍异常检测
举例:比如生产汽车引擎,需要进行质量测试,而作为测试的一部分,需要测量汽车引擎的一些特征变量:
比如:x_1引擎运转时产生的热量;x_2引擎的振动;
我们根据数据集:,把数据绘制成图,如下图:
这样,异常检测问题可以定义如下:
假设,之后生产了一个新的汽车引擎,而新的汽车引擎有一个特征变量集,所谓的异常检测问题就是希望知道新的汽车引擎是否有某种异常,或者说希望判断这个引擎是否需要进一步测试。
如果落在原来的特征集之中,认为它是没有异常的;如果
出现在离原来的特征集很远的地方,则认为它是有异常的,需要做进一步检测,如上图所示。
更正式地定义:给定一个数据集,对它进行数据建模,当有新的特征变量
时:
(二)异常检测的应用案例
(1)欺诈检测
例如有些网站会记录用户的一些信息,打字速度、单位时间浏览网页次数
等等,然后用这些建立模型
,看哪些用户的
。
接下来看筛选出的用户,让他们做身份验证,从而可以让网站防御异常行为或欺诈行为。
(2)工业生产领域
就像之前提到的汽车引擎的问题,可以找到异常的汽车引擎,然后进一步的检测这些引擎的质量。
(3)数据中心的计算机监控
如果管理一个计算机集群,可以为每台计算机计算特征向量,内存损耗、硬盘访问量
、CPU负载
等等。
给定正常情况下数据中心计算机的特征变量,可以建立模型,观察是否有某台计算机
,可以检测这些计算机的情况。
二:高斯分布
(一)定义
假设x是一个实数的随机变量(),如果x服从高斯分布,其均值为
,方差为
,记作
高斯分布的图像如下:
数学公式:
(二)案例观察u和σ的影响---分布函数中心和高斯分布宽度
高斯分布的几个例子如下:
(三)参数估计问题
参数估计问题:给定数据集,希望能找到能够估算出μ
和
σ2的值。
参数估计的公式:
三:高斯分布构建异常检测算法
应用高斯分布来推导异常检测算法
假设有数据集:,且
,要处理异常检测问题先是要用数据集建立概率建模
,试图解决哪些特征量出现概率高,哪些特征量出现概率低。因此,x是个向量。要建立模型
。
注:每个特征相互独立
(一)那么如何对这些项进行建模呢?
假定特征是分散的,它服从高斯分布
,同样,也假设其他的特征服从高斯分布,那么得到模型:
虽然上面的公式是指对于每个特征都是独立的情况下成立的,但是在实践中结果表明:无论这些特征量是否近乎独立,并且即使这个独立假设不成立,这个算法也能正常运行。
这个分布项的估计问题有时称作是密度估计问题。
(二)异常检测算法的步骤和实现
1.选择那些你认为处于异常状态(有反常样本)的特征作为输入:x^(1),x^(2),...,x^(m)
2.我们要针对每一个特征计算μ和σ2的估计值。
3.一旦我们获得了平均值和方差的估计值,给定新的一个训练实例,根据模型计算 p(x):
当p(x)<ε时,为异常。
(三)案例
下图是一个由两个特征的训练集,以及特征的分布情况:
下面的三维图表表示的是密度估计函数,z轴为根据两个特征的值所估计p(x)值:
我们选择一个ε,将p(x)=ε作为我们的判定边界,当p(x)>ε时预测数据为正常数据,否则为异常。
四:开发和评价一个异常检测系统
将介绍如何开发一个异常检测的应用来解决实际问题,同时也将重点介绍如何评估一个异常检测算法。
在前面,我们已经提到了使用实数评价法的重要性。这样做的想法是:当你在用某个学习算法来开发一个具体的机器学习应用时,你常常需要做出很多决定。比如说,选择用什么样的特征等等。而如果你找到某种评价算法的方式直接返回一个数字,来告诉你算法的好坏,那么你做这些决定就显得更容易了。
所以比如你要决定,现在有一个额外的特征我要不要把这个特征考虑进来?如果你带上这个特征运行你的算法,再去掉这个特征运行你的算法,然后得到某个返回的数字。这个数字就直接告诉你,这个特征到底是让算法表现变好了还是变差了。这样,你就有了一种更好、更简单的决定要不要纳入这个特征。
到目前为止,都把异常检测看作是一个无监督学习问题,因为用的是无标签的数据,但如果有一个带标签的数据来指定哪些是异常样本和哪些是正常样本,这是能评估异常检测的标准方法。
为了评估一个异常检测系统,假设有一些带标签的数据,代表异常样本,同时还有一些无异常样本。(用y=0表示无异常样本,y=1表示异常样本)
(一)异常检测算法的开发过程和评估方法
(1)假设有训练集(之后再讲交叉验证集和测试集):把该训练集看作是无标签的,所以它是一个很大的无异常样本集合(正常样本,即使溜进了一些异常样本也没关系);
(2)定义一个交叉验证集和测试集,用来评估这个异常检测算法。
具体来说:对于交叉验证集和测试集,我们假设在其中包含一些已知是异常的样本。
(二)案例讲解
假设有10000个(绝大多数正常)的汽车引擎,还有20个异常的汽车引擎:
有了这组数据,要把数据分离到训练集、交叉验证集和测试集中,一种典型的方法如下:
注意:对于额外的20个异常样本,我们将其分别放置在验证集、测试集中
得到了训练集、交叉验证集和测试集之后,接下来使如如何推导和评估算法:
(1)首先使用训练集拟合模型p(x),即是把m个无标签样本都用高斯函数来拟合;(虽然是无标签,但是我们将他认为是正常的样本)
(2)然后在交叉验证集和测试集上,假设有一个样本x,用异常检测算法来预测出y的值;
(3)什么是好的评价指标?
▷ 计算True positive、false positive、false negative、true negative的比例
▷ 计算出算法的精确率和召回率
▷ 计算出F1-score,来总结和反映精确率和召回率
通过上述方法,就可以评价异常检测算法在样本集中的表现了。
(4)选择参数ε的方法:尝试使用不同的ε值,然后从中选出一个,该值能够最大化F1-score。
总之:使用训练集、验证集、测试集的方法是:当我们进行决策时,比如(是否纳入某个特征或者定义参数ε作为阈值),我们可以使用验证集进行评估算法,然后决定是否采用该决策。当我们找到合适的决策(选取合适的ε值)以后,我们就可以用最后的模型测试集进行评估(评估训练集得出的模型)
这里讨论了评估一个异常检测算法的步骤,开始用一些带标签的数据来评估异常检测算法,很像在监督学习中所做的。
补充:其他分配方法(不推荐)
这里是将4000个样本,同时用于验证集和测试集,然而通常我们认为验证集和测试集应该使用两个完全不同的样本
五:异常检测VS监督学习
在前面学习中,讨论了评估一个异常检测的过程,当时我们使用了一些带有标签的数据,举了一些例子,这些例子它们要么是正常的,要么是异常的,y要么等于1,要么等于0.所以问题就出来了,假如我们有这些带有标签的数据。我们有一些例子,我们知道它们是异常,还有一些例子我们知道它们是正常的,那么为什么我们不用一个监督学习算法,那么为什么我们不用一个逻辑回归或者一个神经网络算法去试图从我们的带标签的数据中直接学习,并去预测是否y等于1或者y等于0呢?
在这将介绍一些思想和方法可以在使用异常检测算法时用到,并且在使用监督学习算法时,这些方法可能会更有效。
(一)异常检测VS监督学习(1)
1.异常检测
它的正常例子数量更少,记住当y=1时这些例子为异常样例(0-20个正样本);
通常会有一个相比于正样本数量更大的负样本,可以用这数量庞大的负样本来拟合出的值。
所以如果只有负样本,仍然可以很好的拟合p(x)的值。
2.监督学习
在合理范围内有大量的正样本和负样本。
3. 所以这是一种思考方式决定应该使用异常检测算法还是监督学习算法。
(二)异常检测VS监督学习(2)
1.异常检测
对于异常检测应用来说,经常有许多不同类型的异常(比如发动机,出问题的异常有多种,还可能是以前没有出现过的异常)。
因此,如果是这种情况,有很少数量的正样本,那么对一个算法就很难去从小数量的正样本中去学习异常是什么;尤其是,未来可能出现的异常看起来会与已有的截然不同,如果是这种情况,那么更有可能的是对负样本用高斯分布模型来建模。
2.监督学习
在一些其他问题中,有足够数量的正样本或是一个已经能识别正样本的算法;尤其是,假如认为未来可能出现的正样本与当前训练集中的正样本类似,那么这种情况下,使用监督学习算法更合理,它能够查看大量正样本和大量负样本来学到相应特征。
3.所以决定应该使用异常检测算法还是监督学习算法,它们之间关键不同在于在异常检测中,通常只有很少量的正样本,对学习算法而言是不可能从这些正样本中学习到足够的内容。
(三)使用异常检测的应用和监督学习算法的应用
希望这节课能让你明白一个学习问题的什么样的特征,能让你把这个问题当作是一个异常检测,或者是一个监督学习的问题。另外,对于很多技术公司可能会遇到的一些问题,通常来说,正样本的数量很少,甚至有时候是0,也就是说,出现了太多没见过的不同的异常类型,那么对于这些问题,通常应该使用的算法就是异常检测算法。
六:选择要使用的功能---如何设计或选择异常检测算法的特征
对于异常检测算法,我们使用的特征是至关重要的(对运行有很大影响),下面谈谈如何选择特征。
(一)特征转换
异常检测假设特征符合高斯分布:(分布如下)
如果数据的分布不是高斯分布,异常检测算法也能够工作,但是最好还是将数据转换成高斯分布,例如使用对数函数:
上图看上去不像高斯分布的图像,是一个不均匀的分布,遇到这样的数据,通常会对数据进行一些不同地转换,使得它看上去更接近高斯分布。比如会进行一次对数转换log(x)或者log(x+c),进行一次指数转换
(二) 如何得到异常检测算法的特征?
这跟我们之前讨论监督学习算法时,误差分析步骤是类似的。我们先由训练集完整的训练出一个算法,然后在验证集中运行算法,然后找出那些预测出错的样本。并看看我们能否找到一些其他的特征来帮助学习算法,让那些在交叉验证集中判断出错的样本表现得更好。
通过一个误差分析步骤:
1.异常检测中,希望p(x)的值在正常样本的情况下比较大,在异常的情况下比较小;
2.一个很常见的问题:p(x)是可比较的,当样本正常和异常时,
p(x)的值都比较大。
(三)误差分析
一个常见的问题是一些异常的数据可能也会有较高的p(x)值,因而被算法认为是正常的。
这种情况下误差分析能够帮助我们,我们可以分析那些被算法错误预测为正常的数据,观察能否找出一些问题。
我们可能能从问题中发现我们需要增加一些新的特征,增加这些新特征后获得的新算法能够帮助我们更好地进行异常检测。
具体实例1:
假如从我们得正常样本拟合出来数据服从高斯分布,如下图:
有一个异常样本,并假设这异常样本x1的取值为2.5,如下图所示:
不难看出,这个异常样本被淹没在一对正常样本当中,而我们得算法没能把他标记为异常样本。如果这代表汽车引擎的生产或其他什么,那么我会做的是看看我的训练样本,看看到底是哪一个具体的汽车引擎出错了,看看通过这个样本能不能启发我想出新的特征x2来帮助算法找出异常的样本与正常样本的区别。
所以,希望能否创建一个新的特征下x2,使数据能够像下图中展示出来:(所有的训练样本就是下面红叉)
当然,也希望能看到异常样本,对于异常样本,这个特征x2能发现不寻常的值。因此对于上面提及的绿色样本(异常点),其x_1特征值依旧是2.5,但是特征值x_2很有可能是一个比较大的值(3.5)或者比较小的值:
现在如果再给数据建模,会发现异常检测算法在中间区域的数据有较高的概率,然后越到外层概率越小,到了图中绿色样本时,算法会给出很低的概率,这就更容易将异常样本从正常的样本中区分出来了。
具体实例2:
在平常选择特征变量时的一些思考:通常来说,选择特征变量的方法是选择那些既不会特别大也不会特别小的特征,对于那些我们认为很有可能是异常的样本。我们还是用监控数据中心的计算机的例子:
假如有一个计算机集群的管理,如何判断哪一台计算机有异常?,假设计算机特征有:
x1:内存使用量
x2:磁盘的容量
x3:CPU的负载程度
x4:网络流量
一般来说,我们认为CPU负载和网络流量线性相关。但是,如果出现CPU执行代码进入死循环,导致CPU负载高(相对于大多数CPU负载样本来说,还是被归于正常值),而网络流量为正常或者极低(也是正常),那么这里我们可以想出一个新的特征x5来帮助更好的检测异常,x5=CPU负载程度/网络流量,通过这种建立特征的方法,就可以捕捉到这些特殊的特征组合所出现的异常值。 (因为CPU负载高,网络流量正常,导致x_5极大,为异常)
这就是误差分析的过程以及如何为异常检测算法建立新的特征来检测不同的异常情况。
七: 多变量高斯分布
将介绍目前为止学习的异常检测算法的一种延伸,这个延伸将会用到多元高斯分布。(优劣皆有),可以捕捉到之前的算法检测不出来的异常。
(一)案例讲解
为了理解这个算法,我们先来看看一个例子:(数据中心的监控机)
如果我把这两个特征变量 x1 和 x2当做高斯分布来建模
这就是异常检测算法给 x1 和 x2 建模的方法。
假使我们有两个相关的特征,而且这两个特征的值域范围比较宽(如上),这种情况下,一般的高斯分布模型可能不能很好地识别异常数据。
其原因在于,一般的高斯分布模型尝试的是去同时抓住两个特征的偏差,因此创造出一个比较大的判定边界。
下图中是两个相关特征,洋红色的线(根据ε的不同其范围可大可小)是一般的高斯分布模型获得的判定边界,很明显绿色的X所代表的数据点很可能是异常值,但是其p(x)值却仍然在正常范围内。
多元高斯分布将创建像图中蓝色曲线所示的判定边界。
(二)多元高斯分布定义
假设有特征变量,不为
分别建模,而要建立一个整体的
模型,就是为所有
建立统一模型。
参数是和
(Σ被称为协方差矩阵)。
多元高斯分布的公式:
(三)多元高斯分布案例---修改Σ后,p(x)是什么样子的?
1.Σ带来的影响(一次改变Σ中两个元素)<各个特征没有相关性>
下面以二维特征变量为例:其中μ表示了高斯模型二维分布中心,Σ表示协方差矩阵,衡量的是各个特征的方差,或者说是特征变量x_1和x_2的变化量。如下图二,减少Σ,那么凸起鼓包宽度会减小,凸起高度会增加。
2.Σ带来的影响(一次改变Σ中一个元素)<各个特征没有相关性>
如图二中,将1改为0.6以后,它所作的事就是减少第一个特征变量x_1的方差,同时保持第二个特征变量x_2的方差不变。
3.Σ带来的影响(一次改变Σ中多个元素)<各个特征之间有相关性>
可以给x_1和x_2高度相关的情况建立模型。所以具体来说,如果改变协方差矩阵非对角线上的元素,就会得到一种不同的高斯分布。比如图二到图三,将非对角线上的值由0.5到0.8,我们会得到一个更高更窄的,沿着x=y这条线的分布。(可以看做x和y是一起增加的)
相反的,如果我们将其设置为负值,会沿着x=-y进行分布:
(四)多元高斯分布案例---修改μ后,p(x)是什么样子的?
通过这些例子可以让我们对多元高斯分布所能描述的概率分布有更多的了解,它最大的优点就是能描述两个特征变量之间可能存在正相关或者负相关的情况。
八:使用多变量高斯分布的异常检测
(一)多元高斯分布
参数拟合(参数估计):
假如有一组训练集样本:(每一个样本都是n维向量,且服从多元高斯分布)
如何去估计参数μ和Σ?
(二)开发异常检测算法
首先用数据来拟合该模型,通过设定的μ和Σ来拟合;
接着当有一个新样本x,也是测试样本,然后需要用多元高斯分布的公式计算,如果得到
很小(
),就标记该样本异常。
(二)多元高斯模型和原始模型的关系
原始模型实际上就是某种特殊情况下的多元高斯分布,这种特殊的情形就是当协方差矩阵Σ在非对角线上都是0的时候(各个特征相互独立,不相关),也就如下所示:
如果用这σ值,将它们放在协方差矩阵中,这时两个模型就会完全相同,所以这个原始意义上的模型只是多元高斯模型的一种特殊情况。
(三)如何在这两个模型之间进行选择呢?
原始模型要用的跟多一些;多元高斯模型用的相对少一些,但它在捕捉特征间的关系方面有着很多优点。
原始模型:
需要手动创建一些新特征来捕捉异常的组合值,因为比如x1和x2组合值出现异常的时候,可能x1和x2本身看起来都是很正常的值,如果花时间来手动创建这样一个新特征,原始模型就才能运行的更好;
原始模型最大的优势在于它的计算成本比较低(换言之,它能适应巨大规模n);
即使有一个较小的有一定相关性的训练集,也能顺利运行,这是一个较小的无标签样本用来拟合模型。
多元高斯模型:
对比之下,多元高斯模型就能自动地捕捉这种不同特征之间的关系;
但是它的计算成本比较高(即:能适应的n值的范围比较小);
必须使训练样本数量m大于特征数量n,如果在参数估计时不能满足这个条件的话,协方差矩阵就会不可逆(1.m<n;2.有冗余特征),将无法使用多元高斯模型。
这就是如何用多元高斯模型来进行异常检测,所以通过本章的学习,我们了解了异常检测这个算法,并且掌握了高斯模型在异常检测算法中的应用。