Anormaly Detction/Density Estimation
无监督学习的另外一个应用是异常检测,主要是验证新的样本数据是否是异常数据,常用于工业质量检验等。
我有一批全部正常(或大部分正常)的数据 x(1),x(2),...,x(m)∈Rn ,希望通过这部分正常的数据建立起一个模型来评估新的数据 x 是否正常,应该怎么去做?
主要的手段是:
(基于正态分布的)异常检测(密度估计)
密度估计就是建立起一个模型来计算样本正常的概率
这个过程中,有这么几个问题是需要去考虑的:
1. 我们怎么建立模型来计算
p(x)
2. 如何评估/调整建立的这个模型
3. 我们的阈值
ϵ
怎么选择
4. 我们的特征如何选取
首先,我们考虑
如何建立模型来计算 p(x) ?
- 从数据的特征分量中选择我们认为有助于识别异常数据的特征分量 xj ,构建训练集
- 假设训练集数据的每个特征分量都是服从正态分布的,也就是 xj∼N(μj,σ2j) 。
- 计算每一个特征分量对应的
μj,σ2j
μj=1m∑i=1mx(i)jσ2j=1m∑i=1m(x(i)j−μj)2其中, m 很大时,σ2j 的估计用总体方差 1m 和样本方差 1m−1 的差异并不明显。 - 对于新的样本,计算
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)
- 判断 p(x)<ϵ
就理论而言,(1)式如果要成立,那么所有的特征分量
xj
必须相互独立。但是在实际的应用中,会发现即使
xj
不满足彼此相互独立的要求,(1)式的计算效果也很好。所以对于
xj
独立性的问题不再单独讨论。
(这里的概率密度函数用的是正态分布,那么可以说我们学习到的是基于正态分布的密度估计。那如果我们假设
xj
是服从其他的分布,比如泊松分布等等,那么我们是否可以得到其他的密度估计方法?其他的密度估计方法和高斯分布的效果相比如何?)
这里的另外一个问题是需要做一个区分:在数学中,我们将分布函数
F(x)
看成是在
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)
来做预测
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. 做异常检测时,应该如何进行选择
多变量的高斯分布
对于一个数据
x∈Rn
,前面我们在计算其
p(x)
时,我们使用了
p(x)=Πmi=1p(xi;μ,σ2)
。现在我们不单独考虑每一个特征分量,而是将
x
看成一个整体,把
其中 μ∈Rn,Σ∈Rn×n (协方差矩阵covariance matrix), |Σ| 是 Σ 的行列式determinant
对于矩阵 Σ ,对角线上的元素代表了各个特征的 σ ,特征越大则幅度越宽。非对角线元素代表了各个特征之间的相关性,可以看作是相关系数,在matlab图里面的体现就是倾斜的程度(不妨和直线的斜率k联想到一起)。 μ 的各个分量则对应了各个特征分量的 μ
基于多变量高斯分布的异常检测
我们前面做error analysis的时候提到过这么一种情况:对异常数据
x
,由于某些特征之间存在着某种关联,会出现
以下是检测过程:
1. 对模型
p(x)
调参
2. 对新数据 x ,计算
3. 判断 p(x;μ,Σ)<ϵ ?
单变量/多变量高斯分布两者异常检测有什么关系
单变量是多变量的一种特殊形式,是
p(x;μ,Σ)
的
Σ
是一个对角矩阵,即对角线元素以外的元素均为0.
如何选择合适的高斯分布
单变量 | 多变量 | |
---|---|---|
处理特征间的关联 | 手动构建新特征 | 自动发现 |
计算成本 | 低, n→100000 | 高 |
训练集大小 | m 比较小也适用 | 必须满足 |
在使用多变量的时候,如果出现了
Σ
是奇异的,或者不可逆的情况,可以从以下两个方面分析:
1. m是否大于n
2.
Σ
是否有形如
x1=x2,x3=x4+x5
的redundant feature,如果有则
|Σ|=0
,显然是不可逆的。当然,这种状况出现的可能性比较小。主要还是1的情况