Coursera ML笔记 -----week9-1 异常检测

来源:互联网 发布:人造奶油危害 知乎 编辑:程序博客网 时间:2024/06/05 04:49

欢迎点击作者原文地址

Anormaly Detction/Density Estimation

  • 如何建立模型来计算p\(x\)
  • 考虑如何评估并且调整建立的模型和阈值ϵ的选取?
  • 异常检测 v.s. 监督学习
  • 特征值的选取
  • 拓展:基于多变量高斯分布的异常检测
    • 多变量的高斯分布
    • 基于多变量高斯分布的异常检测
    • 单变量/多变量高斯分布两者异常检测有什么关系
    • 如何选择合适的高斯分布

无监督学习的另外一个应用是异常检测,主要是验证新的样本数据是否是异常数据,常用于工业质量检验等。

我有一批全部正常(或大部分正常)的数据x(1),x(2),...,x(m)Rn,希望通过这部分正常的数据建立起一个模型来评估新的数据x是否正常,应该怎么去做?

主要的手段是:
(基于正态分布的)异常检测(密度估计)

密度估计就是建立起一个模型来计算样本正常的概率p(x),判断p(x)和阈值ϵ之间的关系。当p(x)<ϵ时,我们就说这个数据是异常的。

这个过程中,有这么几个问题是需要去考虑的:
1. 我们怎么建立模型来计算p(x)
2. 如何评估/调整建立的这个模型
3. 我们的阈值ϵ怎么选择
4. 我们的特征如何选取

首先,我们考虑

如何建立模型来计算p(x)

  1. 从数据的特征分量中选择我们认为有助于识别异常数据的特征分量xj,构建训练集
  2. 假设训练集数据的每个特征分量都是服从正态分布的,也就是xjN(μj,σ2j)
  3. 计算每一个特征分量对应的μj,σ2j
    μj=1mi=1mx(i)j
    σ2j=1mi=1m(x(i)jμj)2
    其中,m很大时,σ2j的估计用总体方差1m和样本方差1m1的差异并不明显。
  4. 对于新的样本,计算p(x)
    p(x)=p(x1;μ1,σ1)p(x2;μ2,σ2)...p(xn;μn,σn)=Πnj=1p(xj;μj,σj)=Πnj=112πσe(xjμj)22σ2  \spce(1)
  5. 判断p(x)<ϵ

就理论而言,(1)式如果要成立,那么所有的特征分量xj必须相互独立。但是在实际的应用中,会发现即使xj不满足彼此相互独立的要求,(1)式的计算效果也很好。所以对于xj独立性的问题不再单独讨论。
(这里的概率密度函数用的是正态分布,那么可以说我们学习到的是基于正态分布的密度估计。那如果我们假设xj是服从其他的分布,比如泊松分布等等,那么我们是否可以得到其他的密度估计方法?其他的密度估计方法和高斯分布的效果相比如何?)
这里的另外一个问题是需要做一个区分:在数学中,我们将分布函数F(x)看成是在x点的概率,f(x)(也就是我们这里的p(x))看作是概率密度。所以在这里,我们真正计算的并不是样本数据的概率,而是样本的概率密度。当然,采用概率的说法, 能够有助于理解。

接下来

考虑如何评估并且调整建立的模型和阈值ϵ的选取?

我们在supervise learning中了解到,对于一个模型,最好是能够一个数值方式来对模型进行评估。可以是分类的准确率,也可以是评价矩阵,也可以是精准率/召回率,或者F1-score。并且可以把数据集分成训练/验证/测试集。
对于验证集和测试集,我们假设其都是带有label的数据,正常数据y=0,异常数据y=1。那么我们按照以下的步骤进行评估/调整:
1. 在训练集x(1),x(2),...,x(m)上训练模型p(x)
2. 对验证集的数据(x(i)cv,y(i)cv)根据p(x)来做预测

y={10ififp(x)<ϵp(x)ϵ

3. 数值评估。显然验证集的ycv是skewed class,0多1少。那么就只能考虑用评价矩阵,Precision/Recall,F1-score

阈值ϵ怎么选择?
参考以前选d,选λ的方法,选取多个ϵ,分别代入计算,选择最大值

异常检测 v.s. 监督学习

在上面的模型评估中,我们使用了一些带有label的数据,并且我们的过程和前面在监督学习中涉及的有一些类似。所以会产生的一个疑问就是:我们为什么要用Anormaly Detction,而不用supervise learning ?或者转换一下:我们在什么情况下考虑使用Anormaly Detction,什么情况下使用supervise learning

我们主要从两个方面去判断使用的方法:1.看数据中阳性数据y=1的数量 2.看阳性数据之间的差异性。

和阴性数据y=0相比,当阳性数据的数量特别少(至多50个),我们就采用异常检测的方法,并把这些阳性数据放到验证集和测试集中。而如果阳性数据比较多,我们就采用监督学习的方法。
当阳性数据之间的差异比较大(数据量不大),甚至到彼此之间没有任何的共同点,下一次出现的异常数据可能根本就没有在现有的阳性数据里面出现,算法并不能从已有的阳性数据中学习到足够的经验,那么我们可以考虑使用异常检测的方法。如果阳性数据比较相似,从现有的阳性数据出发可以预测到下一次的阳性数据(阳性数据之间存在着某种关系),那么就可以使用监督学习的方法。

当然,这里面更重要的其实还是阳性数据的数量。例如:我们前面学习过的垃圾邮件分类。垃圾邮件之间的差异性确实会比较大,但是因为垃圾邮件的数量特别多,所以我们认为这是一个监督学习的问题,而不是一个异常检测的问题。

特征值的选取

我们在前面已经学习过了如何建立并且评估一个异常检测的模型,但是其中有一点我们似乎忽略掉了。我们只提到了选择合适的特征分量来构建训练集,但是我们并没有说如何去选择。那么剩下的工作就是,我们怎么去选择特征分量。
这个工作主要是从两个方面去着手:
1. 非高斯分布的特征值处理
在前面我们假设各个特征分量是服从正态分布的,那如果它们不是服从正态分布的话,我们的算法还能够继续使用么?答案是肯定的,因为我们可以将非高斯分布的特征值转换成为服从正态分布的新特征。常用的手段有:log(x+C),xsmallpower(0,1)
2. 如何增加合适的新特征
这部分的工作主要是在于error analysis。
我们可能会遇到这么一种情况,我们知道一个样本是异常的,但是按照我们现有的模型去计算其p(x),我们会发现p(x)ϵ。这个时候我们可以认为,这个异常数据暗含了一种新的特征的可能性很大。我们希望可以从中提取出新的特征,来解决掉我们碰到的p(x)ϵ的问题。

至此,我们的异常检测的基本过程就已经学习完成!


拓展:基于多变量高斯分布的异常检测

前面已经学习过了基于单变量正态分布的异常检测,现在来了解基于多变量高斯分布的异常检测。
我们需要了解这么几个问题:
1. 什么是多变量的高斯分布
2. 我们怎么将多变量高斯分布运用到异常检测中?
3. 单变量/多变量高斯分布两者有什么关系?
4. 做异常检测时,应该如何进行选择

多变量的高斯分布

对于一个数据xRn,前面我们在计算其p(x)时,我们使用了p(x)=Πmi=1p(xi;μ,σ2)。现在我们不单独考虑每一个特征分量,而是将x看成一个整体,把p(x)的计算方法变成

p(x;μ,Σ)=1(2π)n2|Σ|12e12(xμ)TΣ1(xμ)

其中μRn,ΣRn×n(协方差矩阵covariance matrix),|Σ|Σ的行列式determinant
对于矩阵Σ,对角线上的元素代表了各个特征的σ,特征越大则幅度越宽。非对角线元素代表了各个特征之间的相关性,可以看作是相关系数,在matlab图里面的体现就是倾斜的程度(不妨和直线的斜率k联想到一起)。μ的各个分量则对应了各个特征分量的μ

基于多变量高斯分布的异常检测

我们前面做error analysis的时候提到过这么一种情况:对异常数据x,由于某些特征之间存在着某种关联,会出现p(xi;μ,σ)ϵ。我们前面用到的方法是构建新的特征,但是在此处我们直接采用基于多变量高斯分布的异常检测的方法,它可以自动地找到特征之间的关联,不用我们去构建新的特征。
以下是检测过程:
1. 对模型p(x)调参

μ=1mi=1mx(i),Σ=1mi=1m(x(i)μ)T(x(i)μ)

2. 对新数据x,计算p(x)
p(x;μ,Σ)=1(2π)n2|Σ|12e12(xμ)TΣ1(xμ)

3. 判断p(x;μ,Σ)<ϵ?

单变量/多变量高斯分布两者异常检测有什么关系

单变量是多变量的一种特殊形式,是p(x;μ,Σ)Σ是一个对角矩阵,即对角线元素以外的元素均为0.

Σ=σ21σ22σ2n

如何选择合适的高斯分布

  单变量 多变量 处理特征间的关联 手动构建新特征 自动发现 计算成本 低,n100000 高 训练集大小 m比较小也适用 必须满足m>n(m10n),否则Σ不可逆

在使用多变量的时候,如果出现了Σ是奇异的,或者不可逆的情况,可以从以下两个方面分析:
1. m是否大于n
2. Σ是否有形如x1=x2,x3=x4+x5的redundant feature,如果有则|Σ|=0,显然是不可逆的。当然,这种状况出现的可能性比较小。主要还是1的情况

0 0
原创粉丝点击