无监督异常检测有哪些常见方法?
简化版
异常检测不是寻找“少数样本”这么简单,而是学习正常参照系,再按业务代价把异常分数转成告警。建模前要定义异常粒度、可用特征和反馈延迟,评估时优先看 Precision@K、召回率、告警预算与检测延迟。
详细版
- 点异常、上下文异常和群体异常需要不同特征与窗口。
- 无监督分数只表示相对离群程度,不天然等于异常概率。
- 阈值应在独立验证窗口按漏报和误报成本选择。
- 时间切分可避免未来分布泄漏到正常基线。
- 上线后必须监控分数分布、告警率和标签回流。
完整版教学
一、问题定义与核心直觉
先把检测对象定义为“用户日”“交易”或“时间窗口”。同一条记录在全局可能正常,在夜间、特定地区或连续序列中却异常,因此上下文必须进入参照系。
检测器输出连续分数 s(x),排序与决策是两层问题。训练阶段学习结构,验证阶段才用业务预算确定阈值;强行要求训练污染率等于线上异常率会混淆两者。
二、机制与公式
alert(x)=1[s(x)>=tau]
tau=argmin_tau(c_FN*FN(tau)+c_FP*FP(tau))
这里的 s(x) 可能来自距离、密度、隔离深度或重构误差,量纲因模型而异。若标签只覆盖被调查样本,直接统计 FN/FP 还会有选择偏差;应通过随机抽检或历史事件回放补足阈值评估。
三、带数字的推演
每天处理 100 万笔交易,人工只能复核 500 笔。模型前 500 笔命中 80 个真实异常,则 Precision@500=16%;若当天共有 200 个异常,召回率为 40%。这比只报 ROC-AUC 更直接对应运营能力。
这组数字还依赖“当天共有 200 个异常”已被充分标注;现实中若只核查 Top-500,就只能直接估计头部精度,不能把未核查样本一律当正常来计算完整召回率。
四、方案对比
| 方案 | 优势 | 代价或边界 |
|---|---|---|
| 统计规则 | 透明、冷启动快 | 难覆盖多变量交互 |
| Isolation Forest | 非线性且可扩展 | 分数需业务校准 |
| 监督分类 | 标签充分时最直接 | 受标签延迟与选择偏差影响 |
五、工程执行流程
定义检测单元与标签窗口 -> 按时间切分 -> 只在训练窗拟合预处理和检测器
-> 验证窗选择阈值 -> 回放峰值与事件 -> 灰度告警 -> 收集处置结果
上线应同时监控分数分位数、每日告警量、复核命中率与标签延迟。分数漂移但命中率不变和命中率下降需要不同处理:前者可能只需重选阈值,后者可能需要更新特征或模型。
六、边界条件与上线代价
季节性、批量任务和产品发布会整体抬高分数,若没有分群或动态基线,系统会制造告警风暴。
离线标签通常只覆盖被调查样本,未调查不等于正常;评估时应记录抽检策略,并用随机抽检估计选择偏差。
关键判断:记住“对象—参照—分数—阈值—反馈”五步:先说明检测谁和相对谁异常,再解释分数,最后用成本定阈值。
七、常见误区与追问
-
误区:异常就是出现频率最低的样本。 低频可能是合法长尾,高频模式也可能构成群体异常。
-
追问:没有标签怎么选阈值? 用告警预算、历史事件回放和抽样复核共同确定。
-
误区:AUC 高就一定能上线。 极低基率下前若干名精度和误报成本更关键。
-
追问:概念漂移如何处理? 监控分数分位数并按稳定周期重训或更新基线。
-
追问:如何防止泄漏? 预处理、阈值和模型都只能使用决策时已经可见的数据。
八、加强记忆
记住“对象—参照—分数—阈值—反馈”五步:先说明检测谁和相对谁异常,再解释分数,最后用成本定阈值。无监督只减少标签依赖,不会消除验证与运营闭环。