🧠 第四章 机器学习算法
📄 一句话概括

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 秒实验

  1. 把异常样本数从 25 改成 100,重跑,看检出率会不会变。
  2. 把正常数据的分布换成偏态(比如对数正态),看三条线还准不准。
  3. 想一想:漏检和误报,产线上哪个代价更大?为什么答案不唯一?

常见误区

  1. 「检出率越高越好」——往上提必然带更多误报。
  2. 「3σ 是行业标准,照用就行」——它假设正态,偏态数据下会失效。
  3. 「异常检测一上线就能抓住所有问题」——漂移小于三个标准差就抓不住。
自测三问(点开对答案) 1. 3σ、IQR、MAD 三条线分别用什么统计量? —— 均值和标准差、四分位数与四分位距、中位数与中位绝对偏差。 2. 为什么两个指标必须一起看? —— 调阈值时检出率和误报率此消彼长,只看一个必然误导。 3. 漂移小于多少时单变量阈值法基本失效? —— 大约三个标准差以内,本例 1.5σ 时检出率只有 0.04。

产线之后上路:下一节做车道线检测,看看视觉感知怎么落到代码里。

相关笔记