十三、异常检测
1. 问题动机
在进行训练开始前,我们可以通过一些算法去检测我们的数据集中是否有一些异常的数据,因为可能会因为一些异常的数据而导致我们训练的效果下降。
所以,我们会通过一个p(x)模型,对数据集进行检测,我们可以设置一个epsilon阈值,如何数据在p中的值小于这个阈值,我们就可以认为这个数据点是异常(anomalous) 点。
接下来,介绍一些关于异常检测的应用。
欺诈检测
可以通过获取用户的各个特征来判断其是否为异常用户,可以适用于各个网站。
机械生产
例如可以用于飞机引擎,通过各个特征在p模型中得到的值去判断是否发生故障。
计算机数据管理中心
同样可以通过计算机的各个特征去判断计算机是否异常,从而可以及时停机避免造成意外。
2. 高斯分布
我们来深入了解一下高斯分布(也称正态分布),我们一般会用x来表示高斯分布。
其中我们要知道的是,σ是标准差而σ2则是方差,它决定了曲线中的宽度,而μ则决定了曲线中心的位置,上面的这个公式不要求去记住,在用到的时候随时都可以查到。
下面我们看一些关于高斯分布的例子。
通过观察可以发现,σ越小曲线越窄,σ越大曲线越宽,而μ会改变曲线中心的位置。
最后再来看看如何进行参数估计。
我们可以通过数据集中的x以及上面的式子,计算出μ和σ2从而还原正态分布图像,其中求σ2的式子中1/m在有些版本中可能会是1/(m-1),但效果都差不多,不过通常人们会使用1/m去计算。
3. 算法
这节课,我们来看看异常检测算法的具体步骤。
首先,我们会选择一些能够代表你数据的特征。
然后,用这些训练集特征去拟合参数。
最后,给定新的特征x,带入p中计算与epsilon比大小判断是否异常。
然后,再来看一个例子。
可以看到,如果给定两个特征去拟合参数,会得到一个三维的图像,在秃顶内的都是正常,在秃顶外的都是异常。
4. 开发和评估异常监测系统
在进行算法时,如果能返回一些数值来评估好坏这会使我们的选择更加简单。
所以,我们一般会去收集一些带标签的数据,其中包含异常和正常的样本,并且令y=0时为正常,y=1时为异常。然后开始划分训练集、交叉验证集和测试集,下面就是一个例子。
假设你有10000个正常样本和20个异常样本,那么你就可以将6000个正常样本划为训练集,剩下的正常样本和异常样本对半分给交叉验证集和测试集,接下来再来看看算法评估的具体步骤。
我们首先会用上面划分出来的训练集去拟合我们的模型p,然后通过交叉验证集和训练集去预测y的值,观察预测的效果,但是这里y=0的结果会远比y=1的结果多,所以以正确率为判断标准并不合适,故我们会用到之前讲到的真假阳性与真假阴性来计算出准确率和回归率,最终算出F1的值来判断算法的好坏。
这里还有一点要注意的是对于epsilon即阈值的选取,我们可以尝试不同的epsilon来观察F1的值,然后选取F1值最大的那个epsilon作为训练的阈值。
5. 异常检测和监督学习
通过上节课的学习,你可能会想已经有标签的数据集了为什么不直接使用监督学习算法进行训练,那么这节课就来讲讲什么时候用异常检测合适,什么时候用监督学习合适。
异常检测
负样本数量一般会比正样本数量多很多,导致监督学习算法无法从正样本中学习到很多知识,所以无法很好区分正负样本,这时候异常检测会对负样本进行建模,可以更容易检测出正样本情况,例如飞机引擎的例子。
异常的类型一般会比较多样,所以监督学习无法从少有的正样本中了解各种异常的真面目,而且也无法去预测未来新类型的异常会使怎么样的,而异常检测只是检测出异常情况,并不用对异常的类型给出判断,故异常检测在此时就会派上用场。
监督学习
正样本和负样本数量一般都很大,所以监督学习有足够的数据去了解正样本和负样本的真实面目,从而很好的进行正负结果的划分。
一般使用监督学习的情况对于未来出现的新样本类型是已知的,它与训练集里的样本类似,所以可以通过前面训练集中的样本训练出来的模型对新样本进行判断。
而异常检测的典型应用就是之前讲到的欺诈检测、制造领域产品检测、计算机数据管理中心等,监督学习包括垃圾邮件分类、天气预测、癌症预测等应用。
6. 选择要使用的功能
在你使用异常检测时,对于用于算法训练的数据选择,有时候也会影响算法的效果,如下:
有时候你的数据可能会像上方最上面的那个直方图一样,这时候图像接近于一个高斯分布,那么直接用于算法训练并不会造成多大影响,但是如果按照其下面这个不匀称的直方图的话,就需要先进行一次数据处理,例如加入log函数或者平方开方等操作,转化为类似于高斯分布图像,再拿去进行训练。
在进行异常检测时,我们还可能遇到正样本和负样本得出的p(x)都很大的情况,如下:
可以看到有时候如果只有一个特征,那么从高斯分布图像来看,异常点可能会夹杂在正常点中间,难以进行区分,这时候你就可以想出一个新的特征加入进去,这样很可能就能将异常点分离出来。
最后,再来介绍一下对于特征选取的一些建议。
有时候你可能发现你的一些特征处于线性关系,例如CPU负载和网络流量,并且这时候某台计算机进入一个死循环无法进行检测,是因为它的CPU负载很高但是网络流量确实正常的,所以就难以进行检测,故这时候就可以设置新的特征,例如将CPU负载与网络流量相除,或者将CPU负载的平方与网络流量相除,就能很好的解决这类问题。
7. 多变量高斯分布的异常检测
有时候,如果我们单独对每个变量进行高斯分布,然后将他们用于异常检测的话,可能有些异常点的p(x)值都不会很低。
从上图可以看出,这时候我们就要引出多变量高斯分布了。
这次,我们分别对特征进行高斯分布,而是对特征整体放入p(x)模型中得到高斯分布,这时候我们的参数sigma就成为了一个对角线矩阵,接下来我们观察一下当参数变化时图像的改变,以两个特征为例。
可以发现,当对角矩阵上的值变小时,图像会变得更尖,值变大时,图像会变得更扁。
如果只改变特征中一个值的话,就只会改变那个特征上的方差大小。
如果改变sigma非对角线上的值的话,它的投影图像就会往y=x直线方向靠近。
如果将sigma非对角线的值改成负数的话,投影图像就会往上个案例的反方向靠近。
当然,你不光可以改变sigma矩阵中的值,也可以改变μ矩阵中的值,这会使分布中心发生偏移。
那么接下来,我们看看如果将多变量高斯分布用于异常检测当中。
这里参数拟合计算中的sigma与我们之前PCA的主成分分析问题规划用到的是一样的,下面是具体步骤。
我们先用训练集的数据去拟合出参数得到p(x)模型,然后将新样本带入p(x)模型中计算,从而判断是否为异常点。
我们一般会用原始模型较为多一些,接下来我们来看看原始的模型与这个多元的模型有什么区别。
在原始模型中,你可以手动创建特征来捕获某些异常,其中创建的特征是由某些特征组合而成的,而多元高斯分布在这种情况下,会自动获取特征之间的关系。
原始模型在特征数量非常大的情况下,开销也不会特别大并且运行的效果也能不错,而多元高斯分布如果特征数量非常大的话,需要计算其逆矩阵的开销就会非常大。
原始模型允许训练集数据量比较小的情况下进行训练,而多元高斯分布则必须要训练样本数量要大于特征数量才能进行训练,因为如果样本数量少于特征数量的话,上面公式中计算的逆矩阵就会不可逆,一般会要求训练样本数量大于等于特征数量的十倍情况下才可以用多元高斯分布进行训练。