【 李宏毅机器学习:异常检测 】Anomaly Detection(合辑)(中文)
异常侦测任务是需要根据一堆训练数据,找到一个函数,输入x时,函数判断x和训练数据是否相似。假设你提供了很多的雷丘作为训练数据,皮卡丘就是异常的。若你提供了很多的皮卡丘作为训练数据,雷丘就是异常的。若你提供很多的宝可梦作为训练数据,这时数码宝贝就是异常的。不是说异常就一定是不好的东西,具体的要根据训练集而定。
异常检测的应用场景非常多样,例如诈欺侦测(训练数据是正常的刷卡行为x为盗刷)、网络系统入侵侦测(训练资料为正常连线,x为攻击行为)、癌细胞侦测(训练数据是正常细胞,x为癌细胞)。
如何做异常检测?
很直觉的想法就是,收集正常和异常的资料,将正常数据当做一个类别1,异常数据当做类别2,训练一个二分类的模型。
但实际上没那么简单,因为正类的样本很容易收集到,但是负类的样本很难收集,根本没有办法知道整个异常的数据是怎么样的,所以不应该将异常的数据视为一个类别,因为它的变化太大了。假设现在有一笔正常的训练数据是宝可梦,只要不是宝可梦就视为是异常的数据,这样不只是数码宝贝是异常数据,凉宫春日也是异常数据,茶壶也是异常的数据。
另外一个问题是很多情况下不太容易收集到异常的资料,收集正常的资料往往比较容易,收集异常的资料往往比较困难。比如诈欺侦测,多数的交易通常都是正常的,很难找到异常的交易。异常检测有两种情况,
Case 1:有标签
训练资料有label,可以训练出一个classifier,教机器看到这些训练资料能不能预测出对应的label是什么。在这些label里没有任何一种label叫做“unknown”,我们期待训练好一个classifier以后,机器有能力知道新给定的训练数据不在原本的训练数据中,它会给新的训练数据贴上“unknown”的标签,这种异常检测叫做Open-set Recognition。
以辛普森家族成员的classifier为例,我们可以给分类器看一张照片,它就可以判断这个照片中的人物是辛普森家庭里面的哪个人物。
现在我们想做的事情是根据这个分类器来进行异常侦测,判断这个人物是否来自辛普森家庭。当我们将图片输入分类器时,分类器的输出是一个几率分布(distribution),将分类器的分布中最高数值作为信心分数c。定义一个阈值称之为λ,若信心分数大于λ就说明是来自于辛普森家庭。若信心分数小于λ就说明不是来自于辛普森家庭。
交叉熵(entropy)也可以作为信心分数c。对于分类模型的输出分布p=[p1,p2,...,pn](经过softmax后的概率),其交叉熵(Entropy)公式为:熵值越大(接近logn):预测分布越均匀,模型不确定性高(可能是异常样本);熵值越小(接近 0):预测分布越集中,模型置信度高。
也可以训练一个classifier,直接输出一个信心分数
但是这样的方法可能存在一定的问题,就是它可能只学习到正常样本的某种特别明显的标签而已,例如这样就很可能只学习到辛普森家族的人物的脸都是黄色的,那么如果将其他异常样本也涂成黄色的,那么就很可能可以得到很高的信心分数:
Case 2:没有标签
训练资料是没有任何的label,那我们的具体想法就是根据样本数据产生一个分布P(x),正常的样本在该分布中得到的概率就高,异常的样本概率就低,那就可以类似地设置一个阈值将正常和异常的样本区分开。例如下图:
那么接下来的问题就是如何寻找这个分布呢?我们可以假设存在一个概率密度函数fθ(x),那么代入某一个样本后得到的值就是该样本被取样得到的概率。θ决定fθ(x)的形状,θ要从数据中学习出来。那么根据最大似然估计思想,要找到对应的fθ(x)可以使得{x1,x2,...,xN}这些样本一起出现的概率最大,即
假设概率分布是高斯分布,解出函数fθ(x)之后就可以设置阈值,将不同的x代入,得到它们是正常还是异常的。
也可以用Auto-Encoder做异常检测,根据还原度判断是否是异常的数据,还原度越低越有可能是异常的数据。
还有One-Class SVM,Isolation Forest等
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |