1. 背景
异常(异常值、离群点)一般指的是与标准值或期待值有偏离的样本,即与绝大部分数据“长得不一样”。
2. 异常检测(Anomaly Detection)
2.1 AD的一些特点
1. 异常不一定代表是“坏”的事情,但往往是“有价值”的事情,要对异常的成因感兴趣;
2. AD往往是在无监督模式下完成的,我们并不知道哪些数据是异常。
2.2 AD的应用
1. 金融反欺诈、信用卡诈骗检测(把欺诈或金融风险当作异常);
2. 罕见病检测:检测早发的阿兹海默症;
3. 网络流量入侵检测;
4. 机器故障检测:实时监测发现或预测机械故障;
5. 图结构、群体检测:如检测疫情的爆发点。
2.3 AD的挑战与难点
1. 大部分情况下是无监督学习,没有标签信息可以使用;
2. 数据是极端不平衡的(异常点仅占总体的一小部分),建模难度大;
3. 检测方法往往涉及到密度估计,需要进行大量距离/相似度计算,运算开销大;
4. 在实际场景中往往需要实时检测,比离线检测难度更高;
5. 在实际场景中常常需要同时处理很多案例,运算开销大;
6. 可解释性比较差,一般很难给出AD的原因,尤其是在高维数据上(但业务方需要了解成因);
7. 在实际场景中往往有一些检测的历史规则,如何与学习模型进行整合。
2.4 AD工具汇总
语言 | 框架 | 备注 | 链接 |
python | PyOD | Python Outlier Detection Toolbox, 30多种模型算法,和sklearn用法一致 | https://github.com/yzhao062/pyod https://zhuanlan.zhihu.com/p/58313521 |
Scikit-Learn | 包含4种常见算法,简单易用 | ||
TODS | 与PyOD类似,包含多种时间序列检测 | ||
R | outliers package | ||
AnomalyDetection | |||
Java | ELKI | ||
RapidMiner | AD扩展 |
2.5 AD算法汇总
主要模型 | 备注 | |
线性模型 | PCA | |
基于相似度的度量算法 | KNN,LOF,HBOS | |
基于概率的算法 | COPOD | |
集成检测算法 | 孤立森林、XGBOD | |
NN算法 | AutoEncoder(自编码器) |
2.6 评估方法
因数据极端不平衡,不能简单使用准确度(accuracy)进行评估。
备注 | |
ROC-AUC曲线 | |
Precision @ Rank K | topK 的精准 |
Average Precision | 平均精准度 |
3. 主流模型介绍
3.1 k-近邻检测
1. 思想:计算每个点距离第k个近邻的距离,如果这个距离越大,就越可能是异常点。
2. 调用方法:from pyod.models.knn import KNN
3. 优点:简单易懂、实现简单;
4. 缺点:需要计算距离,运算开销大、不适合高维大数据。
3.2 LOF
1. 思想:计算每个点在局部区域上的密度和其邻域点的密度来判断异常程度。
2. 调用方法:from pyod.models.lof import LOF
3. 优点:简单易懂、实现简单;
4. 缺点:需要计算距离,运算开销大、不适合高维、大量数据。
3.3 HBOS
1. 思想:假设每个维度间都是独立的,分别计算一个样本在不同维度上所处的密度空间,并叠加结果。
2. 调用方法:from pyod.models.hbos import HBOS
3. 优点:简单、开销小,可并行计算,适用于大量数据;
4. 缺点:无法考虑不同特征间的关系,虽然在实际使用中效果很好。
3.4 COPOD
1. 思想:计算一个(多维)样本在每个维度上是异常点的可能性,再合并所有维度上的结果结果。
传统的统计方法会把特征空间上的每个维度单独建模,然后估算一个样本在这个维度上的“异常程度”(如2sigma以外),但这样忽略了不同维度间并不独立(特征点并非是完全独立的)。而通过copula函数(一种概率模型),我们可以对所有的特征一并联合建模,估算出“经验累积分布函数”,以此来估计每个样本在不同维度上有多么异常。
2. 调用方法:from pyod.models.copod import COPOD
3. 优点:运行快、无需调参,有一定的可解释性;
4. 缺点:决策边界比较复杂。
参考:https://zhuanlan.zhihu.com/p/338189299
3.5 Isolation Forest
1. 思想:利用DT的特点,多次对特征空间进行划分,然后观察孤立一个点的难易程度,异常点往往在密度比较低的地方,更容易被隔离出来(DT深度比较低)。
决策过程是不断对特征空间进行划分,异常点一般处于树的上面(离root更近)。
2. 调用方法:from pyod.models.iforest import IForest
3. 优点:运行快、效果好,适用于大量数据,容易并行;
4. 缺点:需要调的参数比较多,结果有一定的随机性。
3.6 PCA
1. 思想:对全部数据计算特征向量,异常样本距离特征向量的距离比较远,因此该距离可以被用作异常值。
2. 调用方法:from pyod.models.pca import PCA
3. 优点:直觉上简单,运算开销适中;
4. 缺点:作为一种线性模型,效果往往有一定的局限性。
3.7 Autoencoder
1. 思想:通过自编码器的先压缩encoder,再还原decoder,异常点会有更大的重建误差。
类似PCA,但扩展到了非线形模型上。
2. 调用方法:from pyod.models.auto_encoder import AutoEncoder
3. 优点:理解简单,是PCA类模型的非线形扩展;数据量大、特征多的时候适用;
4. 缺点:NN模型往往有一定的随机性,运算开销比较大。
3.8 XGBOD -- 监督学习
1. 思想:如果数据有标签,那么是否可以结合xgb与无监督的检测方法(把无监督的方法当作强特征空间的方法)。从数据增强和提升的角度对原始数据集进行提升:使用各种无监督学习的异常值来作为新的特征。
ML的目标是得到好的数据表示,使得下游的分类任务变得容易。
2. 调用方法:from pyod.models.xgbod import XGBOD
3. 优点:可以同时利用数据中自带的标签,以及无监督学习带来的更好的表达;
4. 缺点:需要标签信息,运算开销比较大。
4. AD模型选择与合并
无监督AD往往需要训练多个异常检测模型,再去合并(如平均),其局限性如下:
(1)不存在选择的过程,因此只能得到平庸的结果;
(2)忽视了AD的局部性特征。
缺乏选择过程的全局性合并过程会使得合并的价值有所降低,得到稳定却中庸的结果。
4.1 AD模型选择与合并:LSCP
提出一种新的合并框架,来“选择”适合于每个测试点的基础异常检测模型。
1. 解决方案:每当我们获得一个新的样本X进行预测时,先评估哪些检测模型在这个点邻近的区域上表现良好,那我们就可以相信它会在X上表现良好。所以最简单的就是对于X,找到在它附近的训练数据上表现最好的模型,然后输出作为X的结果即可。
2. 流程:
(1)训练多个基础AD器;
(2)生成伪标签用于评估;
(3)对于每个测试点生成局部空间,即近邻;
(4)模型选择与合并,即对所有的基模型在我们找到的局部空间上用生产的伪标签进行评估,和伪标签在局部空间上Pearson大的被选作最终输出模型。
3. 调用方法:from pyod.models.lscp import LSCP
4.2 AD模型选择:MetaOD(under review)
1. 背景:拿到一个新的数据集想做AD,该怎么选择最合适的AD模型?
2. 挑战:如何在无监督前提下对任意数据集选择合适的AD模型。
3. 思路:把无监督的模型选择问题转化为”冷启动下的推荐问题“,给数据集选择模型就像给新用户推荐电影。可以借用RS的方法,如矩阵分解进行模型选择。
4. 训练与学习方法:首先需要得到大量的数据(有标签)在各种AD模型下的表现,即模型表现矩阵P,之后对P进行矩阵分解。
5. 具体流程:
(1)得到历史数据在不同模型上的表现矩阵P;
(2)对其进行分解成U和V矩阵;
(3)得到数据的表示embedding,并训练一个回归模型f,使得数据表示回归到矩阵U上;
(4)当拿到新数据时,先得到其数据表示,并使用f得到对应的,最终得到预测的模型表现
6. 调用方法:
from metaod.models.predict_metaod import select_model
4.3 AD训练加速: SUOD
在高维度、大数据上训练多个无监督AD模型,运算开销会很大,可以在不同层面上进行加速:
1. 数据层面:进行降维,SUOD使用JL(Johnson-Lindenstrauss) projection,可以保证数据多样性的前提下降维。
2. 模型层面:利用知识蒸馏的思想(用小的NN去模拟大的NN输出),使用监督模型来学习(高开销的)无监督模型的训练结果。(无监督的密度估计开销很大)
3. 系统层面:每个模型的开销各不相同,在做分布式学习时可能每个worker上的负载不同,导致先完成的worker需要等待还未完成的worker。为此尝试去预测不同模型学习所需的时间,并根据预测值进行合理调度。
调用方法:from suod.models.base import SUOD
参考:https://zhaunlan.zhihu.com/p/112588169
5. 一些技巧
1. 假设数据是有标签的,优先使用监督学习(如xgb),如果数据量不是非常大,也可尝试xgbod;
2. 不知道如何选择合适的AD模型时,优先选择IF,也可以使用MetaOD进行自动模型选择;
3. 如果手动选择模型,需要考虑数据量和数据结构。当数据量比较大(data:10w+,fea:100+),优先选择可扩展性强的算法,如IF、COPOD、HBOS,其中IF、COPOD可解释性比较好;
4. 如果训练和预测过程比较缓慢、开销大的话,可以使用SUOD进行加速;
5. 如果数据量大、特征多,可以尝试基于NN的方法,并用GPU并行等;如果数据量不大,且追求精度比较高的结果,可以尝试随机训练多个检测模型,并使用LSCP进行合并。
6. AD落地中的考量和研究方向
6.1 考量
1. 不要尝试ML模型全部取代传统模型,应该尝试合并ML模型和基于规则的模型;
2. 可以尝试用已有的规则模型去解释AD模型。
6.2 研究方向
6.2.1 模型选择与调参
无监督学习缺乏有效的评估与反馈,可否使用伪监督的方法,如把多个模型的结果取平均当伪标签。
6.2.2 大规模异常检测
1. 并行化:现在缺少基于spark的AD工具,在大数据上AD很难发力;
2. 如何应对evolving feature(特征是变化的)以及在线检测covariate shift;
3. 模型压缩与优化:
(1)知识蒸馏:SUDO文章中尝试使用监督模型(RF)来替代无监督模型(kNN、LOF);
(2)Quantization: 降低精度。
6.2.3 边缘计算
1. 移动端上的AD:
如何在手机、智能手表上部署AD模型,主要还是依靠模型压缩;但测试成本比较高,比如android端需要使用java来部署和simulate。
6.2.4 AD中的公平性 -- FairOD
是否特定的特征(性别、年龄、种族等)会导致某一类群体更容易被认为是异常。
参考:https://arxiv.org/abs/2012.03063
6.2.5 基于DL的AD工具库
1. 越来越多的检测方法走向了DL(如基于GAN和VAE),但相关的工具库是缺失的;
2. 开发PyOD V2 for DL
参考:https://www.zhihu.com/question/324999831/answer/716118043