一句话定义:异常检测(Anomaly Detection)是只用大量正常样本训练模型,让它学会“正常长什么样”,再把明显不像正常的样本挑出来。
它的难点不在算法,而在数据本身:正常样本多到用不完,异常样本却少得可怜。信用卡欺诈可能只占万分之几,工厂里一台设备一年也坏不了几次。更麻烦的是,异常往往没有统一定义:故障形态千奇百怪,今天是这样,明天可能是另一种,你没法事先收集到“所有类型的坏样本”来训练。于是这类问题通常被建模成单类学习(one-class learning):不学“坏是什么样”,只学“好是什么样”,画出一个正常数据的边界,新样本落在边界外就报警。
打个比方:小区保安。他不可能认识全城的小偷,但他天天看业主进出,清楚“正常”是什么样——几点上下班、走哪个门、拎什么东西。深夜有人翻墙进来,他立刻觉得不对劲。他靠的不是坏人的名单,而是对正常的熟悉程度。
工程上常见的三条路:
- 重建类:自编码器(Autoencoder)只用正常数据训练,学会“压缩再还原”。正常样本能还原得很好,异常样本还原误差大,误差超过阈值就报警。设备振动、图像瑕疵检测常用这个。
- 边界与密度类:孤立森林(Isolation Forest)、单类支持向量机(One-Class SVM)、局部离群因子(LOF)等,判断一个点是否落在数据稀疏区或正常边界之外。
- 统计基线:3σ、滑动窗口阈值、同比环比。看着朴素,在很多业务里依然是最先上线、最容易被信任的那一版。
和相邻概念的区别:
| 概念 | 训练数据 | 目标 |
|---|---|---|
| 二分类 | 正负样本都要有,且要有代表性 | 区分两类 |
| 异常检测 | 几乎只有正常样本 | 描述正常,偏离即报警 |
| 聚类 | 无标签 | 分组,不判断好坏 |
| 开集识别 | 有标签的已知类 | 判断“不属于已知类” |
对从业者的实际意义:第一,别用准确率(accuracy)评估。若异常只占 1%,模型全判“正常”就有 99% 准确率,却毫无用处。要看精确率与召回率(precision / recall)、PR 曲线,并按业务算清“漏报”和“误报”各自的成本。第二,阈值不是模型的一部分,它是业务决策,需要人来定,也需要随季节、促销、版本升级而调整。第三,训练集里的“正常”必须覆盖各种周期性波动,否则模型会把正常波动当异常。第四,异常不等于故障,它只表示“不一样”,可能是故障,也可能是新业务形态,最后一步通常还得人来判断。
对普通人来说,银行卡被盗刷的短信、体检报告上的箭头、工厂设备的提前预警,背后常常就是这套思路:先学会正常,再对不一样保持警觉。误报多是这个领域的常态,所以好的系统不只管报警,也管报警之后怎么让人快速确认。具体产品的实现细节与指标,以官方页面为准。
