李宏毅机器学习笔记——Anomaly Detection(异常侦测)

发布于:2022-11-03 ⋅ 阅读:(821) ⋅ 点赞:(0)

异常检测概述

对于异常检测任务来说,我们希望能够通过现有的样本来训练一个函数,它能够从数据中学习到某些正常的特征,根据输入与现有样本之间是否足够相似,诊断出非正常的数据。

数据的正常和异常,取决于训练资料是什么,并没有特定谁是异常的,不是说异常就一定是不好的东西


通常来说,Anoamly Detector在不同的领域里面有不同名字,也被叫做Novelty Detection,Outlier Detection,Forgery Detection,Out-of-distribution Detection。

异常检测应用广泛,实际应用场景有:诈骗侦测、网络入侵检测、癌细胞检测。

Anomaly Detection分类

异常侦测不是一个单纯的二元分类问题

最简单的想法就是Binary Classification,它是收集一组正常的数据和一组异常的数据,将正常的资料标记为class 1,异常资料作为class 2,然后让机器一起训练一个二分类的分类器。

但实际上是很难按照这样的做法来实现的:

  • 异常数据并不是一种类型,变化太大,无法视为一个class。只要是非正常的都是异常,没有办法将异常数据全部收集齐全。
  • 对于正常的数据收集是比较简单的,但对于异常数据的收集通常是较难的

第一类:给定一组训练数据,并且带有某种类型的label,使用这些数据先训练一个classifier。数据和label中并没有unknown,但是期望classifier在遇到一个没有见过的样本时能给出unknown的判定。也被称为Open-set Recognition。
第二类:所有的训练数据都是没有标签的,通过相似度来判断异常数据。这里面又分两种情况:

  • clean: 所有数据都是正常数据
  • polluted: 数据中混杂了异常数据

数据存在标签

训练

给定一组Simpsons家族人物的数据,并且这些数据都是有label的,训练一个Simpsons的家族分类器,输入人物图片,输出名字。可以使用这个Classifier来做异常侦测,输入一个人物,判断其是否属于Simpsons家庭。

输入x 之后,分类model输出一个分布,将该分布的最大值作为信心分数c(x),和设置的阈值λ 进行比较,判断是否异常,小于则是异常,大于则是正常。

当输出分布比较集中,最高的分数比较高的时候就是正常;分布比较平均,最高分数比较低就是异常。

或者我们也可以将输出向量看成一个概率分布,然后计算该概率分布的信息熵entropy,因为对于概率分布来说如果它的各个取值的概率越平均则信息熵越大,否则信息熵越小,那么上面的例子中就是第一个的信息熵很小,第二个的信息熵很大,那么我们就要设定小于阈值才是正常的,大于才是不正常的。 

下面是该分类器的分类结果。第一张图显示对于正常图片,分类器给出的信心分数很高。第二张图显示对于异常图片,分类器给出的信心分数比较低,只有10%的异常图片信心分数高

验证集和评估分类model

训练之后,通过Dev Set(验证集)衡量异常侦测系统的性能,调整模型的超参数——阀值(threshold),防止在测试集上过拟合。Dev Set要模仿测试数据集,即要包含正常数据,也要包含异常数据,且带有对应的标签(标签只要说明是与否就行了)。

如何计算一个异常侦测性能的好坏?

因为样本不均衡的原因,所以衡量分类器的好坏通常不用正确率这个指标。假设现有100张正常simpsons家族图片和5张其他动漫图片,得到了以下结果。蓝色表示simpsons家族的得分,红色表示其他动漫的得分。阈值λ设置在0.3时,负样本只有5个,如果计算model的正确率有0.952,正确率很高,但明显该系统并不好。


在异常侦测的问题里会有两种错误:将正常的检测为异常的和将异常的检测为正常的。

设置不同的阈值λ得到不同的分布矩阵。假设阈值λ设置在0.5可以得到如下的混淆矩阵:

设置在0.8可以得到(右侧)另外的混淆矩阵:


哪个分类系统更好,主要取决于更在意missing还是更在意false alarm。可以用不同的cost table,来评估取不同λ时,系统的好坏。

Cost table A:正常的资料误判成异常扣100分(即false alarm),异常的资料没有被侦测到(即missing )扣1分

Cost table B :异常的资料没有被侦测到扣100分,正常的资料被误判成异常扣1分


即可以根据实际情况进行权重的调整。不同的任务,计算cost的方式也不一样。

Possible Issues

用分类系统来对输入做异常侦测可能会遇到问题。两种图片的“相似”与否应该看全方面的特征,但是分类系统可能只学习到正常样本的某种特别明显的标签,于是可能会把异常样本看成正常样本。比如假设有一个classifier,可以区别猫和狗。classifier对于输入比如食蚁兽和羊驼来说,确实可以检测出他们是异常数据。但是对于老虎和狼,在猫和狗的特征上特别强烈,classifier很难将它们挑出来。

比如只学习到辛普森家族的人物的脸都是黄色的,下面将异常样本涂成黄色,可以得到很高的信心分数

解决方法:

  • 这个问题的根本原因可能是异常样本实在是太少了。首先让机器看到正常资料时不要只做分类这件事情,要学会一边做分类,一边看到正常的资料信心分数就高,看到异常的资料就要给出低的信心分数。
  • 一般是很难收集到大量异常数据的,考虑使用生成器(如GAN)生成一些异常资料。但在生成模型中也要加一些特别的constraint,使得生成资料像又不像正常资料,即是有相似点的。

Without label(无标签的数据)

问题定义

就是得到了没有标签的数据。根据样本数据,应用极大似然估计的方法,求出样本的概率密度函数,正常的样本在该分布中得到的概率就高,异常的样本概率就低,那就可以类似地设置一个阈值将正常和异常的样本区分开。

举例一个游戏,假设大部分玩家都希望完成这个游戏(也就是说大部分都是正常数据),而这部分数据我们会用来训练。然后我们使用异常检测,找出其中的“恶意玩家”(即异常数据)。

具体做法

把用户表示成一个向量,向量中的每一项可以表示这个用户的一种行为。使用一个几率函数P来判断是否异常样本


由于玩家的行为是可以统计的,假设有两个维度,可以获得不同玩家行为的概率分布。

假设给定一种概率密度函数fθ(x)可以描述数据的分布,其参数θ(指代所有的参数)是未知的,那么可以通过极大似然估计来获取参数的值。选择不同的 θ 值可以算出不同的似然值,而我们需要一组θ 使得似然最大。

上面是只是一个抽象的说法。假设概率密度函数 fθ(x)为常用的高斯分布,参数是均值和协方差矩阵,也就是我们关注的θ参数。计算极大似然值,得到最佳的均值和方差:


现在有了计算好的概率密度函数可以使用概率值来计算了,颜色越深代表概率越大,λ在图上就是一条等高线:

以上的例子只是使用了两个特征,也就是输入向量x只是二维;而机器学习的好处就是可以处理更多特征。

当然这里有一个非常强的假设,即数据分布满足高斯分布。实际上一般也不见得满足,但是高斯分布用的十分广泛,有人说人的很多行为都是满足高斯的,即使不是,也很类似。所以基本上用高斯的效果都还不错。

极大似然估计部分可以参考:李宏毅机器学习笔记-生成模型和逻辑回归_iwill323的博客-CSDN博客

Auto-encoder做异常检测

用训练数据去训练一个auto-encoder来做异常检测,可以根据对图片的还原度来判断是否为异常数据。

正常资源图片是可以大致还原的

异常资源图片是难以还原的:

Auto-encoder参考: 李宏毅机器学习--self-supervised:BERT、GPT、Auto-encoder_iwill323的博客-CSDN博客

总结

本章是在介绍Anomaly Detection(异常侦测)的问题定义与分类,以及不同的类应用不同方法去做Anomaly Detection。先考虑用二元分类器去做Anomaly Detection(异常侦测),但是由于异常数据并不都是一种类型,并且对于收集大量异常数据是较难的,所以这个方法是不行的。其次对于有标签的训练数据,应用的分类器模型是输出标签y同时输出一个信心分数。然后对于无标签的训练数据,假设数据分布满足Gaussian Distribution,即可方便的计算出其概率密度函数,做异常侦测便可较为直观。
 

 

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到