凌晨两点,监控面板跳出十七条告警,值班的人扫了一眼,按惯例全标成已知问题。第二天复盘发现,其中一条是真的。AI 在这类任务上早就在跑,效果却常常止步于此。异常检测的难处不在算法本身:正常样本成千上万,异常样本可能只有几个,任何模型都能轻易拿到 99% 的准确率,却挑不出该看的那一条。
它刻画的是正常,不是异常
监督分类要先有正负样本,模型才能学出边界。异常检测拿不到这个条件,训练集里通常只有正常数据,或者混着极少量异常。于是任务换了方向:先学「正常长什么样」,再用偏离程度当分数,分数超过阈值就报警。
这个转向带来一个直接后果:模型从没见过异常,也能把它报出来。代价是报出的「异常」只代表「不像正常」,不等于「有问题」。新上线的业务、做活动的流量高峰、设备换型,都会被它当成异常。
五条路线,各自假设了什么
常见方法可以按「怎么定义偏离」分成五类,每一类背后都有一个关于数据的假设,假设不成立时失效方式也不同:
| 方法 | 适用 | 失效 |
|---|---|---|
| 统计阈值(3σ、箱线图、z 分数) | 单指标、近似正态、基线稳定 | 分布偏斜或多峰时阈值失真;对周期性和节假日毫无办法 |
| 距离(k 近邻距离) | 低维、密度均匀、样本量中等 | 维度一高,距离失去区分度;密度不均时,稀疏区的正常点被误判 |
| 密度(LOF、DBSCAN 的噪声点) | 簇形状不规则、密度差异明显 | 邻域大小这个参数很敏感;训练集本身带异常时会污染密度估计 |
| 隔离(孤立森林) | 高维、样本量大、不想假设分布 | 藏在密集簇里的小幅偏移抓不到,局部异常对它几乎不可见 |
| 重构(PCA、自编码器) | 高维、有强相关结构,比如时序、图像、多指标联动 | 异常也能被重构得很好时彻底失效;重构误差的阈值难定 |
孤立森林和自编码器的分工值得记住。前者找的是「容易被单独切出来的点」,对全局离群敏感;后者找的是「重建不出来的点」,对违反相关结构的异常敏感。一台机器的温度偏高但仍在正常范围,孤立森林不会报;温度与负载的关系断了,自编码器会报。
阈值定在哪,是业务问题
模型给的是连续分数,落地必须切一刀。切在哪,取决于团队一天能处理多少条告警,而不是某个统计量。按误报预算反推阈值,比按 3σ 或 95 分位定要可靠得多。
定完还要回放验证:拿过去三个月已知的故障,看这套阈值能不能在故障发生前若干小时报警,同时数一数这三个月里会多出多少条误报。两个数一起看,才知道这套东西能不能用。
评估别看准确率
异常占比千分之一时,全部判正常就有 99.9% 的准确率,这个数字毫无信息量。该看的是召回率(真异常抓到了多少)和精确率(报出来的有多少是真的),以及两者随阈值变化的曲线。ROC 曲线在不均衡数据上过于乐观,PR 曲线更能反映实际。样本不均衡怎么影响指标和混淆矩阵四个格子各代表什么是这套评估的基础,评估指标怎么选则决定你盯哪个数调模型。
还有一条软指标:精确率低于一成时,值班的人会开始忽略告警,召回率再高也没意义。报警疲劳一旦形成,整套系统等于关闭。
什么时候它会开始误报
概念漂移是第一位的。促销季流量翻三倍、设备老化导致基线缓慢上移、业务改版换了埋点口径,这些都会让「正常」的定义变掉,而模型还停在训练时的那个定义上,数据漂移怎么被检测出来是配套要做的功课。
冷启动是第二处。新上的机器没有历史,任何基于历史的阈值都不适用,只能先用同类设备的基线顶着。第三处是多维联合异常:每个指标单看都正常,组合起来才异常,比如 CPU 不高但队列在涨。这类异常要求模型看特征之间的关系,单指标阈值一定漏。
它还有一条固定的短板:只给分数,不给原因。报警说「这条样本异常」,为什么异常、哪个指标带的、从什么时候开始,仍然要人去查。上游数据缺失更麻烦,缺失既可能被当成异常刷屏,也可能把真异常掩盖掉。
一个能跑起来的最小做法
先做单指标阈值加同比环比,这一层能覆盖多数常见故障,成本几乎为零。再加一层多指标残差:用其他指标预测目标指标,看预测值和实际值的差,这一层能抓到联动关系断掉的异常。最后才考虑上模型,并且要先证明前两层漏掉的确实值得用模型补。
每条告警都要能追到三件事:哪台机器、哪个指标、偏了多少。追不到这三样的告警,等于没报。
速查:异常检测
- 它学的是正常的样子,报出来只代表「不像正常」
- 阈值按团队能处理的告警量反推,不按 3σ
- 准确率在这里没用,看召回与精确的取舍
- 促销、老化、改版都会让「正常」漂走
- 先阈值加残差,再考虑模型


