异常检测是什么?从大量正常数据中找出“不对劲”的那些
异常检测(Anomaly Detection),也叫离群点检测,是从数据中找出那些与大多数数据明显不同、不符合正常模式的样本或事件的技术。这些“不对劲”的数据往往意味着需要关注的情况:欺诈、故障、攻击、错误,或者新出现的现象。
异常的几种类型
点异常:单个数据点本身就明显偏离其他数据,比如一张平时每月消费几千元的信用卡,突然一笔消费了几十万元。上下文异常:数据点本身的数值并不奇怪,但在特定的背景下就显得异常,比如气温 30 度在夏天很正常,在冬天就很反常;深夜在外地的一笔大额消费,比白天在本地同样金额的消费更可疑。集体异常:单独看每个数据点都正常,但一组数据放在一起就构成了异常,比如服务器在短时间内收到大量来自不同地址的相似请求,可能是一次网络攻击。
异常检测的难点
异常往往非常稀少,可能只占全部数据的千分之一甚至更少;异常的形式多种多样,而且新的异常类型会不断出现,比如欺诈分子会不断变换手法;很多时候没有标注好的异常样本可供学习;正常的数据本身也会随时间变化,需要区分“真正的异常”和“正常的变化”。因此,异常检测常常被看作一个无监督或半监督的问题:主要学习“正常”是什么样子,把明显偏离正常的数据判为异常。
常用的方法
统计方法:假设正常数据服从某种分布,偏离太远的就是异常。比如“三西格玛”规则,把距离平均值超过三个标准差的数据视为异常;箱线图方法,把超出上下四分位数一定范围的数据视为异常。这类方法简单,但通常只适用于低维、分布较为规则的数据。基于距离和密度的方法:异常点通常离其他数据很远,或者处在数据稀疏的区域。比如用一个点到它最近的若干个邻居的距离作为异常分数;局部离群因子(LOF)由 Markus Breunig 等人在 2000 年提出,比较一个点周围的密度与它邻居周围的密度,能发现那些在局部范围内显得稀疏的点。孤立森林:由 Fei Tony Liu、Kai Ming Ting 和周志华在 2008 年提出。它的思路很巧妙:异常点数量少、与众不同,因此更容易被“孤立”出来。算法随机地选择特征和切分点,不断地把数据一分为二,异常点通常只需要很少的几次切分就会被单独分出来,而正常点需要多次切分。它计算快、适合大规模高维数据,是工业界最常用的方法之一。一类支持向量机:只用正常数据训练,学习一个能包住大部分正常数据的边界,落在边界外的就是异常。深度学习方法:比如用自编码器只学习正常数据,遇到异常数据时它很难重建,重建误差就会明显偏大;对于时间序列,可以用模型预测下一时刻的值,实际值与预测值相差太大的就是异常。如果有一些标注好的异常样本,也可以把问题当作类别极不平衡的分类问题来处理。
应用
金融反欺诈:识别信用卡盗刷、异常转账。网络安全:发现入侵行为、恶意软件、异常的登录。工业设备的预测性维护:根据传感器数据,在设备彻底故障之前发现异常的振动、温度变化。IT 运维:发现服务器和应用的性能异常。医疗:发现异常的检查结果、心电图中的异常节律。制造业的质量检测:发现有缺陷的产品。数据清洗:发现录入错误和异常值。在实际应用中,异常检测系统往往需要在“漏报”和“误报”之间权衡:漏掉真正的异常可能造成损失,而误报太多又会让处理人员疲于应付,产生“警报疲劳”。