1000 条正常品加 25 条漂移 4 个标准差的异常品:3σ 检出 21 条、误报 0; IQR 检出 22 条、误报 2。漂移降到 1.5σ 时,三条线的检出率都只有 0.04。
上一节讲推荐,这一节进产线。 质量控制是 AI 落地最实的场景之一,而且它的评价指标跟分类任务不太一样。
一、三类阈值线,从简单到稳
最朴素的判异方法是 3σ:超出均值加减三倍标准差就算异常。 它假设数据近似正态,而且均值和标准差本身容易被异常值带偏。 IQR 方法改用四分位数:Q3 加 1.5 倍四分位距。四分位数只看排序位置,少数极端值拉不动它,所以更稳。 MAD 更极端:用中位数和「中位数绝对偏差」代替均值和标准差。 这是抗离群能力最强的一条线,代价是它对真正的异常也不敏感。 Demo 把三条线都算了一遍,阈值分别落在 53.489、53.246、53.571——三条线离得很近, 因为这份数据本来就很正态。
二、检出率和误报率要一起看
结果:3σ 检出 21 条、误报 0,检出率 0.840、精度 1.000; IQR 检出 22 条、误报 2,检出率 0.880、精度 0.917;MAD 和 3σ 一样。 「检出率高」和「误报少」是一对矛盾。把阈值往下调能检出更多异常,但同时会把正常品判成异常。 产线上这两个错误的代价完全不同:漏检等于不良品流出,可能要召回; 误报等于停机复查,浪费工时但不出事故。哪个更贵,决定了阈值该往哪边偏。 所以这一节不能只报一个「检出率」。两个数必须并排摆出来,才谈得上选方法。
三、漂移多小就检不出来
Demo 又扫了五档漂移量:1.5σ、2.5σ、3.5σ、4.5σ、6.0σ。 1.5σ 时三条线的检出率都只有 0.04——基本等于没检出来; 2.5σ 时 3σ 和 MAD 是 0.12,IQR 好一点 0.24;3.5σ 时都跳到 0.76 到 0.84; 4.5σ 以后全部 1.00。 这条曲线说明一件事:异常检测有个检出下限。漂移小于三个标准差时,单变量阈值法基本失效。 这也解释了为什么真实产线不满足于 3σ:他们监控的是几十个参数的联合分布,参数之间还会联动。 所以才有孤立森林、自编码器那类多变量方法。
四、这份数据有多不真实
数据是我按正态分布造的:1000 条均值 50.012、标准差 1.159 的正常品, 加上 25 条均值 54.695 的异常品(漂移约 4 个标准差)。 真实的传感器数据几乎不会这么乖:会有温漂、会有周期性波动、会有上一次换料留下的偏移。 这些因素让「正态」这个假设直接失效。 所以本节能带走的不是那三个准确率,而是这个方法论的骨架: 先定代价,再选阈值,最后看检出率和误报率的权衡。 顺序反了就白干:先选方法再想代价,选出来的阈值一定不合用。
五、动手 Demo:三条阈值线,检出率和误报率一起看
造 1000 条正常数据与 25 条漂移数据; 分别用 3σ、IQR、MAD 三种方法算阈值,统计检出数、误报数、检出率与精度; 再把漂移量从 1.5σ 扫到 6.0σ,看三条线的检出率怎么变。
mu, sd = good.mean(), good.std(ddof=1)
q1, q3 = np.percentile(good, [25, 75])
iqr = q3 - q1
med = np.median(good)
mad = np.median(np.abs(good - med)) * 1.4826
rules = [
(u'3σ', good.mean() + 3 * good.std(ddof=1)),
(u'IQR', q3 + 1.5 * iqr),
(u'MAD', med + 3 * mad),
]
pred = (x > th).astype(int)
tp, fp, fn, tn = H.conf(y, pred)
实跑输出:
--------------------------------------------------------------------
异常检测:三条阈值线,检出率和误报率一起看
--------------------------------------------------------------------
方法 阈值 检出 误报 检出率 精度
-----------------------------------------------------------------
3σ 53.489 21 0 0.840 1.000
IQR(Q3+1.5×IQR) 53.246 22 2 0.880 0.917
MAD(中位数+3×1.4826×MAD) 53.571 21 0 0.840 1.000
正常样本 1000 条,均值 50.012 标准差 1.159
异常样本 25 条,均值 54.695(漂移 4.0 个标准差)
换个漂移量再扫一遍,看三条线谁先顶不住:
漂移 3σ 检出率 IQR 检出率 MAD 检出率
-----------------------------------------
1.5σ 0.04 0.04 0.04
2.5σ 0.12 0.24 0.12
3.5σ 0.80 0.84 0.76
4.5σ 1.00 1.00 1.00
6.0σ 1.00 1.00 1.00
三条线都是「单变量 + 单一阈值」。真实产线要监控几十个参数,
而且参数之间会联动——所以才有孤立森林、自编码器那类方法。
这份数据是我按正态造出来的,真实传感器数据几乎不会这么乖。
三条阈值线:53.489 / 53.246 / 53.571。靠得这么近,是因为数据本身很正态; 真实数据里这三条线可能差很远。 3σ 和 MAD 检出 21 条、误报 0;IQR 检出 22 条、误报 2。 IQR 多抓了一条,代价是多报两个假的。 漂移扫描表是重点:1.5σ 时全部只有 0.04,4.5σ 以后全部 1.00。 中间 3.5σ 那一档三条线开始分家(0.80 / 0.84 / 0.76)。 异常品实测均值 54.695,比正常品高 4.0 个标准差——这个漂移量刚好在「能检出」的边缘。
30 秒实验
- 把异常样本数从 25 改成 100,重跑,看检出率会不会变。
- 把正常数据的分布换成偏态(比如对数正态),看三条线还准不准。
- 想一想:漏检和误报,产线上哪个代价更大?为什么答案不唯一?
常见误区
- 「检出率越高越好」——往上提必然带更多误报。
- 「3σ 是行业标准,照用就行」——它假设正态,偏态数据下会失效。
- 「异常检测一上线就能抓住所有问题」——漂移小于三个标准差就抓不住。
自测三问(点开对答案)
1. 3σ、IQR、MAD 三条线分别用什么统计量? —— 均值和标准差、四分位数与四分位距、中位数与中位绝对偏差。 2. 为什么两个指标必须一起看? —— 调阈值时检出率和误报率此消彼长,只看一个必然误导。 3. 漂移小于多少时单变量阈值法基本失效? —— 大约三个标准差以内,本例 1.5σ 时检出率只有 0.04。产线之后上路:下一节做车道线检测,看看视觉感知怎么落到代码里。
- ☐ (本节完,下一节 4.2.5 自动驾驶:视觉感知、路况识别)