[Python嗯~机器学习]---机器学习中的异常监测简述

异常监测

前面博客中我们学习了聚类算法,就是用机器学习方法把不同的无标签样本分成几类。那么,我们还是用一个问题
引出我们的讨论,如果我们的样本基本就是一类,很难会出现不同一类,这时候怎么分?

说白了,对大量的数据进行训练,如果有一个新的样本跟训练样本聚一类就是正常,偏离训练集就是异常。

如何定义异常监测?假设有一些数据,从x1到xm,我们通常假定这m个样本都是正常的,然后我们需要一个算法来
判断一个新的样本数据 x test 是否是正常的。
方法:
1、对训练集中的无标注数据集建立一个度量分布概率的模型 p(x)。
2、对于一个新的数据样本带入到训练得到的概率模型中。
3、如果计算得到的概率 p 低于我们设置的阈值,异常。大于等于我们的阈值,正常。

如上图,在这个训练集我们建立了一个模型 p(x),那么最小的蓝色圆圈的值最大,越靠近中心 p 的值越大,当远离
到一定的程度,我们就认为新的数据样本是异常点。

异常检测算法实际上就是有了很多正常的数据以后,我们需要判断新的样本是否和之前的正常的数据类似。这时候
大家就会想,那么这个不就是分类问题?
分类问题中,我们把样本分成正负类样本,或者自己做分类项,而我们异常监测中,我们的正常数据远大于异常数
据(常理上来讲,工业中大多数都是正常的产品和样本),所以我们用正常样本做一个概率模型,只是关心新样本
跟我们的正常样本的相似度,异常样本不需要分类,不关心到底哪一方面的异常,因为异常可能会出现太多种了。

通过上图案例,联系到我们的显示生活中。
在异常检测中可能最常见的应用就是欺诈检测。假设有一家金融机构,拥有很多用户,我们通过记录所有使用用户
的各种各样的行为,训练一个用户的行为模型,把用户的行为都做到计算机里面。如,特征x1表示用户登陆的频率,
x2 表示用户访问某个页面的次数或者交易的次数,x3 表示用户在论坛上的发帖数。。。等等。
做一个用户行为模型 p(x)。
把后面用户的行为放到模型中,如果得到 p(x)概率小于ε,就标记这些用户为异常用户,可以进行人工审核等一系列
后续操作,重点监测。
这种技术大量地被应用于在线购物网站以及金融贷款的app或者网站中。

异常检测的另一个重要的应用就是在工业生产领域中,假如我们生产一批零件,我们可以发现不太正常的零件,然
后对异常零件做更细致的检查。同理,可以推广到其他生产中,只要你有正常的大量数据。

计算机生产环境中,监控数据中心中的服务器是否处于良好的应用状态。比如,常见的数据中心的规模一般是数千
台服务器,对于超大规模的可能有数万台,那么我们可以实时地监测每台服务器的内存占用率,每秒硬盘读取次数,
CPU负载,网络负载等等。那么我们就可以对之前拿到的这些数据进行建模,得到一个p(x),它表示一台服务器处于
正常状态的概率。
这样,我们就可以及时地了解哪些计算机可能处于不太正常的状态,精准排查,保证集群的正常运行。

如何来计算或者衡量我们样本的相似性呢?

前面我们在支持向量机的时候讨论过高斯分布,也就是一种密度函数,当时是衡量我们的样本点跟地标点的相似程度。


假设x是一个实数随机变量,如果x的概率分布服从均值是μ,方差为σ^2的高斯分布,如上图,那么我们就将它记为
X~N(μ,σ^2)。
高斯分布的概率密度函数就是上图曲线。μ 表示对称线位置,σ 控制曲线的的宽度。所以,这就决定了x不同取值的
概率密度分布。例如,x取μ附近的值的概率就很大,而x取远离中心点μ的值的可能性就较低,而且越远越低。

具体 μ,σ 的作用如上图。

参数估计

假设我们有一个一维数据集,假设这些样本是高斯分布,并且不知道μ、σ这两个参数是多少。不过我们有数据集,
所以相当于我们知道这个高斯分布的一些输出,那么通过输出我们可以猜测输入来确定参数μ、σ。
例如上图,一个数据集对应的高斯分布曲线。μ对应的这个地方,数据点更多,也就是概率更高,而离中心稍远的
话,数据点就要少一些,那么对应着概率稍低。那么这条蓝色曲线对应的 μ和σ就是对这个数据集不错的一种参数
估计。
计算这两个参数的公式不多赘述,如上图。是一种极大似然估计的逻辑。

高斯分布和异常监测


因为高斯分布能计算相似度,所以
假设我们有一个无标签的训练集,一共有m个样本,并且这些样本都有n维特征。那么,现在我们要解决异常检测
的方法是,我们要从数据中建立一个p(x)概率模型,它应该等于第一个特征 x1的出现概率乘以 x2的出现概率,在
乘以第三个特征X的出现概率,一直这样下去,直到最后一个特征xn。
如何建模?
对p(x1)的建模,就认为x1服从高斯分布,那么p(x1)就是p(x1;μ,σ1^2),如上图。
所以,我们认为每一个特征的分布都服从高斯分布,后面只需要找到每一个特征对应的高斯分布参数μ和σ就可以
了。其中,认为特征之间没有关系,即x1的取值跟x2的取值无关,x2的任意取值对于x1的取值没有任何影响。

异常检测算法

1、选择特征。根据具体的业务选择出正常与否的特征。
2、第二步,根据m个训练样本,拟合出每一个特征对应的高斯分布的参数μ1~μn,σ1^2~σn^2。调用方差和期望公
式。
3、对于一个新样本,把它的特征带入到p(x)模型中,判断概率是否小于一个我们确定的阈值。

对于一个高维的特征,高斯函数也可以理解成一个概率密度函数,通过训练和参数估计得到参数之后代入新的样本点
之后的再比较我们的阈值,异常监测。如上图。

构建一个异常监测系统


为了更加有效地开发一个异常检测系统,那么最好能找到某种评价异常检测系统的方法。那么,如果我们有一些带标
注的数据,能够判断哪些是异常样本,哪些是正常样本,那么这就是评价异常检测算法的标准方法。
假设,我们使用y=0表示完全正常,而使用y=1来代表那些异常样本。

异常检测算法的开发和评估过程基本如下:

1、认为无标注的训练样本是大量正常样本的集合。
2、定义交叉验证集和测试集。假设交叉验证集和测试集中有一些样本是异常的,就是其中有一些样本的标注y=1。

比如,我们制造了1万台引擎,而其中大部分都是正常的,但其中也有20台有一些瑕疵。在典型的异常检测上下文环
境中,一般都会有非常大量的正常样本数据,也会有一些不正常的样本,虽然这些不正常的样本可能非常少。
那么,有了这组数据以后,我们需要把这些数据划分出训练集、交叉验证集和测试集。
然后,我们把2000个正常的样本放到交叉验证集中,假设10个异常的样本,这样我们就不仅能够评价模型对于正常样
本的鉴别能力,也能够评价模型对于异常样本的鉴别能力。
最后,对于测试集,我们也在其中放2000个正常的样本,然后把剩下的10个异常样本加入其中。那么,用这个测试集,
我们就可以给出最终该模型的效果了。

首先,我们在测试集上拟合出模型p(x)。然后,我们在交叉验证集和测试集上执行这个模型,就可以针对这些样本做
出预测。
可以借鉴我们以前讨论的准确率和召回率来评估。

异常监测和监督学习的区别


其实就是大多数都是正样本或者负样本的情况下用异常监测,正样本和负样本或者其他类型样本都比较多的时候用
监督学习的分类。当某些样本本来就非常少,同时又各不相同的话也说要用异常监测。

异常检测的典型应用是欺诈检测,因为欺诈本身是少数用户行为,欺诈也有非常多的方式,并且每种方式出现的次
数都很少,也就是说我们可能没有足够的数据来对每种欺诈方式来学习得到模型。因此,对于欺诈检测,我们一般
都会使用异常检测。但是,如果像京东、天猫这种超级大的网上零售平台,很多欺诈都会在它上面发生,那么对于
他们而言,可能会有比较充分的 y=1的样本,因此这样可能使用监督学习也是一种可行的办法。不过,这主要取决
于我们是否对于异常的样本有足够的数据。不过即便如此,一般情况下,对于欺诈检测,主要还是会使用异常检测,
而不是监督学习,除非我们非常清楚地知道数据已经足够了。

特征选择


首先,前面讨论的异常检测算法中,我们使用高斯分布来对特征进行建模。那么,我们是不是要判断特征是不是真
的服从高斯分布?如上图。
当遇到看起来完全不像高斯分布的数据分布的时候,我们常常会对它做一个转换,使得它更像高斯分布,这会使得
算法性能变得更好。
对于这种分布,做对数转换,也就是log(x),转换入上图,,看上去就非常像一个高斯分布了,这样我们拟合出来的
μ 和 σ 就可能更好地反映出真实的数据分布了。

在开发异常检测的时候,类似于在监督学习中,我们也需要进行误差分析,以此来对算法进行有效地正向迭代。
对于异常检测,我们是对正常的样本数据进行建模,得到模型p(x)。
这个模型的含义是给定一个样本,它究竟有多大的概率是正常的样本。因此,对于正常的样本,我们希望p(x)越大越
好,而对于异常的样本,我们希望p(x)越小越好。不过,可能最常遇到的问题是正常样本和异常样本的 p(x) 可能都差
不多。
比如,我们这里的样本,暂时只有一维特征,也就是x1,使用高斯分布来对他进行拟合,假如有一个异常样本在上图,
画圈处,看上去就像被淹没在了一堆正常的样本中,在x1这个特征上实际上可能出现的概率还挺高的。那么我们的算
法就没有办法把这个异常样本识别出来。这时候,就需要仔细地去检查这个样本,看看它到底哪里有问题,是不是能
够通过研究它,启发我们能够构建出新的有效的特征,比如x2,如右图。

多元高斯分布

目前我们讨论的异常检测算法,有一个非常强的假设,那就是各个特征之间都是独立不相关的。这样的假设使得我们
的模型非常简单,但这种假设在现实中往往并不成立,特征之间常常或多或少地具有一些相关性。

多元高斯分布,可以发现简单模型发现不了的异常。

假设我们的无标签数据是一个数据集,如左图,我们看到横轴是cpu的负载,纵轴是内存使用率,这是我们讨论说的
监控数据中心里服务器的例子。每一个红叉其实就是一台服务器。分别对这两个特征使用高斯分布建模,那么它们分
别就如右图,那么如果我们拟合一下高斯模型,也就是计算出高斯模型的两个参数:均值μ和方差σ^2,就能得到上图
的两个分布。
现在假设我们有一个测试样本在这里[左上角叉],它的x1大约是0.4,x2大约是1.5。如果我们观察正常样本的分布,它
们基本上分布左图蓝椭圆中,所以这个叉其实离正常的样本还是挺远的,应该被视为一个异常。在我们训练样本中,
也就是正常的样本中,cpu负载看上去跟内存使用率是正相关的,cpu负载高,那么内存使用率也不低。而我们这个叉
所代表的样本,cpu负载虽然低,但它的内存使用率却很高,这种数据显然跟我们的正常样本不怎么相似,所以它看上
去应该是一个异常。
按照之前开发的特征之间没有关联的异常检测算法可能不太会将这个样本认为是异常的。多元高斯分布就是用来解决
这个问题的。

因为模型中引入特征之间的相关性,所以对 p(x) 建模的时候就不能直接把各个特征的模型简单地乘在一起。我们不能
针对每一个特征去独立地建模,我们需要一次性对整个模型进行建模。所以,因为我们的特征x是n维向量,那么整个
模型的μ也应该是n维向量,而要表现特征之间的相关性,我们就需要一个协方差矩阵Σ——一个n*n的矩阵,这个协方
差矩阵类似于我们前面学习PCA时说过的协方差矩阵。对于多元高斯分布,公式如上图。



上图,我们的协方差矩阵。

多元高斯分布就是对特征之间的相关性进行建模。比如,我们可以对x1,x2高度相关进行建模。
具体来说,如果我们修改协方差矩阵中的非对角线元素,我们会得到一种不同的高斯分布。
如果两个的特征相关性更大的话,那么它们的协方差矩阵对应位置的值也就越大,比如0.5变成0.8以后,我们可以看到
x1和 x2的相关性更加强了。

使用多元高斯分布的异常检测


异常监测就讲完了~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值