Anomaly Detection

异常检测是一个很有趣的问题,在生活中的运用也很广,比如在一系列信用卡刷卡行为中检测出盗刷行为,或者癌症检测等。

其目标简单来说就是希望从正常的数据集中分辨出个别的异常数据

直观看来,这就是一个简单的二元分类问题。把正常数据标记为正例,异常数据标记为负例,然后用LR、NN等方法训练一个二元分类器就好了。然而问题在于,我们的负例从哪里产生呢?即使我们人工筛选出一些负例,也并不能说明除了这些种类的负例就没有其它类型的负例了啊。

上图就是一个例子。正例是神奇宝贝时,负例可以是所有不是神奇宝贝的东西,比如数码宝贝或者一个茶壶。

设想这样一个场景,假如我现在想在一个图片网站上爬取一些猫和狗的图片做训练用,那么除了猫和狗以外的所有图片在我看来都是异常数据,这样如何才能很好地训练一个二元分类器呢?显然是很困难的。

异常检测希望做到的事情就是,给定猫和狗的图片(有标签)训练一个分类器,然后这个分类器可以判断一张图片是猫是狗或者无法分辨

要做到这一点,思路其实也很简单,就是看我们做出分类判断时候的置信度,或者说我们的分类器给出的属于猫或者狗的概率有多大,如果分类器认为一张图片属于猫的概率有0.99,属于狗的概率有0.01,那这张图片很可能就是一张猫的图片;如果分类器认为一张图片属于猫的概率有0.55,属于狗的概率有0.45,那么很大概率这张图片既不是猫也不是狗。

按照上述思路,我们只需要找到一个合适的阈值使得分类产生的最大概率(或者其它合适的衡量指标)大于时就认为数据是正常的,否则就认为数据是异常的。

那么合适的怎么找到呢?这需要我们先定义一个合适的损失函数。

首先精度在这里并不适合用于损失函数,因为我们的样本通常是非常不平衡的,可能100张辛普森家族的图片里只有5张是异常的非辛普森图片,这样如果我们用精度作为损失函数的话,我们直接令是0都可以得到95%的精度,但这对我们的问题毫无帮助。

因此我们要根据两类错误(正例错判和负例错判)的严重性来设定一个合适的权重,从而设计出一个合适的损失函数:

以上是我们的数据集有标签的情况,若我们拿到的数据集没有标签呢?这里首先要明确一个问题,那就是我们要保证数据集中大多数数据是我们想要的正例,否则是非常困难的。比如之前说的从图片网站上爬取猫和狗的图片,如果这些图片没有标签,要在这些图片中筛选出猫和狗几乎是不可能的,我们能做的顶多是对图片进行聚类,然后得到一个初步的猫狗图片集(事实上这一点都很难做到,因为我们难以选取聚类的指标)。

当数据集中大多数数据是正常点的时候,我们可以采用生成式模型,估计一个数据分布,然后计算各个数据点从这个分布中产生出来的概率,概率较小的就很可能是异常点。

除了上述方法,还有一些很好用的方法,比如Auto-encoder:

还有一些没听说过的方法,比如:

你可能感兴趣的:(Anomaly Detection)