COPOD:用「统计」+「机器学习」检测异常

有些话、适合烂在心里 提交于 2020-12-21 14:52:34

1. 背景知识

异常检测(outlier detection),从最简单的角度出发就是看看数值偏离均值有多远。拿最简单的一维数据来说,可以先算一下均值( \mu )和标准方差( \sigma ),那么离均值2个或者3个以外的数值就可以简单的被认为是异常。如果假设数据符合正态分布的话,大概就是图中黄色标注的位置。如果我们能够得知数据的分布(比如CDF的话),那么我们还可以计算出一个样本可能处于分布最左边和最右边的概率

但实际情况中,有两个问题使得这个方法并不奏效。

首先真实数据往往不是一维的,而是有很多个维度?最简单的假设当然是每个维度互相独立,那么我们可以分别求每个维度上的异常程度,之后求所有维度上的平均异常,或者看是否有几个维度的异常程度比较大。但这个方法有个核心局限:并不是所有的维度间都是独立的,他们之间往往有一定的关联性!所以这种假设会忽视掉这种关系,导致建模过分简单。

其次就是单纯看一个点是否属于离均值很远可能是盲目的,因为分布有很多种,并不是每种分布都像正态分布这么优美。更加合理的方法是去估计一个点的尾端概率(tail probabilty),也就是在分布极端位置的可能性。

结合这两个目的:如果我们能够很好的估计出多维数据上的累计分布(multivariate CDF),那么我们就可以尝试去估算每个点的尾端概率,也就可以对异常情况进行评估。

2. COPOD:COPOD: Copula-Based Outlier Detection

在这个前提下,我们( @局关THU 只@了有知乎账号的作者)提出了一种基于copula的异常检测方法。copula是一种统计概率函数,用于对多维累计分布建模,可以用于对多个随机变量(RV)间的依赖关系(dependency)进行有效建模。这篇文章发表于今年的International Conference on Data Mining (ICDM'20),感兴趣的朋友一读简短的arxiv版本。

Li, Z., Zhao, Y., Botta, N., Ionescu, C. and Hu, X. COPOD: Copula-Based Outlier Detection. IEEE International Conference on Data Mining (ICDM), 2020.

COPOD使用了非参数(non-parametric)的方法,通过经验累积分布(Empirical CDF)来得到empirical copula,在这之后我们就可以简单的通过empirical copula来估算各个维度上的尾端概率。

3. 尾端概率与修正

在设想中,我们应该同时在意一个样本落在左边的tail和右边的tail的可能性,但实际情况上可能更加复杂。

以上图为例,异常可能出现在分布的左边,也可能出现在分布的右边,或者两边。不同情况下,用不同的尾端概率会得到不一样的结果,在这种情况下,我们去计算了分布的skewness (偏度),换句话说就是分布朝左偏还是朝右偏。如果朝左,那么我们更在意右边的尾端,反之亦然。

在这种情况下,我们设计的COPOD算法做了以上几件事:

  1. 1-4行,计算empirical cdf,得到left tail和right tail,以及偏度
  2. 6-15行,用copula得到左边和右边的尾端概率,并根据具体情况输出最适合的尾端概率

4. COPOD的优点

首先跟大部分异常检测算法不同,COPOD不需要进行样本件的距离计算,所以运行开销小速度快第二点就是不需要调参,直接调用即可。第三就是效果拔群,在超过30个数据集上跟另外9个主流算法(比如孤立森林,LOF)等对比综合排名最高。

除此之外,COPOD可以对异常是哪些维度造成的提供一些可解释性,比如我们可以直接找到造成异常最多的维度,进行深入分析。

5. 使用与阅读

和以往的工作一样,我们也将COPOD项目完整开源,并整合到了PyOD当中,方便大家使用几行代码进行检测。

# train the COPOD detector
from pyod.models.copod import COPOD
clf = COPOD()
clf.fit(X_train)

# get outlier scores
y_train_scores = clf.decision_scores_  # raw outlier scores
y_test_scores = clf.decision_function(X_test)  # outlier scores

原始项目代码winstonll/COPOD

PyOD集成https://github.com/yzhao062/pyod/blob/master/examples/copod_example.py

Arxiv精简版COPOD: Copula-Based Outlier Detection

引用:Li, Z., Zhao, Y., Botta, N., Ionescu, C. and Hu, X. COPOD: Copula-Based Outlier Detection.IEEE International Conference on Data Mining (ICDM), 2020.

@inproceedings{li2020copod,
title={{COPOD:} Copula-Based Outlier Detection},
author={Li, Zheng and Zhao, Yue and Botta, Nicola and Ionescu, Cezar and Hu, Xiyang},
booktitle={IEEE International Conference on Data Mining (ICDM)},
year={2020},
organization={IEEE},
}





易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!